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

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

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

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

Step一覧

Google Apps ScriptでTwitterに投稿する方法を4回に分けて掲載しています。

  1. Twitter API登録方法 (備忘録)
  2. Twitter APIとGoogle Apps Script 連携でツイート (備忘録)
  3. Google Apps ScriptでTwitterにスレッド(返信)投稿 (備忘録)
  4. Google Apps ScriptでTwitterに画像投稿 複数画像も! (備忘録) ← 今ココ

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で戻って助かった。

Comments

  1. From 川村宜央 on 2021.2.23 10:37

    画像のツイートが出来ました。ありがとうございます。感動しました。
    ぜひ、Web上のMP4(動画)をツイートする方法をご教授ください。

    • >川村様
      コメントありがとうございます。
      お役に立てたようでよかったです。
      動画ですが、私は動画やらないのでトライすらしていません。すみません。
      参考になりそうなURL見つけたので一応貼っておきます。
      (情報古いのでできるかはわからないです。)
      https://blog.tkouen.mydns.jp/wordpress/311

    • From 川村宜央 on 2021.3.5 15:46

      参考ページありがとうございます。
      記述の言語が何かもわからず、戸惑っているところです。
      よい報告はできないかもしれません。


Leave a Reply

*


CAPTCHA



Trackback URL