Twitter改めXになったのが2023年ごろ
その時Twitter APIも有料化されました。
とはいえ無料プランでもそこそこ使えます。
▼ 無料プランはこういう内容
- 月当たり1500件まで投稿可能
- 日当たり50件まで投稿できる
- Botくらいなら作れそう…?
ということでBot作成を試してみました。
Node.js+Twitter API v2の手順を紹介します。
このページの目次
1.非スタンドアロンなTwitterアプリ作成
既にTwitter Developersを申請した前提で話します。
URL : https://developer.twitter.com/en/portal
Botを作るにはTwitterアプリが必要です。
その時、以下の点に注意してください。
- スタンドアロンな状態ではダメ
- 必ずプロジェクトに所属させること
これを忘れるとBotが動きません。
アプリがスタンドアロンであるか確認するには、 Projects & Apps => Overview のページを開いて Standalone Apps を見てください。そこに何も表示されてないならOKです。
▼ こういう状態ならOK
アプリは必ずプロジェクトに所属させてください。
▼ 例えば以下のように
上記画像では Prime number bot というプロジェクトを作成し、その下に Prime number bot というアプリを作成しました。これで Twitter API v2 へのアクセスが可能です。
Bot作成前の注意点はこれだけ
2.必須モジュールをnpmインストール
Node.jsでTwitter Botを作る場合…
必須となるモジュールは以下の通りです。
▼ 最低限必要なもの
- axios
- needle
- oauth-1.0a
▼ npmからインストール
1 2 3 |
npm install axios npm install needle npm install oauth-1.0a |
POSTリクエスト送信にaxios使います。
これは他モジュールでも代替可能です。
3.API key & API secret を定義
ここからNode.jsでのコード的な話です。
※ 全体コードは最後にまとめる
以下の2つを取得・定義します。
- API key (Consumer key)
- API secret (Consumer secret)
Twitter developerページから作成したアプリを開き Keys and tokens をクリック。そこに Consumer Keys があって Regenerate ボタンを押すと再生成できます。
それをNode.js上に定義します。
▼ 実際のコード例(各自で書き換え)
1 2 |
const consumer_key = 'キーを貼付け'; const consumer_secret = 'シークレットを貼付け'; |
あるいは環境変数を.envに定義して、
そこから取得する汎用的な書き方もできます。
▼ 環境変数から Key & Secret を取得
1 2 |
const consumer_key = process.env.TWITTER_API_KEY; const consumer_secret = process.env.TWITTER_API_SECRET; |
▼ envモジュールの使い方は次記事参照
ここまでで下準備は完了
4.トークンを要求/取得する
初めにトークンをTwitter APIに要求します。
▼ そのスニペットだけ抜き出したコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
async function requestToken() { const authHeader = oauth.toHeader(oauth.authorize({ url: requestTokenURL, method: 'POST' })); const res = await axios.post(requestTokenURL, {}, { headers: { Authorization: authHeader["Authorization"], 'content-type': 'text/json' } }); if (res.data) { const data = Object.fromEntries(new URLSearchParams(res.data)); return data; } else { throw new Error('Unsuccessful request'); } } |
これは全体のコードの一部分です。
最後に全体コード掲載するので心配無用です。
5.アクセストークンを取得する
そしたらアクセストークンを取得します。
これがTwitter APIの呼び出しに必須です。
▼ スニペットだけ抜き出したコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
async function accessToken({ oauth_token, oauth_token_secret }, verifier) { const authHeader = oauth.toHeader(oauth.authorize({ url: accessTokenURL, method: 'POST' })); const path = `https://api.twitter.com/oauth/access_token?oauth_verifier=${verifier}&oauth_token=${oauth_token}` const res = await axios.post(path, {}, { headers: { Authorization: authHeader["Authorization"], 'content-type': 'text/json' } }); if (res.data) { const data = Object.fromEntries(new URLSearchParams(res.data)); return data; } else { throw new Error('Cannot get an OAuth request token'); } } |
何度も書くけど、部分的なコードです。
上記コードに verifier という変数があります。ここはTwitter APIから発行された認証URLにアクセスし、その画面に表示されたコードを入力されたものが入ります。
今は意味不明と思うけど、気にしないでください。
6.Twitetr APIからツイート送信
いよいよBotでツイート送信してみます。
▼ スニペットだけ抜き出したコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
async function postTweet({ oauth_token, oauth_token_secret }) { const token = { key: oauth_token, secret: oauth_token_secret }; const authHeader = oauth.toHeader(oauth.authorize({ url: endpointURL, method: 'POST' }, token)); const res = await axios.post(endpointURL, data, { headers: { Authorization: authHeader["Authorization"], 'user-agent': "v2CreateTweetJS", 'content-type': "application/json", 'accept': "application/json" } }); if (res.body) { return res.body; } else { throw new Error('Unsuccessful request'); } } |
上記の endpointURL は次の内容です。
URL : https://api.twitter.com/2/tweets
ここにツイートしたい内容を送ることでポストできます。でも昔ほど手軽ではなく、ここまでのようにトーク・アクセストークンの取得が必要です。
かなり面倒くさかったです(-_-;)
全体コードの掲載と実行の流れ
ということで全体コードを掲載します。
▼ これがBot作成コードの全体コード
▼ 名前は index.js などとする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
const axios = require('axios'); const crypto = require('crypto'); const OAuth = require('oauth-1.0a'); const qs = require('querystring'); const readline = require('readline').createInterface({ input: process.stdin, output: process.stdout }); /// API key & secret const consumer_key = process.env.TWITTER_API_KEY; const consumer_secret = process.env.TWITTER_API_SECRET; /// ツイート内容 const data = { "text": "Bye Twitter.\n Hello X." }; const endpointURL = `https://api.twitter.com/2/tweets`; const requestTokenURL = 'https://api.twitter.com/oauth/request_token?oauth_callback=oob&x_auth_access_type=write'; const authorizeURL = new URL('https://api.twitter.com/oauth/authorize'); const accessTokenURL = 'https://api.twitter.com/oauth/access_token'; const oauth = OAuth({ consumer: { key: consumer_key, secret: consumer_secret }, signature_method: 'HMAC-SHA1', hash_function: (baseString, key) => crypto.createHmac('sha1', key).update(baseString).digest('base64') }); async function input(prompt) { return new Promise(async (resolve, reject) => { readline.question(prompt, (out) => { readline.close(); resolve(out); }); }); } /// トークン取得 async function requestToken() { const authHeader = oauth.toHeader(oauth.authorize({ url: requestTokenURL, method: 'POST' })); const res = await axios.post(requestTokenURL, {}, { headers: { Authorization: authHeader["Authorization"], 'content-type': 'text/json' } }); if (res.data) { const data = Object.fromEntries(new URLSearchParams(res.data)); return data; } else { throw new Error('Unsuccessful request'); } } /// アクセストークンを取得。 /// アクセストークンは繰り返し何度でも使える。 /// つまりBot作成ができるってこと async function accessToken({ oauth_token, oauth_token_secret }, verifier) { const authHeader = oauth.toHeader(oauth.authorize({ url: accessTokenURL, method: 'POST' })); const path = `https://api.twitter.com/oauth/access_token?oauth_verifier=${verifier}&oauth_token=${oauth_token}` const res = await axios.post(path, {}, { headers: { Authorization: authHeader["Authorization"], 'content-type': 'text/json' } }); if (res.data) { const data = Object.fromEntries(new URLSearchParams(res.data)); return data; } else { throw new Error('Cannot get an OAuth request token'); } } async function postTweet({ oauth_token, oauth_token_secret }) { const token = { key: oauth_token, secret: oauth_token_secret }; const authHeader = oauth.toHeader(oauth.authorize({ url: endpointURL, method: 'POST' }, token)); const res = await axios.post(endpointURL, data, { headers: { Authorization: authHeader["Authorization"], 'user-agent': "v2CreateTweetJS", 'content-type': "application/json", 'accept': "application/json" } }); if (res.data) { const data = Object.fromEntries(new URLSearchParams(res.data)); return data; } else { throw new Error('Unsuccessful request'); } } (async () => { try { /// トークン取得 const oAuthRequestToken = await requestToken(); authorizeURL.searchParams.append('oauth_token', oAuthRequestToken.oauth_token); /// 認証画面URLを表示。 /// アクセスするとPINコードが表示される。 console.log('Please go here and authorize:', authorizeURL.href); const pin = await input('Paste the PIN here: '); /// アクセストークンを取得 const oAuthAccessToken = await accessToken(oAuthRequestToken, pin.trim()); // Twitter APIからツイート送信 const response = await postTweet(oAuthAccessToken); console.log(response); } catch (e) { console.log(e); process.exit(-1); } process.exit(); })(); |
肝心なのはアクセストークン取得です。
上記コードだと oAuthAccessToken がそれですね。これは繰り返し使えるので、実際の運用ではファイル・メモリなどに記憶させれば次回から認証なしでツイートできます。
重要なのはそこくらいかな
実際にBotをテスト実行してみた
実際に上記スクリプトを動かしてみます。
▼ index.jsを実行
1 |
node index.js |
▼ PINコード入力が求められる
1 2 3 |
>node index.js Please go here and authorize: https://api.twitter.com/oauth/authorize?oauth_token=7M32vwAAAAAA_xxxxxxxxxxxxxx Paste the PIN here: |
▼ URLにアクセスしてPINコード確認
▼ PIN入力後にTwitterAPIが実行される
1 2 3 4 5 6 7 8 |
Paste the PIN here: 4188691 { data: { edit_history_tweet_ids: [ '1724597688589848928' ], id: '1724597688589848928', text: 'Bye Twitter.\n Hello X.' } } |
▼ ツイート成功!
これがBot実行の流れです。
ここまで読んで「結局手動じゃない?」と思った人はよく見直してください。アクセストークンは何度でも使えるため、ファイル保存などすればBot運用できます。
Cronなどで定期実行するのが現実的かも
以上、Node.jsでTwitterボットを作りでした。