前回は1枚だけの投稿方法を書きました。
複数の画像を投稿する方法も開発者向けに公開されました。
方法については、いろいろな所で解説されていますが、その個人的備忘録みたいな感じでまとめておきます。
コードはC#です。

投稿方法

方法は公式のドキュメントに書いてあるので、詳しくはそちらを参照してください。
ここではザックリとした事と、実際に通るコードを書いておきます。

まず画像は

https://upload.twitter.com/1.1/media/upload.json
に1枚ずつアップロードします。
画像データはバイナリまたはBase64形式に対応しています。

実際のコードは以下の通り。この場合はバイナリでアップロードしています。
   1:  //oAuth認証文字列取得
   2:  string xml = Account.oAuthMediaRequest(oAuthTwitter.Method.POST, "https://upload.twitter.com/1.1/media/upload.json", "");
   3:  //送信するファイルのパス
   4:  string filePath = "C:\\test.jpg";
   5:  //文字コード
   6:  Encoding enc = Encoding.UTF8;
   7:  //WebRequestの作成
   8:  HttpWebRequest req = WebRequest.Create("https://upload.twitter.com/1.1/media/upload.json") as HttpWebRequest;
   9:  req.Host = "upload.twitter.com";
  10:  req.Headers.Add("Authorization", xml);
  11:  req.ServicePoint.Expect100Continue = false;
  12:  req.Method = oAuthTwitter.Method.POST.ToString();
  13:  //区切り文字列
  14:  string boundary = "tekitounamoji";
  15:  //ContentTypeを設定
  16:  req.ContentType = "multipart/form-data; boundary=" + boundary;
  17:  //POST送信するデータを作成
  18:  string postData = "";
  19:  postData = "--" + boundary + "\r\n" +
  20:       "Content-Disposition: form-data; name=\"media\"; filename=\"test\"\r\n" +
  21:       "Content-Type: image/jpeg\r\n" +
  22:       "Content-Transfer-Encoding: binary\r\n\r\n";
  23:  //バイト型配列に変換
  24:  byte[] startData = enc.GetBytes(postData);
  25:  postData = "\r\n--" + boundary + "--";
  26:  byte[] endData = enc.GetBytes(postData);
  27:  //送信するファイルを開く
  28:  FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
  29:  //POST送信するデータの長さを指定
  30:  req.ContentLength = startData.Length + endData.Length + fs.Length;
  31:  //データをPOST送信するためのStreamを取得
  32:  Stream reqStream = req.GetRequestStream();
  33:  //送信するデータを書き込む
  34:  reqStream.Write(startData, 0, startData.Length);
  35:  //ファイルの内容を送信
  36:  byte[] readData = new byte[0x1000];
  37:  int readSize = 0;
  38:  while (true)
  39:  {
  40:      readSize = fs.Read(readData, 0, readData.Length);
  41:      if (readSize == 0)
  42:          break;
  43:      reqStream.Write(readData, 0, readSize);
  44:  }
  45:  fs.Close();
  46:  reqStream.Write(endData, 0, endData.Length);
  47:  reqStream.Close();
  48:  //サーバーからの応答を受信するためのWebResponseを取得
  49:  HttpWebResponse res = (HttpWebResponse)req.GetResponse();
  50:  Stream resStream = res.GetResponseStream();
  51:  StreamReader sr = new StreamReader(resStream, enc);
  52:  string txt = sr.ReadToEnd();
  53:  //閉じる
  54:  sr.Close();
  55:  return txt;

アップロードに成功すると以下のような応答が帰ってきます。

{
   "media_id"
: 553639437322563584,
   "media_id_string"
: "553639437322563584",
   "size": 998865,
   "image"
: {
      
"w": 2234,
      "h"
: 1873,
      "image_type"
: "image/jpeg"
   }
}
この中のmedia_idを記憶しておきます。

最大で4枚の画像をアップロードしたら、あとは普通のツイートをするように
https://api.twitter.com/1.1/statuses/update.json
にメッセージをポストします。この時に先ほどのmedia_idを付加しておくと関連づけされて、画像付きツイートになります。
status=ツイートする内容&media_ids=000000000,11111111111,2222222222,333333333
というように。複数の時はカンマで区切って指定します。
これだけで、簡単に複数画像の投稿ができます。
一枚だけの時は、今まで通りでも、今回の方法でもどちらでもできます。

おわり

【参考文献】