GASでweb上の画像をtweetする方法

最終更新日

説明は,僕が分かる程度に詳しく.行き詰まったら他の資料も適宜参考にしてね.特にこのブログが詳しくて参考になると思う!

やろうぜ!

目次

大まかにこんな感じで作業しますよ.

  1. Twitter Developer アカウントを取得する ←省略
  2. API キーとかを取得 ←省略
  3. GAS で認証を通す ←詳しく!
  4. GAS でスクリプトを書く ←詳しく!

3 GASで認証を通す

Google スプレッドシートの スクリプトエディタリソース > ライブラリ から TwitterWebService.gs のライブラリを導入する.空の記入欄に次のプロジェクトキーをコピペしてライブラリを追加しましょう.2019年8月現在で最新のバージョンである バージョン 2 を僕は使ったけど,より新しいのがあればそのほうがいいのかも?

1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSXf2E_KBBPC3xTF

次に ファイル > プロジェクトのプロパティ から編集しているスクリプトのスクリプトIDを取得しましょう.そのスクリプトIDを使ってこんなURLを作ります.下に書かれてる スクリプトID という箇所を書き換えるんですよ.

https://script.google.com/macros/d/スクリプトID/usercallback

このURLを Twitter Developer で作成済みのアプリのコールバックURLに登録します.この記事では省略したけど,目次で言うところの 2 API キーとかを取得 の手順でアプリを作成してるはず.

ここまで来たら,次のスクリプトをコピペ.3行目と4行目にある API KeyAPI Secret Key2 API キーとかを取得 の手順でアプリを作成したときに生成されてるので,それを使う.

//認証用インスタンスの生成
var twitter = TwitterWebService.getInstance(
  'xxxxxxxxxx',//API Key
  'xxxxxxxxxx'//API secret key
);
 
//アプリを連携認証する
function authorize() {
  twitter.authorize();
}
 
//認証を解除する
function reset() {
  twitter.reset();
}
 
//認証後のコールバック
function authCallback(request) {
  return twitter.authCallback(request);
}

最後に authorize 関数を実行して Ctrl + Enter で (または 表示 > ログ から) コンソールを開いて出力されてる文字列を確認.そこにある https://api.twitter.com/oauth/authorize?oauth_token=**** みたいなURLにアクセスして,このアプリを認証したら完了!

4 GAS でスクリプトを書く

これは書くだけ.ちょっとまた清書したいけど,まずは動いたコードをそのまま載せます.この記事を参考に,僕がちょっと改変したスクリプトです.

var service        = twitter.getService();
var endPointStatus = 'https://api.twitter.com/1.1/statuses/update.json';
var endPointMedia  = 'https://upload.twitter.com/1.1/media/upload.json';


function mediaTweet(){ 

  //ツイート本文と画像のURL  
  var twText = "This is a sample.";
  var imgUrl = "https://sample.com/sample.jpg";
    
  //画像の取得
  var imgBlob = UrlFetchApp.fetch(imgUrl).getBlob();
  var img_64  = Utilities.base64Encode(imgBlob.getBytes());
  
  var img_option = { 
    'method' : "POST", 
    'payload': {
      'media_data': img_64
    } 
  };
  
  
  var image_upload = JSON.parse(service.fetch(endPointMedia, img_option)); 
  
  var sendoption = { 
    'status'   : twText, 
    'media_ids': image_upload['media_id_string']
  };

  service.fetch(endPointStatus, {method: 'post', payload: sendoption});
}

このスクリプトで mediaTweet を実行すれば,画像つきツイートを送ることができます!ちなみに上のスクリプトで編集すべき箇所は9行目と10行目ですよ.僕レベルの技術力の人を想定しているので,分かりやすく書くのです.

img_optionmedia_data を指定してBase64エンコードした画像データを送ってるけど,公式のドキュメントを見ると media を使えば生のバイナリーデータを送れるらしい. .getBlob() して .getBytes() して,それを Utilities.base64Encode() する… なんてい面倒くさいことをしなくても大丈夫そうに見えるんだけど… 僕の理解が間違ってるのか,微調整しても上手く行かなかった.

あとがき

コードはもう少し整理する (APIリクエストとか汚い感じがする) としても,実はこれではまだ僕の目的を達成していない.もう少しコードを追加しないと,僕がやりたいことが自動化されて嗚呼便利… というふうにならない!なのでこの記事はたぶん続きます.

これはオマケだけど,画像を付けずに文字だけのツイートをするならこれでいけますよ.簡単だね.

// ツイートを投稿
function postTweet() {
    
  var response = service.fetch(endPointUrl, {
    method : 'post',
    payload: {
      status: 'This is a sample tweet!'
    }
  });
}

2件のフィードバック

  1. ReferenceError: 「twitter」が定義されていません。(行 1、ファイル「コード」)
    ってなりました

コメントを残す

%d人のブロガーが「いいね」をつけました。