サーバーレス・ツイッターボット構築


表題は流行の片仮名でキラキラ輝いてる感がありますが、現状でサーバー上のPHPを使ったタンブラーとツイッターを連携させたボットのプログラムを、Twitter API v2を使うのと同時にNodeJSに移植し作業環境で使っているM1 Mac miniで稼働させようという試みのお話です。

まずツイッターの開発者用ページに行って驚いたのが、その様子が随分と変わっていたことで、必須項目とされているものが空白のままでしたので、認証設定内にあるアプリのタイプや情報にあるコールバックURIを埋めました。サーバー上に置かないということから、次のようにしておきました。

OAuth 2.0になって認証設定が拡張されていた

次に任意のプロジェクト用ディレクトリを(ユーザーディレクトリ以下に)作り、それぞれのサービスの公式が公開しているパッケージを取得しインストールします。

ここで発生した問題は、両サービスの開発熱量に関係する記述方法、つまりサンプルコードにもあるように require を使うか import を使うかという点で、近代的な方を優先し後者に統一しましたので、package.json"type": "module" を追記します。

後は前回のようにツイートIDを取得する正規表現や処理方法など、PHPで使っていたものを流用して完成なのですが、若干変えた部分が短縮URLの拡張方法で、次の記事を参考に cURL を使っていた手法から request モジュールを import するようにして解決しました(が、既に非推奨なので再検討する必要があります)。
参考: Unshorten (expand) short URLs with Node.js

Twitter API v2 に関しては、エラー内容が詳細に返ってくるなど使い易くなっている一方で、成功した場合の戻り値が…で、調整を待ちつつ暫くは生暖かく見守るしかなさそうです。
参考: postman – Twitter API post a retweet (reply) – Stack Overflow

最後に定期実行として launchd で使う plist を記述し load し移行が終了です。前回はルート権限で /Library/LaunchDaemons からコンピュータ・スクリプト・フォルダ(/Library/Scripts)にあるシェルスクリプトを叩いてリモートサーバー上のPHPを呼んでいたものを、~/Library/LaunchAgents から直接 JS ファイルを実行するようにしました。これに応じてログファイル(StandardOutPathStandardErrorPath)も ~/Library/Logs 内に格納します。
参考: Macの「ターミナル」でのlaunchdを使ったスクリプトの管理 – Apple サポート (日本)

この作業検証途中で keepalivetrue にしてしまい、大量のリツイートが同時に飛んでいくというフォロワーの皆様には大変迷惑を掛けましたが、旧方式から脱却できて且つ新しい発見もあり、半日ほどの作業としては大変有意義でした。