TwitterのAPIを使うときは、英語のサイトで開発者として登録する必要があります。
ちょっとハードル高そうですよね。
そこで、英語が苦手な人でも問題ないように、丁寧にTwitter APIの使い方をまとめました。
- 開発者としてアプリ登録
- APIを使ってツイート取得
- ツイートを画面に表示
までの全プロセスをカバー。
今回はTwiter API v2をベースに、PHPで条件を指定して検索したツイートを表示するサンプルプログラムもご紹介します。
【この記事でわかること】
- Twitter APIを使うためのアプリ登録方法
- ツイートの検索結果の取得方法
Twitter開発者サイトでアプリを登録してキーを発行する
まずはTwitter APIを利用するための各種キーを発行します。
ブラウザで利用したいTwitterアカウントでログインをしたあと、その状態のままで開発者向けサイトに移動してください。
アクセスしたら、右上にある「Sign up」をクリック。
次にTwitter APIの利用申請をします。
上部にログイン中のTwitterアカウントが表示されているはずです。
その次に質問項目が並んでいます。
What’s your name?
→ 名前を入れてください。
ここでいう名前は開発者名を指します。
あとから変更ができないので注意してください。
What country are you based in?
→ どの国を基準にしますか?
主にどの国で使われるかという質問です。
基本的に解答は「Japan(日本)」になると思います。
What’s your use case?
→ あなたの利用目的は?
下記の選択肢から選びます。
- Building B2B products(B to Bのための商品開発)
- Building consumer products(消費者向けの商品開発)
- Build customized solution in-house(家庭における問題解決のためのカスタムツール作成)
- Publishing ads programatically(プログラムを通した広告発行)
- Making a bot(ボット作成)
- Building tools for Twitter users(Twitterユーザーのためのツール作成)
- Exploring the API(APIの調査)
- Academic researcher(学術的な研究)
- Teacher(先生、教授)
- Student(学生)
- Something else (But related to academics)(その他の研究目的)
特に明確な目的がなくTwitter APIを試しで使ってみたいということであれば、「Exploring the API(APIの調査)」を選択しておけばOKです。
Will you make Twitter content or derived information available to a government entity or a government affiliated entity?
→ Twitterコンテンツもしくは関連情報を政府組織や公的機関で利用しますか?
公的な目的がなければ、必ず「NO」を選択してください。
「YES」を選んだ場合はTwitter運営サイドの確認作業が入るので、条件に当てはまるときだけ「YES」を選びましょう。
Want updates? (optional)
→ アップデート情報が欲しいですか?(任意)
メールでTwitter APIに関するアップデート情報が必要なときだけチェックをいれてください。
すべて入力が終わったら、画面右下にある「Next」をクリック。
利用規約が表示されるので、問題なければチェックをいれて「Submit」。
このとき、下の画像のように警告が標示される場合があります。
There was a problem completing your request
→ あなたの要求を完了させるのに問題が発生しました
User must have a verified phone number on file prior to submitting application.
→ ユーザーはアプリ作成に先立ち電話番号認証を行う必要があります。
最初にログインしたTwitterアカウントで電話番号認証が行われていないのでエラーが発生しました。
Twitter公式サイトやアプリなどで認証を済ませてから、改めてAPIの利用規約に同意してください。
登録が完了すると以下の画面になります。
Twitterアカウントに紐付けられているメールアドレス宛に認証メールが送られているので、確認してくださいという内容です。
上記のようなメールが届くので「Confirm your email」をクリック。
新しく表示されたページの赤枠の部分にアプリの名前を32文字以内で入れて、「Get keys」をクリック。
入力した名前がすでに使われている場合は警告がでるので、別の名前にしてください。
アプリ名が決まったら、APIを使うために必要なキーの一覧が表示されます。
Bearer Tokenはあとで使うので控えておいてください。
キーの取り扱いには十分注意して、他の人に安易に渡さないようにしましょう。
Twitter APIでツイートを検索する方法まとめ
これまでPHPプログラム側からTwitterOAuthなどを利用して認証を通していましたが、すでにTwitter側でBearer Tokenが発行されているのでそれを使ってAPIと通信します。
基本的にTwitter APIでは以下の流れでデータを取得できます。
- エンドポイントを指定し、パラメータを付与
- ヘッダーを用意
- cURLで情報取得
- jsonから配列に置換
あとは取得したデータを好きにつかえばOK。
例として「プログラミング PHP」に関するツイートを検索して取得するプログラムは以下。
<?php
//エンドポイントを指定
$base_url = 'https://api.twitter.com/2/tweets/search/recent';
//検索条件を指定
$query = [
'query' => 'プログラミング PHP',
'sort_order' => 'recency',
'expansions' => 'author_id',
'user.fields' => 'name,username'
];
$url = $base_url . '?' . http_build_query($query);
//ヘッダ生成
$token = 'xxxxxxxxxxxxxx'; //Bearer Token
$header = [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
];
//cURLで問い合わせ
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
$result = json_decode($response, true);
curl_close($curl);
//結果のうち最新3件を出力
for ($i = 0; $i < 3; $i++) {
$name = $result['includes']['users'][$i]['name'];
$username = $result['includes']['users'][$i]['username'];
$text = $result['data'][$i]['text'];
echo '<p>';
echo '投稿者:' . $name . '(@' . $username . ')<br>';
echo $text;
echo '</p>';
}
結果は以下のようになりました。
投稿者:ジェン@ブログ&初心者Youtuber(@satannblog)
広大のゼミと案件、就く仕事分野で使用するプログラミング言語 ・HTML&CSS・JavaScript・Python・PHP・Java・R言語・C言語 全部基礎はやってきたけど、用途も全く違うしエラーも日常茶飯事だし本当にきつい😭 でも終わってからの感情でやってる時、時間忘れてる。 そう言う気持ち大切かも🤔
投稿者:ムラタ|エンジニア志望の事務職@エンジニア転職奮闘中(@yokohamakm)
【プログラミング学習のProgate】PHPのレベルが18にUPしました! https://t.co/gKnTVjGrwJ #Progate #駆け出しエンジニアと繋がりたい
投稿者:nest++(@nestplus2)
プログラミング初心者がPython Hackerになるまでに読むべき本まとめhttps://t.co/OABHuZ1qFX ##PHP,#Laravel,#Java,#エンジニア,#プログラマ
詳しく解説していきます。
API問い合わせのURL生成
//エンドポイントを指定
$base_url = 'https://api.twitter.com/2/tweets/search/recent';
//検索条件を指定
$query = [
'query' => 'プログラミング PHP',
'sort_order' => 'recency',
'expansions' => 'author_id',
'user.fields' => 'name,username'
];
$url = $base_url . '?' . http_build_query($query);
最新のツイートを検索するエンドポイントhttps://api.twitter.com/2/tweets/search/resent
を指定しています。
サンプルでは以下の条件で指定しました。
- 「プログラミング PHP」で検索
- 新しい順で取得
- ユーザー名も含めて取得
検索条件はいろいろと指定ができるので、設定方法については後述します。
最後にhttp_build_query()
を使って検索条件を入れたパラメータを生成し、API問い合わせのためのURLを完成させました。
ヘッダ生成
$token = 'XXXXXXXXXXXX'; //Bearer Token
$header = [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
];
Bearer Tokenを含めたヘッダを作っています。
(ここは自分のものに置き換えてください)
同時に、APIからはjson形式でデータを受け取るように指示しています。
cURLで情報取得
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
$result = json_decode($response, true);
curl_close($curl);
用意した情報をもとに、cURLで情報を取得します。
CURLOPT_RETURNTRANSFER
にtrue
を指定することでAPIからの返り値を文字列で受け取りました。
その後、json_decode
で配列に直してcURLは終了です。
ちなみに、受け取った配列データは以下。
array(3) {
["data"]=>
array(10) {
[0]=>
array(3) {
["author_id"]=>
string(19) "1400134521891135494"
["id"]=>
string(19) "1492780802203353088"
["text"]=>
string(393) "広大のゼミと案件、就く仕事分野で使用するプログラミング言語
・HTML&CSS・JavaScript・Python・PHP・Java・R言語・C言語
全部基礎はやってきたけど、用途も全く違うしエラーも日常茶飯事だし本当にきつい😭
でも終わってからの感情でやってる時、時間忘れてる。
そう言う気持ち大切かも🤔"
}
[1]=>
array(3) {
["author_id"]=>
string(9) "164532252"
["id"]=>
string(19) "1492779826369171460"
["text"]=>
string(163) "【プログラミング学習のProgate】PHPのレベルが18にUPしました! https://t.co/gKnTVjGrwJ #Progate #駆け出しエンジニアと繋がりたい"
}
//.....省略.....
}
["includes"]=>
array(1) {
["users"]=>
array(10) {
[0]=>
array(3) {
["id"]=>
string(19) "1400134521891135494"
["name"]=>
string(37) "ジェン@ブログ&初心者Youtuber"
["username"]=>
string(10) "satannblog"
}
[1]=>
array(3) {
["id"]=>
string(9) "164532252"
["name"]=>
string(74) "ムラタ|エンジニア志望の事務職@エンジニア転職奮闘中"
["username"]=>
string(10) "yokohamakm"
}
[2]=>
array(3) {
["id"]=>
string(10) "4485056533"
["name"]=>
string(10) "nest++"
["username"]=>
string(9) "nestplus2"
}
//.....省略.....
}
}
}
取得データの出力
for ($i = 0; $i < 3; $i++) {
$name = $result['includes']['users'][$i]['name'];
$username = $result['includes']['users'][$i]['username'];
$text = $result['data'][$i]['text'];
echo '<p>';
echo '投稿者:' . $name . '(@' . $username . ')<br>';
echo $text;
echo '</p>';
}
デフォルトでは最新10件が取得されるので、ループを回してそのうちの3件だけ出力しました。
このあたりはお好きに。
ツイートの検索条件の設定方法
ツイートの指定方法は上記の公式ページにまとまっていますが、ややわかりにくいのと英語なので、日本語で翻訳してまとめなおします。
ツイート検索で使うエンドポイントは以下。https://api.twitter.com/2/tweets/search/recent
検索条件として指定できるパラメーターの一覧は次のとおりです。
このAPIでは、該当したツイートがあった場合のリクエストデータは最小限となります。
追加でデータが欲しいときは適宜パラメーター(expansions
など)にて指定する形式なので注意してください。
パラメーター | 指定形式 | 詳細 | デフォルト |
---|---|---|---|
【必須】query | 文字列 | 検索語句 OR, AND検索など詳しくは公式ページ参照 | |
end_time | 日付(ISO 8601形式) | 指定時間より前のツイートを取得YYYY-MM-DDTHH:mm:ssZ (ISO 8601/RFC 3339)形式にて指定 | 直近30秒 |
expansions | 列挙 | 追加で取得する詳細データの種別を指定 ・ author_id 投稿者の情報・ referenced_tweets.id 関連ツイートの情報・ referenced_tweets.id.author_id 関連ツイートの投稿者情報・ in_reply_to_user_id リプライの情報・ attachments.poll_ids 投票の情報・ attachments.media_keys メディア情報・ entities.mentions.username メンション情報・ geo.place_id 位置情報 | |
max_results | 数値 | 1ページあたりの最大取得件数 (10〜100の間で指定) | 10 |
media.fields | 列挙 | 追加で取得するメディア関連のデータを指定 カンマ区切りで複数指定OK ・ media_key メディアのID・ duration_ms 動画の再生時間・ height 高さ(ピクセル)・ width 幅(ピクセル)・ url URL・ preview_image_url プレビューのURL・ type 形式・ public_metrics エンゲージメント指標・ non_public_metrics 非公開エンゲージメント指標・ organic_metrics オーガニック指標・ promoted_metrics プロモーション指標・ alt_text altテキスト | |
next_token | 文字列 | 次ページに含まれるツイートを取得したいときに指定 ※指定するべき値は以前APIから返されたデータの中に含まれている | |
place.fields | 列挙 | 追加で取得する場所関連のデータを指定 カンマ区切りで複数指定OK ・ id 場所ID・ full_name 正式名称・ name 正式名称の省略名・ contained_within 識別子・ country 国・ country_code 国コード・ geo 位置情報・ place_type 種別※希望するデータを取得するには expansions=geo.place_id の指定が必要 | |
poll.fields | 列挙 | 追加で取得する投票関連のデータを指定 カンマ区切りで複数指定OK ・ id 投票ID・ duration_minutes 投票時間・ end_datetime 終了時間・ options オプション・ voting_status ステータス | |
since_id | 文字列 | 指定したIDより大きい数字のIDを持つ (より新しい)ツイートを取得 | |
sort_order | 列挙 | 取得ツイートの並び順を指定 ・ recency 新しい順・ relevancy 関連度順 | recency |
start_time | 日付(ISO 8601形式) | 指定時間より新しいツイートを取得YYYY-MM-DDTHH:mm:ssZ (ISO 8601/RFC 3339)形式にて指定※ since_id が指定されているときは無視される※7日前まで指定可能 | 7日前 |
tweet.fields | 列挙 | 取得するツイート内容関連のデータを指定 カンマ区切りで複数指定OK ・ id ツイートID・ text ツイート内容・ attachments 添付データ・ author_id 投稿者ID・ context_annotations 注釈・ conversation_id 会話の親ツイートID・ created_at 投稿日時・ geo 位置情報・ in_reply_to_user_id リプ先のユーザーID・ lang 言語・ non_public_metrics 非公開エンゲージメント指標・ public_metrics エンゲージメント指標・ organic_metrics オーガニック指標・ promoted_metrics プロモーション指標・ possibly_sensitive センシティブな内容か・ referenced_tweets 参照元ツイートID・ reply_settings リプの許可設定・ source 投稿元ソース・ withheld コンテンツ制限・ entities ツイート関連データ※希望するデータを取得するためには expansions=referenced_tweets.id の指定が必要 | |
until_id | 文字列 | 指定したIDより小さい数字のIDを持つ (より古い)ツイートを取得 | |
user.fields | 列挙 | 取得するユーザー関連のデータを指定 カンマ区切りで複数指定OK ・ id ユーザーID・ name 表示名・ username ユーザー名・ created_at 登録日時・ description プロフィール・ location 位置情報・ pinned_tweet_id 固定表示ツイートID・ profile_image_url プロフィール画像URL・ protected 鍵付きかどうか・ public_metrics アクティビティ指標・ url ユーザーページURL・ verified 認証・ withheld 制限・ entities ユーザー関連データ※希望するデータを取得するためには、 下記の関連する expansions の指定も必要・ expansions=author_id ・ expansions=entities.mentions.username ・ expansions=in_reply_to_user_id ・ expansions=referenced_tweets.id.author_id |
あらためてサンプルのコードでは以下のように条件を指定していました。
//エンドポイントを指定
$base_url = 'https://api.twitter.com/2/tweets/search/recent';
//検索条件を指定
$query = [
'query' => 'プログラミング PHP',
'sort_order' => 'recency',
'expansions' => 'author_id',
'user.fields' => 'name,username'
];
$url = $base_url . '?' . http_build_query($query);
APIで返されるデータは最小限でユーザー情報は含まれていません。
今回は投稿者名も表示したかったので、expansions
でauthor_id
を指定することで投稿者データをレスポンスに含められるようにし、user.fields
で表示名・ユーザー名を扱うように指示しました。
expansions
を指定しないとユーザー情報は扱えないので注意が必要です。
Twitter API v2でツイートを検索して取得する方法まとめ
Twitter API v2がリリースされ、PHPにてOAuth認証を通す必要がなくなったのでかなりシンプルにツイートを取得できるようになりました。
- 開発者向けサイトでアプリ登録
- Bearer Token取得
- 検索条件を指定
- cURLで問い合わせ
- 結果を出力
の順で好きなようにツイートが取得できます。
ただしAPIで返されるデータがデフォルトでは最小限のため、自分で追加データを要求するところがややこしいです。
検索条件を指定するときは気をつけてください。