【2022年最新版】PHPでTwitter API v2を使いツイートを検索して表示するまでの全手順まとめ

Twitter API v2 ツイートを条件指定で取得

TwitterのAPIを使うときは、英語のサイトで開発者として登録する必要があります。
ちょっとハードル高そうですよね。

そこで、英語が苦手な人でも問題ないように、丁寧にTwitter APIの使い方をまとめました。

  1. 開発者としてアプリ登録
  2. APIを使ってツイート取得
  3. ツイートを画面に表示

までの全プロセスをカバー。

今回は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」をクリック。

Twitter API 利用規約

利用規約が表示されるので、問題なければチェックをいれて「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では以下の流れでデータを取得できます。

  1. エンドポイントを指定し、パラメータを付与
  2. ヘッダーを用意
  3. cURLで情報取得
  4. 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_RETURNTRANSFERtrueを指定することで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幅(ピクセル)
urlURL
preview_image_urlプレビューのURL
type形式
public_metricsエンゲージメント指標
non_public_metrics非公開エンゲージメント指標
organic_metricsオーガニック指標
promoted_metricsプロモーション指標
alt_textaltテキスト
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で返されるデータは最小限でユーザー情報は含まれていません。

今回は投稿者名も表示したかったので、expansionsauthor_idを指定することで投稿者データをレスポンスに含められるようにし、user.fieldsで表示名・ユーザー名を扱うように指示しました。

expansionsを指定しないとユーザー情報は扱えないので注意が必要です。

Twitter API v2でツイートを検索して取得する方法まとめ

Twitter API v2がリリースされ、PHPにてOAuth認証を通す必要がなくなったのでかなりシンプルにツイートを取得できるようになりました。

  1. 開発者向けサイトでアプリ登録
  2. Bearer Token取得
  3. 検索条件を指定
  4. cURLで問い合わせ
  5. 結果を出力

の順で好きなようにツイートが取得できます。

ただしAPIで返されるデータがデフォルトでは最小限のため、自分で追加データを要求するところがややこしいです。
検索条件を指定するときは気をつけてください。

Twitter API v2 ツイートを条件指定で取得

この記事が気に入ったら
いいね または フォローしてね!

SHARE
  • URLをコピーしました!
目次