1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Google Cloud Functions で Twitter の定期投稿Botを作成

Last updated at Posted at 2022-01-11

#はじめに
Twitterに定期的に投稿するBotを作ってみたのでその記録。
Twitter APIはGoogle Cloud Functions 上でnode.jsで実装。
スケジューリングは Google Cloud Schedulerを利用した。
Cloud Schedulerからは直接Cloud Functions を起動できないので、間にGoogle Cloud Pub/Sub を挟んでいる。

####ポイント

  • Firebaseは利用しない(Firebaseが必須というような記事も見受けられるが誤解)
  • TypeScriptも利用しない(Cloud Functionsが未対応なので使用しない)

#Twitter APIの準備
TwitterのAPIを利用するにはAPIのキーが必要だがこれはTwitter Developer Potalで取得する。
この辺りは、こちらあたりの記事が参考になるかと思う。
参考 Twitter API を利用するには

注意しなくてはいけないのが、TwitterのAPIは申請初期状態では"Essential access"モードとなっていて、Tweetを読むことはでるが、書き込む(Tweetをする)ことはできない。
Elevated access を申請すると、書き込みができるので、下記から申請が必要となる。
https://developer.twitter.com/en/portal/products/elevated
参考 Twitter開発者ブログ - 新しい開発者プラットフォームでTwitterの未来を構築

また、OAuth1.0aを使用するので、Developer portalのアプリの User authentication settings からOAuth1.0aを使用可能としておく。
image.png

APIの説明

今回はnode.jsを利用するので、APIのドキュメントは下記参照。

今回の様にユーザーに代わってTweetを行うときはUser-wide authenticationという認証フローが必要となる。
必要なキーは下記の4つ。

  • Access Token
  • Access Secret
  • Client ID
  • Client Secret
    それぞれ、Twitter Developer PoratalのアプリのKeys and tokensから取得する
    image.png

#Google Pub/Subの準備
Cloud Functionsは通常はHTTPリクエストをトリガーとするとが、Cloud Pub/Subをトリガーとすることもできる。
Pub/Subを使用できるように、あらかじめトピックを作っておく。
とりあえずトピックさえあればよいので、適当な名前で作ればよい。
サブスクリプションは、Cloud Functionで自動的に作成されるため、「デフォルトのサブスクリプションを追加する」のチェックは外しておく
image.png

#Google Cloud Functions のコーディング
Cloud FunctionsはPub/Subをトリガーとして起動するように作成する。
Cloud ConsoleでCloud Functionsを選択し、関数を作成する際「トリガーのタイプ」に"Cloud Pub/Sub"を選択し、事前に作成したトピックを選択すればよい。
image.png

Tweetするだけならソースは非常に簡単だ。
TwitterApiオブジェクトをインスタンス化する際に、事前に取得した4つのキーを与えれば認証することができる。
あとは、v1.tweet メソッドを呼び出すだけである。

index.js
    const { TwitterApi } = require('twitter-api-v2');

    const client = new TwitterApi({
        appKey:'<Client ID>', 
        appSecret:'<Client Secret>', 
        accessToken:'<Access Token>', 
        accessSecret:'<Access Secret>'});

    exports.main = async (message, context) => {
        client.v1.tweet(<Tweet本文>);
    };

TwitterのAPIのドキュメントのサンプルはTypeScriptになっているが、Cloud FunctionsはTypeScript非対応となっている。
しかしながら、API自体はCommonJSに対応しているので、上記の様にrequire構文でインポートすれば使用可能。
なお、Pub/Subをトリガーとして関数は引数として二つの引数(messageとcontext)から渡される。
今回は使用してないがパブリッシュされたメッセージ本文はmessage引数から取得できる。詳しくは、下記ドキュメントを参照。
Cloud Pub/Sub のチュートリアル

package.jsonへTwitter APIへの依存関係の追記をお忘れなく。

package.json
  "dependencies": {
    "twitter-api-v2": "^1.8.0"
  }

デプロイを実行すると、Cloud Functionが作成され、同時にCloud Pub/Subのサブスクリプションも自動的に作成される。
ここで、一度「関数のテスト」を実行して動作を確認しておく。

#Google Cloud Scheduler の設定
最後はスケジューラーを設定すれば完成。
スケジューラでCloud Pub/Subへ定期的にパブリッシュを行なえば、それをトリガーにCloud Functionsの関数が動くことになる。
設定自体は非常に簡単で、Cloud ConsoleでCloud Schedulerを表示し、Jobを作成するだけ。
まずは「スケジュールを定義」する
「頻度」の部分にcron形式でスケジュールを記述する。下の画像の例は毎時20時に実行する例。
image.png
その他の例は下記ページあたりを参照
参照 cron

次に「実行内容を構成する」のところでターゲットタイプに「Pub/Sub」を選択し、事前に作成しておいたトピックを指定すればよい。
image.png
メッセージ本文は使っていないのだが、必須項目なので何か適当な文字を入力しておく。

ジョブを作成後、「今すぐ実行」をクリックすればAPI経由でTweetされるはずである。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?