GASとTwitter APIを使用してスプレッドシート内のテキストをランダムに自動投稿

Programming

この記事では、Twitter APIとGoogle App Script(通称:GAS)を使用して、予め設定しておいたテキストを定期的に自動ツイートするプログラムを紹介します。

プログラム自体は初心者でも3時間程度の学習で可能かと思います(APIの取得に関しては英語が出来ない人には難関です。)また、特別難しい環境構築などは一切必要無く、GoogleアカウントとTwitterアカウント(API)とJavascriptの知見があれば可能です。

興味がある方は挑戦してみて下さい。

Google App Scriptを開く

まずはGoogle App Scriptを開きましょう。

スプレッドシートの操作を行う場合は、そのスプレッドシートを開いた状態で、ツールスクリプトエディタをクリックして開いて下さい。(コンテナバインド型で開く。)

デフォルトでは「無題のプロジェクト」とのプロジェクト名、「コード.gs」とのファイル名で、以下のコードが入っていますが、これらは全て変更して大丈夫です。

function myFunction() {
  
}

今回は、この環境下で作業します。

Twitter APIでの準備

では続いてTwitter APIの準備を行います。
Twitter APIの申請方法は以下のような記事で確認して下さい。(最も苦境w)

2021年度版 Twitter API利用申請の例文からAPIキーの取得まで詳しく解説
TwitterAPIを利用するためのデベロッパー申請から、APIキー、トークン取得方法を詳しく解説します。

全て英語でやりとりする事になるので、Google翻訳するなりして頑張って下さい。因みに私の場合は英語があまりにも下手くそだったのか、何故か最終的に日本語でメールが来ました。(そのお陰で簡単でした。)

Twitter APIの申請が通ったら、API keyAPI Secret Keyが渡されるので何処かにメモしときましょう。


ではここからTwitter APIとGASを繋げる作業を行います。

まずは、コールバックURLをTwitter APIの設定側で設定しておきます。
今回はGASを使用するのでコールバックURLはGASのものを使用します。

GASの以下の設定にあるスクリプトIDをコピーして下さい。

コピーしたIDを以下の[スクリプトID]の部分に入れて下さい。これがコールバックURLになります。

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

そのURLをTwitter Developer Portalの以下のページのAuthentication settingsの設定内にあるCALLBACK URLSの項目に入れて保存する。(WEBSITE URLの設定項目は使用しないので適当なURLでOK。)
#エラーの原因1

その上のAuthentication settingsの上にあるApp permissionsの設定は「Read and Write」にしいて下さい。
#エラーの原因2

これでTwitter API側に準備はOKです。

GASでの準備

次にGAS側でも準備をしていきます。

まずは以下の2つのライブラリをGASに入れて下さい。

TwitterWebService
プロジェクトキー: 1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSXf2E_KBBPC3xTF

OAuth1
プロジェクトキー:1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s

ライブラリの導入の仕方は、以下のサービスのタブからプロジェクトキーを入れて検索を押せば目当てのものが出てきます。

続いては、プロジェクトの設定からChrome V8 ランタイムを有効にするのチェックを外します。その下の「appsscript.json」マニフェスト ファイルをエディタで表示するにチェックを付けます。

するとエディタ上に「appsscript.json」が増えています。内容が以下になっていれば、ここまではOKです。

{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
    "libraries": [
      {
        "userSymbol": "TwitterWebService",
        "version": "2",
        "libraryId": "[スクリプトIDが入ってる]"
      },
      {
        "userSymbol": "OAuth1",
        "version": "18",
        "libraryId": "[スクリプトIDが入ってる]"
      }
    ]
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "DEPRECATED_ES5"
}

これで両者の準備は完了です。

GASを使ってスプシに入力したテキストを自動投稿

では、いよいよコードを書いていきます。結論からいきますが、以下のコードで出来ます。
自己環境用に書き換えが必要です。またコードの実行中に色々とエラーが起きる可能性もあるので最後まで読んで下さい。)

// 認証用インスタンス
var twitter = TwitterWebService.getInstance(
  'ここにConsumer Keyを入れる',
  'ここにConsumer Secretを入れる'
);
// 認証
function authorize() {
  twitter.authorize();
}
// 認証解除
function reset() {
  twitter.reset();
}
// 認証後のコールバック
function authCallback(request) {
  return twitter.authCallback(request);
}
// 単体でツイートしてみる場合はここのコメントを解除して実行してみる
// var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ツイート"); // 「ツイート」はシート名
// var postMessageCell = sheetData.getRange(3, 3); // セルの位置。この場合は横から3番目上から3番目からスタート
// スプシからランダムにツイートを投稿
function postUpdateStatus() {
 var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ツイート"); //シート名
 var text = generatePostMessage(sh);
 var service  = twitter.getService();
 var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
   method: 'post',
   payload: { status: text }
 });
}
function generatePostMessage(sh){
 var row = sh.getLastRow();
 var column = sh.getLastColumn();
 var range = sh.getRange(3,2,row,column); //スタート地点
 var arrays = range.getValues();
 var max = arrays.length - 1;
 var rand = Math.floor(Math.random()*(max-1)+1);
 var text = arrays[rand][1];
 return text;
}

上記のコードを実行すると、以下のように予めスプレットシートに入力しておいたツイート内容が自動で投稿されるようになります。


まずは、上記のコードを自己環境用に書き換えて下さい。書き換える部分は以下です。

コード1行目〜5行目の以下にTwitter APIで初めに取得したAPI Keyを入れます。

// 認証用インスタンス
var twitter = TwitterWebService.getInstance(
  'ここにConsumer Keyを入れる',
  'ここにConsumer Secretを入れる'
);

次に、28行目にある「.getSheetByName(“ツイート”)」の「ツイート」部分を読み込んでいるスプレットシートのシート名にします。

var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ツイート"); //シート名
 var text = generatePostMessage(sh);

最後に、41行目の「sh.getRange(3,2,row,column)」の数字部分をスプレットシート内の投稿する部分の行と列を指定します。今回の場合はC2のセルからスタートなので3,2になってます。

var range = sh.getRange(3,2,row,column); //スタート地点

書き換えが完了したら、以下の順番で関数を実行します。

①のauthorizeを実行すると「危険です。アクセスの認証を承諾しますか?」みたいな事を言ったポップアップが出てくるので、構わず認証して下さい。

そのまま実行を続けると、次に以下のようなログが出てくるかと思います。
以下の部分のURLをコピーしてアクセスして下さい。(Twitterのアクセス認証ページです。)

以下のページにアクセスしたら「連携アプリの認証」をクリックして認証して下さい。

すると以下のように「Success」とだけ書かれたページが出てきます。こうなれば認証完了です。

ここまででエラーが多く起きるかと思います。その理由は大抵の場合は以下のTwitter API側でのAuthentication settingsApp permissionsが間違っているのかと思います。今一度確認してみて下さい。

エラーの原因1

エラーの原因2


そして②のpostUpdateMessage関数を実行すると自動ツイートされます。TwitterラベルがTwitter AIPのプロジェクト名になっていれば成功です。

この内容がツイートされたみたい

これで自動ツイートを実行するプログラムが完成です。最後にGASのタイマー設定(トリガー)を作成して終わりです。

時計アイコンをクリックしてトリガーを追加をクリックして下さい。

以下のポップアップが表示されたら、指定する関数をpostUpdateMessageにして下さい。その他は任意の設定で大丈夫です。

保存をしたら、一度関数を実行して下さい。(このトリガー設定は、初めの実行の時間が不明だから手動で行った方が確実。)

これで定期的に自動投稿されるプログラムの完成です。お疲れ様でした。

参考:https://qiita.com/akkey2475/items/ad190a507b4a7b7dc17c


以上が「GASとTwitter APIを使用してスプレッドシート内のテキストをランダムに自動投稿」でした。

これでTwitterの運用は半自動化出来て効率良くコンバージョン出来ます。
最難関はTwitter APIの申請部分ですが、そこを切り抜けたら簡単かと思いますので最後まで諦めずに挑戦してみて下さい。

タイトルとURLをコピーしました