Twitterで自動ツイートbotを作りたい(Twitter API v2)【#1】
作成日時: 2022/08/25
更新日時: 2023/07/12
# 追記1
Twitter APIの有料化に伴い、フリープランで下記の検索用エンドポイント(`/search/recent`)は使用不可になりました(2023/07/12現在)。
なので本記事はBasic以上のプランの方が対象になりますが、Freeプランの方でも雰囲気は掴めるかと思います。。
# はじめに
成果物
↓
[自動でポケモンの名前呟くbot](https://haroot.net/poke/bot)
# Twitter APIとは
※API(Application Programming Interface)に明るくない人向けの説明
Twitter APIとは、簡単に言うとTwitterをプログラムから動かす(ツイートしたりいいねしたり検索したりフォローしたり)するための仕組みです。
例えばツイートをする場合、普段は
①Twitterを開く
②ツイートボタンを押す
のように、Twitterのアプリやweb上でしかツイートは出来ません。

Twitterが提供しているTwitter APIでは、**Twitterのアプリやwebにアクセスしなくとも**ツイート出来るようにしてくれています。
そのため、
①プログラムからツイートを実行する
のように、プログラムを実行するだけで自動的にツイートをする事が可能です。

API自体はTwitterに限らず、YouTubeの YouTube Data API やLINEの Messaging API など、大きなサービスでは大抵提供されているので気になる方は調べてみてください。
# 環境
macOS Monterey 12.4
※Twitter API v2(記事執筆時点で新しい方)を使います
# Level 1 - ツイート検索
いきなりツイートするのは難易度高いので、まずは比較的簡単な検索からやります。
## 目標
Level1でやりたい事は、特定のユーザーのツイート内容を取得する事です。
下記画像にある"ツッター"や"ドガタスマ"は[@pokeBot_haroot](https://twitter.com/pokeBot_haroot)の過去のツイート内容です。
**Twitterのアプリは使わず**、Macのターミナル(Windowsで言うコマンドプロンプト)で取得できているのが分かるかと思います。

ターミナルで取得できるという事は後々Javaやpythonなどのプログラム上でも取得して色々いじれそうですね。
## 導入
Twitter API v2でツイート検索をするエンドポイントは2つありますが、
今回は1週間以内のツイートを検索する[このエンドポイント(search/recent)](https://developer.twitter.com/en/docs/twitter-api/tweets/search/quick-start/recent-search)を使ってみます。
英語なので読みづらいですが、下の方に
リクエストの例が載っています。

これを参考にコマンドプロンプト(macならターミナル)から下のコマンドを打ってみましょう。
@pokeBot_harootの最近のツイートを取得するだけの簡単なリクエストです。
```sh
curl "https://api.twitter.com/2/tweets/search/recent?query=from%3ApokeBot_haroot"
```
ちなみに"%3A"→":"(コロン), "%20"→" "(半角スペース)の意味です。コマンドプロンプトに誤解されないようにこの表記になっているので気にせずこの表記のまま入力してください([このサイト](https://tech-unlimited.com/urlencode.html)などでデコードしてみると元の表記がわかります)。
するとツイート検索の結果では無くこんなものが返ってきます。

`unauthorized`。つまり認証エラーです。
どこの誰かも知らんやつにTwitterAPIは使わせないということですね。
TwitterAPIを使う時は、認証情報が必要になります。
次は認証情報を取得しましょう(最初はここの認証の手順が多いので頑張ってください)。
## 認証
Twitter API v2では、OAuth2.0という認証方式が使われています。
そのOAuth2.0とやらの中にも何種類か認証方法があり、**エンドポイントごとに使える認証方法が異なります。**
今回の`search/recent`のエンドポイントでは、[リファレンス](https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference/get-tweets-search-recent)を見る限り
- App-only
- Authorization Code with PKCE
という2種類の認証が利用可能だそうです。~~意味不明ですね。~~

この2つの認証の違いは、Twitterに**ログインしているかしていないか**です。
ツイートやいいねをする時は、特定のユーザーでログインする必要があります(Authorization Code)が、
ツイートを検索するだけの場合、Twitterにログインする必要はありません(App-only)。
なので今回はどちらの認証方法でも利用可能です。
恐らく実際に手を動かした方が理解が早いので手順で説明します。
上記の2つどちらを使うかは好みですが、今回はより簡単なApp-onlyを使ってみます。
### App-only
認証用のアクセストークンを得るには[開発者用のサイト(デベロッパーサイト)](https://developer.twitter.com/en/portal/petition/essential/basic-info)に登録をします。
自分のTwitterアカウントでログイン後、開発者としての情報を登録します。

ポリシーに同意し、メール認証すると下記の画面に飛ぶのでアプリ名を入れて次へ進みます。

するとキーが3つ表示されました。
これらはパスワードのようなものなので公開せず、自分だけが見れる場所にメモして保管しましょう。
**※セキュリティの理由から、これらのキーは今後表示出来ないので、3つとも確実にメモしておきましょう。**

この一番下にある**Bearer Token**が今回のApp-onlyで必要なアクセストークンです。
## 認証をつけてリクエスト
では先ほど認証エラーになったcurlコマンドで、ヘッダーにアクセストークンを付与(AAAAAの部分)してみましょう。
```
curl "https://api.twitter.com/2/tweets/search/recent?query=from%3ApokeBot_haroot" \
-H "Authorization: Bearer AAAAA***************************************************************************************************************"
```
[結果]

見づらいですが、dataをキーとしてidとtextの情報がいくつか入ったJSON形式の文字列が返ってきました。
それぞれのtextをみると、Twitterのアプリで見れる@pokeBot_harootのツイート内容と同じになってますね。

Level1[ツイート検索]クリアですお疲れ様でした。
(やる気があれば、つづく)