phpで動いていたTwitter BotをGASに移行した話

2 min read読了の目安(約2200字

今までphpを使いレンタルサーバでtwitterのbotを動かしていましたが、Google Apps Script(以下GAS)で十分に要件を満たせる事を知り移行をしました。その時のメモになります。

当該のTwitterのBot仕様

  1. 決まった時間に呟く
  2. 画像アップロード
  3. 簡易なデータベースから抽出

以上の要件ですが、ほとんどGASとその連携機能で賄えるので移行を決めました。
GASはJavascriptベースの言語で(ほぼjsの書き方でOK)
php→gsの書き直しについては簡単なものなのでここでは割愛しておきます。

Twitter botを動かす時に便利だったもの

TwitterWebServiceというライブラリがとても便利でした。

https://gist.github.com/M-Igashi/750ab08718687d11bff6322b8d6f5d90
使い方については他にたくさん記事があるのでそちらをご確認ください。

現在、twitter APIの仕様自体が定まっていない節もありますが、今のところこのライブラリで問題なく動いています。

注意点としてはこのライブラリを動かすときは
Chrome V8 ランタイムを無効にする(プロパティで有効のチェックを外す)のを忘れない事です

google Driveとsheet連携も忘れずに

画像をgoogle Driveにアップして、画像IDをスプレッドシートに記載し、読み込んで処理する内容ですが、サービス連携でDriveとSheetを追加しないと使えません。
初回のみ認証が必要です

google Driveの画像IDの調べ方(新規ウィンドウで開いた場合のURL)

https://drive.google.com/file/d/[ここの文字列]/view

ファイル名から画像を得る方法もあるようですが、画像IDの方が確実と思われます

cronの代わりにトリガー

phpのレンタルサーバで運用していたときはcronを使っていましたが、今回はトリガーを使います。

こちらの設定で毎日9~10時ごろ実行するようになります。cronのように10時0分きっかりに実行とは行かないのですがbotの特性上問題ないのでこのままにしています。

より正確な時刻で実行したい時はこのような方法もあるようです

https://tonari-it.com/gas-trigger-set/

GASのタイムゾーン設定

テストをしてみると、トリガーは設定している時刻に正しく実行されていますがタイムスタンプを出力している時間がずれていました。これはGASがデフォルトで設定しているものが日本時間ではない事に起因しているようです。
参考

https://walking-elephant.blogspot.com/2021/01/gas.timezone.html

プロジェクト設定から
「appsscript.json」マニフェスト ファイルをエディタで表示する
にチェックしてエディタで編集できるようにする。timeZoneの項目を"Asia/Tokyo"に変更

{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  //以下略
  }
}

タイムスタンプ表示はformatDateがあるのでそれを使用

https://developers.google.com/apps-script/reference/utilities/utilities#formatDate(Date,String,String)
Utilities.formatDate( new Date(), 'JST', 'yyyy/MM/dd HH:mm');

これで時間表示も正しくできました。

まとめ

レンタルサーバに置いていたphpスクリプトを書き換えてGASにリプレイスしたメリット
無料で動くだけでなく、今までのスクリプト編集→ftpアップ→動作確認などの手間がなくなり直接スプレッドシートなどで変更追加できる事でメンテナンス性が高まった。巨大DBを使用するなどの大規模なものでない限りGASでほぼ代替できると思われます
デメリットは現状GASにバージョン管理が独特なところ
参考

https://qiita.com/naokishizuka/items/5169de1709793e7803df

以上、デメリットはあるもののGASで動かす用途としては小規模なものが多いのでバージョン管理はそこまで問題にならないと個人的には思います。何より無料でメンテナンス性が高いのが魅力です。
GASはgoogleの他サービスとの連携が強力なので今後も何か活用法を考えていきたいと思います。