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”: “…”
}
}
投稿例
Reference
実は言うほどリファレンスがない(笑)。
というのもメモしていたURLリストがどっかに行ってしまいました…
余談
これにてIFTTT対応は終了です。
長かったー(笑)。
途中からコピペだけではどうにもならなくなり、
それなりに試行錯誤しました。
結果、今までずっとできなくて悩んでいた
Instagramの複数画像対応もできるようになったのでよかったかと。
以前の投稿にも書いたと思いますが、
Facebook Pageへの投稿をAPIで行うのはやめました。
Facebookの承認、Twitterよりずっと面倒なのでね。
身分証確認とか流石に趣味の領域を超えてしまいますわ。
とりあえずここまででIFTTTのスクリプトは3個に減らせました。
だから、目的達成です。
久しぶりにBlog多量に書きました。
BlogというかWordPress自体をもう少しカスタマイズしたいとか
今回書いたものも少し書き直したいとかあります。
少しずつボチボチやりたいと思います。
Leave a Reply