Noël Café : Blog

Noëlの公開備忘録とひとりごと。コメント・トラックバックご自由に

Google Apps ScriptでTwitterに画像投稿 複数画像も! (備忘録)

IFTTT無料範囲減対応に関する備忘録。
まだまだいきます。

Twitter投稿編はこれで最後(のはず)。
画像を投稿します。複数画像も。5枚以上はスレッドにして対応します。


POINT

  • 画像は事前にmedia-updateでアップロード
  • media_id取得時はmedia_id_stringを使用
  • 返信は投稿時payloadにmedia_idで画像(メディア)を指定
  • 複数画像はmedia_idをカンマでつなげて文字列にしてから投稿

GAS スクリプト

前回作成した返信機能付きpost_tweet関数を使用します。
今回も引き続きライブラリTwitterWebServiceを使用します。

引数をmsg(投稿する文章), re_id(返信元のツイートID), img_urls(画像のURL配列)、
戻り値を今回投稿したツイートIDとします。

エンドポイントは今回から事前に変数に設定しています。

// twitterエンドポイントURL
var tw_endpoint_statuses = "https://api.twitter.com/1.1/statuses/update.json";
var tw_enpoint_media = "https://upload.twitter.com/1.1/media/upload.json";


// twitterへ投稿
// 返り値はツイートした投稿のID
function post_tweet(msg, re_id, img_urls){
  var service  = twitter.getService(); //TwitterWebServiceのインスタンス
  
  var img_ids = [];
  
  if(img_urls.length > 4){
    // 5枚以上ある時は分割して投稿。最初の投稿の返信(スレッド)になる。文章は同じ。*1
    var img_urls_now = img_urls.splice(0,4);
    var tw_id = post_tweet(msg, re_id, img_urls_now);
    tw_id = post_tweet(msg, tw_id, img_urls);
    return tw_id;
  }else if(img_urls){
    // 画像が4枚以下の場合は順番にエンコード→アップロードする。*2
    for(var i = 0; i < img_urls.length; i++){
      var img_blob = UrlFetchApp.fetch(img_urls[i]).getBlob();
      var img_64 = Utilities.base64Encode(img_blob.getBytes());
      var img_upload = service.fetch(
        tw_enpoint_media, { 
          'method' : "POST", 
          'payload': { 'media_data': img_64 } 
        }
      ); 
      // media_idをimg_idsに格納。
      img_ids[i] = JSON.parse(img_upload).media_id_string;
    }
  }
  
  // ツイート
  var response = service.fetch(tw_endpoint_statuses, {
    method: "post",
    payload: {
      'status' : msg,
      'in_reply_to_status_id' : re_id, // 返信するツイートID
      'media_ids' : img_ids.join(',')  // すでにアップロードした画像のid(カンマ区切りで結合) *3
    }
  });
  
  tw_id = JSON.parse(response).id_str;

  return tw_id;
  
}

*1
5枚以上画像がある場合の対応
同じ関数(post_twitter)を呼び出すのは良くない気もするけど、
スクリプトが単純になるので。
5枚以上の場合はスレッド(返信)になります。
最後の投稿のIDが最終的に返り値になります。

*2
画像を投稿する場合は、文章を投稿する前に、画像をアップロードします。
画像をBlobを経由してBase64に変換させ(中身については私はよくわかっていないw)
media/upload.jsonにPOST。
media_id_stringを取得。
前回と同じくmedia_idではダメ(数値の大きさの問題)。

*3
文章を投稿する時に、media-idsで画像データ(というかID)を投稿。
複数画像の時はカンマ区切りの文字列にする(配列のままはダメなはず)。
空の場合は文章のみ投稿される(模様)。
今回も面倒なので条件分岐なしでw

長かったですが、これでtwitter投稿の関数作成はこれで終わりです。
これを使って、Blog投稿お知らせやInstagramを自動投稿していきたいと思います。

Reference

この中にはGASでないものや、TwitterWebServiceを使用していないものもあります。

余談

複数画像については探すの苦戦しました...。
公式が重くてほとんど見ていないし(笑)。

あと、5枚以上のスクリプト作る時に、
img_urls配列を短くするのを忘れて一度無限ループをして
twitter止めてしまいました...。
すみません...。
こういう時は連続投稿させずに、次の投稿まで○秒とか間を置くようにして
テストしないとまずいですね....
教訓です。
それにしても、reCAPTCHAとSMSで戻って助かった。

Leave a Reply

*


CAPTCHA



Trackback URL