前回は Firebase の Cloud Functions をデプロイする手順、確認方法をまとめました。
今回はFirebase の Cloud 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」をクリックします。
「OAuth 2.0」と「OAuth 1.0a」を有効にします。
Type of Appで登録するアプリケーションのタイプを選択します。
今回は「Automated App or bot」を選択します。
アプリケーションの権限を変更します。
ツイートしたいので、「Read and write and Direct message」を選択します。
権限を変更した場合、各種キーとトークンを再払い出し(regenerate)してください。
権限を変更すると、古いキーとトークンでは動作しなくなります。
ご注意ください。
Twitteの権限の確認
Twitterの設定から確認できます。
- 「もっと見る」を選択
- 「設定とプライバシー」を選択
- 「セキュリティとアカウントアクセス」を選択
- 「アプリとセッション」を選択
- 「連携しているアプリ」を選択
- 作成したアプリを選択
- アクセス権を確認
アクセス権が「読み取り、書き込みとダイレクトメッセージ」となっていればOKです。
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」を選択します。
作成した関数名を選択し、権限タブを表示します。
権限の追加を選択します。
新しいプリンシパルに「AllUsers」を入力します。
ロールに「Cloud Functions 起動元」を選択します。
上記入力後、保存を選択します。
サンプルの実行
デプロイが成功すると、10分間隔で自動的にツイートされます。
すぐに実行したい場合
Firebaseのダッシュボードから、関数の「Cloud Scheduler で表示」を選択します。
Cloud Schedulerで「今すぐ実行」を選択します。
ハマったこと
当初は「twitter-v2」パッケージを使用する想定でした。
パッケージをインストールし、ツイートの取得は簡単に確認ができました。
しかし、認証エラーでツイートができない。
原因を探ってみました。
ネット上で情報を探す
第一のアプローチです。
まずはネット上で情報を探してみました。
しかし、そもそも「twitter-v2」の情報が少ない。
ツイートの取得の情報は出てくるが、それは私も確認できている!
次のアプローチに行きます。
Postmanで実行してみる
第二のアプローチです。
APIのテスト環境が整っているので実行してみました。
はい、問題なく実行できました。
ツイートもされています。
各種キーやトークンは問題なく使えるようです。
次のアプローチに行きます。
Postmanと各種キーとトークンが一致しているか確認する
第三のアプローチです。
各種項目の実装誤りで認証ができていないのではないか?
ツイートの取得でも同じキーやトークンを使用しており、問題ない。
実装誤りもないようです。
結論
状況として、「twitter-v2」では「GET」は実行できて、「POST」は実行できないようです。
情報収集と切り分けに時間がかかってしまいましたが、他パッケージで実装するという結論に至りました。
まとめ
本記事では、Firebase の Cloud Functionsを使い、Twitter botを作成してみました。
しかし、ソースコードに各種キーやトークン情報を直書きしているため、別の場所から読み出すようにしないとセキュリティ的にいけませんね。
次回は設定系や他のAPIを使ってみたいと思います。