【 Firebase 】Cloud Functionsで Twitter Botを作る方法を解説!

スポンサーリンク

前回は FirebaseCloud Functions をデプロイする手順、確認方法をまとめました。
今回はFirebaseCloud Functionsを使い、Twitter Botを作ってみたいと思います。
自動でツイートしてみたい、いいねをしてみたい方は本記事を参考にしてみてください。

環境が整っていない方はこちらをご覧ください。

スポンサーリンク

Functionsを使う際の注意事項

Functionsは無料プランのSparkでは使えません。
従量課金のBlazeプランにする必要があります。

事前にnpm(Node.js)を使える環境にする必要があります。

スポンサーリンク

Twitte Developer Portalの設定

App作成時に権限を変更している場合、本手順は不要です。

Twitterにログインした状態でTwitter Developer Portalへアクセスします。
https://developer.twitter.com/en/apps/

Twitter APIの利用申請ができていない方はこちらで手順を解説しています。

それでは早速設定していきましょう。
まずはUser authentication settingsの「Set up」をクリックします。

twitter

OAuth 2.0」と「OAuth 1.0a」を有効にします。

Type of Appで登録するアプリケーションのタイプを選択します。
今回は「Automated App or bot」を選択します。

twitter

アプリケーションの権限を変更します。
ツイートしたいので、「Read and write and Direct message」を選択します。

twitter

権限を変更した場合、各種キーとトークンを再払い出し(regenerate)してください。
権限を変更すると、古いキーとトークンでは動作しなくなります。
ご注意ください。

スポンサーリンク

Twitteの権限の確認

Twitterの設定から確認できます。

  1. 「もっと見る」を選択
  2. 「設定とプライバシー」を選択
  3. 「セキュリティとアカウントアクセス」を選択
  4. 「アプリとセッション」を選択
  5. 「連携しているアプリ」を選択
  6. 作成したアプリを選択
  7. アクセス権を確認

アクセス権が「読み取り、書き込みとダイレクトメッセージ」となっていればOKです。

twitter

Twitter botの環境構築

パッケージのインストール

今回は「twitter-api-v2」を使用してみます。
似たようなパッケージで「twitter-v2」がありますが、うまく動作しませんでした。
後半で解説します。

functionsに「twitter-api-v2」をインストールします。

npm install twitter-api-v2

自動ツイートのサンプル

サンプルでできること
  • 10分間隔で”test 時間(ミリ秒)”をツイート
    ※同じ内容で連続ツイートができないため、ミリ秒を付け足しています

前回作成したindex.jsに追記 or 置き換えをします。
私の環境(Mac)だと「Users/xxx/functions/index.js」です。

index.jsの中身を以下に書き換えます。
各種キーとトークンは適宜置き換えてください。

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access Firestore.
const admin = require('firebase-admin');
admin.initializeApp();

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

const twitterClient = new TwitterApi({
  appKey: 'YOUR_CONSUMER_KEY',
  appSecret: 'YOUR_CONSUMER_SECRET',
  accessToken: 'YOUR_ACCESS_TOKEY_KEY',
  accessSecret: 'YOUR_ACCESS_TOKEY_SECRET',
});

exports.doTweet = functions.pubsub.schedule('every 10 minutes').onRun(async (context) => {
    twitterClient.v2.tweet('test' + ' ' + Date.now());
});

関数のデプロイ

今回追加した関数のみのデプロイ

「–only」オプションを付けることによって、1関数のみデプロイすることが可能です。
今回追加した「doTweet」関数のみデプロイしてみましょう。

firebase deploy --only functions:doTweet

全関数のデプロイ

オプションを付けずにコマンドを入力することにより、「index.js」にある関数全てがデプロイされます。
変更していない関数も全てデプロイし直すため、時間がかかります。

firebase deploy

Google Cloud Platformの設定

Cloud Functionsの関数に関して、未認証の場合はデフォルトで呼び出しできない用になっているようです。

Google Cloud Platformで設定を行います。
https://console.cloud.google.com/?hl=ja

Firebaseでプロジェクトを作成したユーザでログインします。
検索バーで「functions」と検索し、「Cloud Functions」を選択します。

twitter

作成した関数名を選択し、権限タブを表示します。

twitter

権限の追加を選択します。
新しいプリンシパルに「AllUsers」を入力します。
ロールに「Cloud Functions 起動元」を選択します。
上記入力後、保存を選択します。

twitter

サンプルの実行

デプロイが成功すると、10分間隔で自動的にツイートされます。

twitter

すぐに実行したい場合

Firebaseのダッシュボードから、関数の「Cloud Scheduler で表示」を選択します。

twitter

Cloud Schedulerで「今すぐ実行」を選択します。

ハマったこと

当初は「twitter-v2」パッケージを使用する想定でした。
パッケージをインストールし、ツイートの取得は簡単に確認ができました。

しかし、認証エラーでツイートができない。

原因を探ってみました。

ネット上で情報を探す

第一のアプローチです。
まずはネット上で情報を探してみました。
しかし、そもそも「twitter-v2」の情報が少ない。
ツイートの取得の情報は出てくるが、それは私も確認できている!
次のアプローチに行きます。

Postmanで実行してみる

第二のアプローチです。
APIのテスト環境が整っているので実行してみました。

twitter

はい、問題なく実行できました。
ツイートもされています。

各種キーやトークンは問題なく使えるようです。

次のアプローチに行きます。

Postmanと各種キーとトークンが一致しているか確認する

第三のアプローチです。
各種項目の実装誤りで認証ができていないのではないか?
ツイートの取得でも同じキーやトークンを使用しており、問題ない。
実装誤りもないようです。

結論

状況として、「twitter-v2」では「GET」は実行できて、「POST」は実行できないようです。
情報収集と切り分けに時間がかかってしまいましたが、他パッケージで実装するという結論に至りました。

まとめ

本記事では、FirebaseCloud Functionsを使い、Twitter botを作成してみました。
しかし、ソースコードに各種キーやトークン情報を直書きしているため、別の場所から読み出すようにしないとセキュリティ的にいけませんね。
次回は設定系や他のAPIを使ってみたいと思います。