Noël Café : Blog

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

Instagramの内容をTwitterにGASを使って自動投稿(複数画像OK!)

IFTTT無料範囲減対応に関する備忘録とhow to。
これでひとまず最後になります。

前回Instagram APIの設定をGoogle Apps Script (GAS)でやりました。
その設定(トークン)を使用してInstagramに投稿した内容を
Twitterに投稿したいと思います。


今回やりたいこと

  1. Instagramで投稿した内容, URLをTwitterに投稿
  2. 画像も投稿する
  3. 複数画像も対応する
  4. 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点です。

  1. 複数投稿時はmedia_typeがCAROUSEL_ALBUMになること
  2. 複数投稿時の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

*


CAPTCHA



Trackback URL