TwitterBotに自動リツイート機能を追加した(はいふりイベントBot)

 以前はいふりのイベント告知用Botを作成したが、今回それにはいふり公式アカウントとはいふりアプリ公式アカウントの自動リツイート機能を追加したので、それをまとめる。

no-known.hatenablog.com

 

 リツイート用の関数を作る

まずはじめに、GASでリツイートする機能を実装しなければならない。私のTwitterBotは以下のサイトのコードを丸パクリして作ったが、そのコードの中にはリツイート用の関数はなかった。

そこで、上記ソースコードを参考にしながらリツイート用の関数を作った。

// tweetのリツイート
Twitter.retweet = function(rtweet) {
  var ret = null;
  if (!rtweet.retweeted) {
    // すでにリツイート済みであればリツイートしない
    ret = this.api("statuses/retweet/"+rtweet.id_str, null);
  }

  return ret
};

 正直きじとらさんの作成したコードもJavascriptも完全に理解できていないので、もっと良い書き方があるのかもしれないが一旦これで。。。

syncer.jp

 上記のページを見てみると、リツイートの処理はツイート用や検索用と違ってPOSTのパラメータ指定ではなくリクエストURLに直接リツイートしたいIDを記載する形になるようだ。そのため、「statuses/retweet/」の後ろに直接リツイートしたいツイートのIDを繋げるようにしている。

実際に動かしてみる

リツイート用関数が出来たので、実際に動かしてみる。今回やりたいのは、

これだけである。

なんか簡単そうに見えるが、面倒だった。まず以前自分がどこまでのツイートをリツイートしていたかを覚えておかないといけない*1。それ自身はスプレッドシートに記録しておけばよいので簡単に実装できる*2

そして、以前リツイートしたID番号が出るまでツイートを順番にリツイートしていけばよいのだが、ちゃんとインデックスの0番から見ていかないといけないのでforeachやfor..inは使えない。なので20ツイートくらいまで見るようにしたが、今度はアカウント全体で20以下のツイートしかなかったりするのでそこを省く処理を入れないといけない・・・とかやってたらこんな感じになってしまった。

function haifuri_retweet() {
  var sheet = SpreadsheetApp.openById("XXXXXXXXXXXXXXXXXXXX");
  var consheet = sheet.getSheetByName('XXXXXXX');
  var res = Twitter.usertl("hai_furi");
  var old_id = consheet.getRange("A1").getValue();
  
  if (res.length > 0) {
    for(var i = 0;  i < 20;  i++) {
      if (res[i] == null) {
        break;
      }
      
      // 最新20件を取得し、以前RTしたIDが出てくるまでリツイート
      if (res[i].id_str === old_id) {
        break;
      } else {
        var data = Twitter.retweet(res[i]);
      }
    }
    
    // RTが終わったら、最新TweetのIDをスプレッドシートに反映
    consheet.getRange("A1").setValue(res[0].id_str);
  }
}

 

きっともっといいやり方がある・・・と思うのだが面倒になって考えるのを止めた。

なんにせよこれで対象アカウントのツイートを自動リツイートする処理ができた。あとはトリガを設定して1時間に1回ツイートを見に行くようにすればやりたいことは完了。

1点残念なのは、対象のはいふり公式とはいふりアプリ公式がなかなか呟いてくれないところである。

 

*1:リツイートの関数上一度リツイートしたものは無視するので、別に全ツイート対象にしてもいいがいちいち3000以上のツイートをさらってくるのは無駄なので止めた

*2:ここらへんGASって便利だね