IFTTT無料範囲減対応に関する備忘録。
まだまだいきます。
Twitter投稿編はこれで最後(のはず)。
画像を投稿します。複数画像も。5枚以上はスレッドにして対応します。
Step一覧
Google Apps ScriptでTwitterに投稿する方法を4回に分けて掲載しています。
- Twitter API登録方法 (備忘録)
- Twitter APIとGoogle Apps Script 連携でツイート (備忘録)
- Google Apps ScriptでTwitterにスレッド(返信)投稿 (備忘録)
- 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でweb上の画像をtweetする方法 at 回れ右の内輪差
- GASでTwitterに画像を投稿するだけ at Qiita
- 【Python】Twitter apiを使って複数画像を投稿する at 情報学部大学生のダラダラ日記
- 【爆速】自作のTwitterBotを簡単に作るライブラリを作った話【初心者向け】 at すずきライフ
- 自作のTwitterBotでGoogleドライブの画像をアップロードする方法 at すずきライフ
この中にはGASでないものや、TwitterWebServiceを使用していないものもあります。
余談
複数画像については探すの苦戦しました…。
公式が重くてほとんど見ていないし(笑)。
あと、5枚以上のスクリプト作る時に、
img_urls配列を短くするのを忘れて一度無限ループをして
twitter止めてしまいました…。
すみません…。
こういう時は連続投稿させずに、次の投稿まで○秒とか間を置くようにして
テストしないとまずいですね….
教訓です。
それにしても、reCAPTCHAとSMSで戻って助かった。
画像のツイートが出来ました。ありがとうございます。感動しました。
ぜひ、Web上のMP4(動画)をツイートする方法をご教授ください。
>川村様
コメントありがとうございます。
お役に立てたようでよかったです。
動画ですが、私は動画やらないのでトライすらしていません。すみません。
参考になりそうなURL見つけたので一応貼っておきます。
(情報古いのでできるかはわからないです。)
https://blog.tkouen.mydns.jp/wordpress/311
参考ページありがとうございます。
記述の言語が何かもわからず、戸惑っているところです。
よい報告はできないかもしれません。