IFTTT無料範囲減対応に関する備忘録とhow to。
これでひとまず最後になります。
前回Instagram APIの設定をGoogle Apps Script (GAS)でやりました。
その設定(トークン)を使用してInstagramに投稿した内容を
Twitterに投稿したいと思います。
今回やりたいこと
- Instagramで投稿した内容, URLをTwitterに投稿
- 画像も投稿する
- 複数画像も対応する
- Instagram APIは基本表示(Basic Display)で
1はInstagramの公式投稿からできますが、
Insta.の仕様でTwitterに画像のプレビューは投稿されません。
2の画像投稿すれば1の問題元を解決できます。
これはIFTTTを使ってできますが複数画像投稿時は1枚目の画像しか対応できません。
3をすることで問題解決します。
これをGASを使用して実施します。
GAS Script
先に手っ取り早くスクリプト載せます。
前回のスクリプトでPropertiesServiceに入れたinsta_token, insta_useridを使う前提です。
以前の投稿「Google Apps ScriptでTwitterに画像投稿 複数画像も! (備忘録)」にあるスクリプトもそのまま使います。
下はInstagram周りのスクリプトのみです。
Instagram(Facebook)アプリのほうは開発中のままで大丈夫です。
function insta2twitter(start_time, end_time) { var insta_token = PropertiesService.getScriptProperties().getProperty("insta_token"); var insta_userid = PropertiesService.getScriptProperties().getProperty("insta_userid"); var insta_json_url = "https://graph.instagram.com/" + insta_userid + "/media?fields=id,caption,permalink,media_type,media_url,timestamp,children%7Bid,media_url,media_type%7D&access_token=" + insta_token; // json取得 var json = UrlFetchApp.fetch(insta_json_url).getContentText(); var json_data = JSON.parse(json); // 古い投稿から処理(instaは新しい順に並んでいるので逆順) for(var i = json_data.data.length - 1; i >= 0; i--){ // 発行日取得 var pub_date = new Date(json_data.data[i].timestamp); // start_timeからend_timeになるまでの投稿のみ if(pub_date.getTime() >= start_time.getTime() && pub_date.getTime() < end_time.getTime()){ // キャプションをmy_message(twitterの投稿内容にする)に格納 var my_message = json_data.data[i].caption; // 文字数120以上の場合は丸める if(json_data.data[i].caption.length > 120){ my_message = json_data.data[i].caption.substr(0, 100) + '...'; }else{ my_message = json_data.data[i].caption; } my_message = my_message + "\r\n" + json_data.data[i].permalink; // img_urls投稿した画像のURLを入れる配列 var img_urls = []; if(json_data.data[i].media_type == "CAROUSEL_ALBUM"){ // 複数投稿のとき for(var j = 0; j < json_data.data[i].children.data.length; j++){ img_urls.push(json_data.data[i].children.data[j].media_url); } }else{ // 単一投稿のとき img_urls.push(json_data.data[i].media_url); } post_tweet(my_message, 0, img_urls) } } }
ざっくり解説すると、
最近の自分のInstagramの投稿を呼び出してJSON形式で取得。
そこから必要なデータを取り出しているだけです。
写真はURLを取得しているだけです。
以前作成したpost_tweet関数に投稿文と写真のURL(複数の場合は複数)を渡しています。
POINT
ここでポイントなのは、以下の2点です。
- 複数投稿時はmedia_typeがCAROUSEL_ALBUMになること
- 複数投稿時のmedia_urlはchildren.dataの中にあること
Instagramにリクエスト(GET)を送る時の構文は以下になります。
複数投稿の可能性があるのでchildrenも入れます。
childrenの中にid, media_url, media_typeがあります。
↓リクエストURL
function insta2twitter(start_time, end_time) { var insta_json_url = "https://graph.instagram.com/" + insta_userid + "/media?fields=id,caption,permalink,media_type,media_url,timestamp,children%7Bid,media_url,media_type%7D&access_token=" + insta_token;
↓レスポンス
{ "data": [ { "id": "ID", "caption": "キャプション", "permalink": "投稿のURL", "media_type": "IMAGE", "media_url": "画像URL", "timestamp": "投稿日時" }, { "id": "ID", "caption": "キャプション", "permalink": "投稿のURL", "media_type": "CAROUSEL_ALBUM", "media_url": "1枚目画像URL", "timestamp": "投稿日時" "children": { "data": [ { "id": "1枚目の画像ID", "media_url": "1枚目画像URL", "media_type": "IMAGE" }, { "id": "2枚目の画像ID", "media_url": "2枚目画像URL", "media_type": "IMAGE" }, ... ] } }, ... ], "paging": { "cursors": { "before": "...", "after": "..." }, "next": "..." } }
投稿例
https://twitter.com/noelcafe/status/1317439955669581824
Reference
実は言うほどリファレンスがない(笑)。
というのもメモしていたURLリストがどっかに行ってしまいました...
余談
これにてIFTTT対応は終了です。
長かったー(笑)。
途中からコピペだけではどうにもならなくなり、
それなりに試行錯誤しました。
結果、今までずっとできなくて悩んでいた
Instagramの複数画像対応もできるようになったのでよかったかと。
以前の投稿にも書いたと思いますが、
Facebook Pageへの投稿をAPIで行うのはやめました。
Facebookの承認、Twitterよりずっと面倒なのでね。
身分証確認とか流石に趣味の領域を超えてしまいますわ。
とりあえずここまででIFTTTのスクリプトは3個に減らせました。
だから、目的達成です。
久しぶりにBlog多量に書きました。
BlogというかWordPress自体をもう少しカスタマイズしたいとか
今回書いたものも少し書き直したいとかあります。
少しずつボチボチやりたいと思います。
Leave a Reply