Twitterに自動投稿するbotをGoogle App Scriptで自作する #2

 Twitterに自動投稿するbotをGoogle App Scriptで自作する #2
の続きです。前回の投稿で、まっさらな状態からスタートして、
・Twitter APIの利用開始
・Google App Scriptの初期設定
・Twitterとの連携
・お試し投稿
まで進めました。


今回は、個々のツイートを自動でできるようにスクリプトを変えていきます。

具体的には、SpreadSheet上のTweetリストを元に、ランダムに定期的に投稿する、と言うことをやっていきます。これ自体は既存のTwitter連携のサービスでも出来そうなものですが、リンクが入っているとキャンセルされたりとか、細かい時間設定ができなかったりと色々不便もあるので、一度GASで構築してしまうととても便利です。

まず、大前提ですが、Google App Script(GAS)は、Javascript と言う言語を拡張したものです。ので、 何か困ったときはJavascriptのヘルプサイトを調べるとわかることがたくさんあります。もちろん、Google App Scriptそのもので調べても出てくる情報はありますが、世の中にはJavascript関連のヘルプサイトの方が圧倒的に多いです。困ったときは"Javascript 関数"とかで調べると良いでしょう。

それでは、早速ですが、作業に入っていきます。

1.SpreadSheetの準備をする

RandomTweetListと言う名前のシートを作成した様子

 まずはSpreadSheet上に、新規シートを作成します。シート名も決めておきましょう。今後の拡張性を考えるとSheet1のままではなく、何か固有の名前を付けることをおススメします。ここでは、RandomTweetListと言うシートを作成します。

 続いて、Tweet候補の文を用意します。何でもよいですが、140文字以内にしましょう。ランダムに表示するので複数用意しておきます。

Tweet候補の文を記載した様子


2.SpreadSheetの情報をGASに読み込む

 既にGASでSpreadSheetの情報を読み込み編集したことがある人はここは飛ばしてください。

 試しに、下記のようなscriptを記載してみてください。

 

  function AutoTweetAll() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('RandomTweetList');
  var msg = sheet.getRange(1, 1).getValue();
  
  console.log(msg);
  }

1のプロセスで、図と同じ内容を記載していた場合は、scriptのログウインドウに「おはようございます。」と表示されるはずです。

順番にスクリプトの説明をします。

2行目の部分は、getSheetByNameの中でRandomTweetListと言うシートを呼び出して、sheetと言う変数に格納しています。

3行目の部分は、RandomTweetListの格納されているsheetの中でgetRange(1,1)でセルの場所を取得(左から1列目、上から1行目)し、そこに記載されている内容をgetValue()で取得し、更にその値をmsgに格納しています。

5行目のconsole.logはスクリプトのログウインドウに表示をする関数で、ここではmsgに格納されている文字列を出力しています。

3.読み込んだ内容をtweetする

上記のスクリプトにtweetをするスクリプトを追記しても良いのですが、今後も再利用性を上げるために、別で「指定された文字列をtweetするスクリプト」を作成します。こんな感じになります。

// postMessageで受けた内容のツイートを投稿
function postTweetMessage(postMessage) {
  var service  = twitter.getService();
  var endPointUrl = 'https://api.twitter.com/1.1/statuses/update.json';
  var response = service.fetch(endPointUrl, {
    method: 'post',
    payload: {
      status: postMessage
    }
  });
  console.log("Tweetしました。by postTweetMessage");
}  

こちらも順番に説明します。

2行目は、関数の定義です、postTweetMessageと言う関数を定義していて、引数としてpostMessageを受け取ります。

3行目はtwitterのServiceを初期化しています。おまじないと思って設定してもらえれば良いです。

4行目はtwitterのendPointURLを定義しています。これもほぼおまじないです。

5~10行目でいよいよTweetを行います。3,4行目で定義されたサービスとendpointURLに'Post'を行います。何をpostするかと言うと、payloadとして定義されているもので、この場合、statusに入っているpostMessageです。

12行目はログとしてpostMessageが終わった際のメッセージをログに出力します。こちらは必須では無いですが、tweetしたことを表示します。
今後、色々な関数から呼び出されるときに確認しやすくするものです。

この関数は別の関数から呼び出されて初めて動くものなので、呼び出し元の関数を作成していきます。

4.ランダムでtweetする関数を作成する。

 さきほど作成したAutoTweetAllを改造していきます。

//Twitterに投稿するメッセージを作成する
function AutoTweetAll() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('RandomTweetList');
  var lastRow = sheet.getLastRow();
  
  //最終行までの中で、ランダムな行番号を算出する
  var row = Math.ceil(Math.random() * (lastRow));
  
  //ランダムに算出した行番号のタイトルとURLを取得
  var postMessage = sheet.getRange(row, 1).getValue();
  
  postTweetMessage(postMessage)
}

こちらも順番に説明をしていきます。

4行目が新しく追加されています。sheet.getLastRow()では、選択したシートの中でセルに何かしらの値が入っている一番下の行を取得します。今後ランダムにtweetする内容を増やす可能性がありますので、行の追加に自動で対応できるようにするものです。

7行目はランダムに行番号を作成しています。Math.random()は0以上1未満の数字をランダムに出力します。これに、先ほど取得したLastRowを掛け合わせることで最終行までの中でランダムな数字を作り上げます。このままだと少数のままですので、 Math.ceil関数に入れることで切り上げて整数化し、それをrowと言う変数に格納しています。

 10行目では、getRangeの中に7行目で作成したrowの値を入れることで、row行目、1列目の値をpostMessageに格納しています。

12行目では、3のプロセスで作成した postTweetMessage関数を呼び出し、引数として10行目で作成したpostMessage変数を入力しています。

全て入力出来たら保存をして、AutoTweetAllを実行しましょう。

以上により、ランダムにSpreadSheetにある文字列の中からtweetができたかと思います。

5.自動でスクリプトを起動する

このままでは自動で起動しなければいけないので自動でスクリプトを起動する設定をします。

GASでは自動でスクリプトを起動するときに「トリガー」と言う機能を使います。

トリガーの設定場所

 トリガーの画面を起動すると右下に青い「トリガーを追加」と言うボタンが現れますのでそれをクリックします。


ここでは、"イベントのソースを選択"で"時間主導型"、"時間ベースのトリガーのタイプを選択"で"時間ベースのタイマー"、"時間の感覚を選択"で"1時間おき"を選択します。

こうすると、1時間おきにランダムにtweetを行います。

ここまでで一通り終わりですが、少しエラーが出たり、もっと改造したいと思う部分があるので、次の記事でmこのボットのレベルアップを進めていきたいと思います。

コメント