iOS11からsocial.frameworkが廃止され、Twitterの公式ライブラリ「TwitterKit」を利用している人も多いかと思います。
が、残念なことに2018/10/31でサポートを終了することがアナウンスされました。
と言うわけで、今後のために、公式もすすめている「Twitter’s standard API」に関して
- 開発者登録
- ツイートの取得
について解説します。
つぶやき方とかはまた今度。。。
公式トップ (英語)
https://developer.twitter.com/en/products/tweets
APIとエンドポイント(英語)
https://developer.twitter.com/en/docs
利用条件
2018/7/24に新しい利用条件が発表されて、厳し目になったのでその辺のチェックも重要です。
https://blog.twitter.com/developer/ja_jp/topics/tools/2018/jp-new-developer-requirements-to-protect-our-platform.html
変更点はこんな感じ。
- developer portalで開発者登録が必須に
- 開発者登録の時に、APIの利用目的を説明しないとダメ
- 利用目的が変わった場合にも説明が必要
- 開発者登録1アカウントに登録できるアプリは10個まで
- ツイートおよびリツイートは合計で、3時間で300件まで
- いいねは、24時間で1000件まで
- フォローは、24時間で1000件まで
- ダイレクトメッセージは、24時間で15,000件まで
開発者登録
では早速開発者登録をしていきます。
手順、長いです…
「apply for a developr account」をクリックする。
開発者アカウントにしたいtwitterアカウントでログインします。
ログインされるので、少しスクロールをして「Add a valid phone number」をクリックして電話番号を登録します。
「country/region」と「Phone number」を入力して「Next」をクリック。
090-xxxx-zzzzの場合は、頭の0を抜いて、90xxxxzzzzにして番号を入れてくださいね。
するとtwitterからショートメッセージで認証番号が届きます。
届いた認証番号を入力して「Verify」をクリックで無事、認証されます。
これで、電話番号登録ボタンが「Continue」ボタンになっているのでクリック。
アカウントの詳細を記入していきます。
まずはビジネスなのか個人利用なのか。
個人利用の場合(2番目)
- アカウント名
- APIを呼び出す国
の入力だけです。
ビジネスの場合(1番目)
- 組織名
- 会社名
- 組織のツイッターアカウント
- 組織のwebサイト(オプション)
- APIを呼び出す国
- 顧客がいる地域(複数選択)
- 組織の分類
- 提供するサービスの業種(複数選択)
を入力していきます。
次の画面では
- APIの用途の選択(複数選択)
- 使用用途に関する4つの質問の答え (合計300文字「以上」)
- 中心となる用途は?
- ツイートやユーザーの分析をしますか?するなら具体的な内容を
- ツイート/リツイート/likeをしますか?するなら具体的なやり方を
- どんな感じでツイートを表示させますか?
を入力していきます。
次は利用規約への同意です。
この後、最終確認のメールが送信されます。
メールにある「Confirm your email」リンクをクリックすると、登録が完了されて審査に入ります。
次の日には、審査の承認メールが来ました。
アプリの登録
開発者登録が完了したら、APIを使いたいアプリを登録します。
まず、デベロッパーページにログインします。http://developer.twitter.com/en/account/get-started
次に、Create an app項目にある「Apps」リンクをクリックします。
次の画面で「Create an app」をクリックします。
次の画面でアプリに関する以下の情報を入力していきます。
- アプリ名 (必須)
- アプリの詳細内容 (必須)
- URL (必須)
- Callback URL (オプション)
- 利用規約URL (オプション)
- プライバシーポリシーURL (オプション)
- 組織名 (オプション)
- 組織のサイトURL (オプション)
- アプリ内でもAPIの利用内容説明 (必須)
「URL」は、APIを呼び出すプログラムを置く場所、
「Callback URL」は利用ユーザーにログインをさせた時に、結果のコールバックを飛ばすURLです。
必須事項を入力して「Create」ボタンを押すと、規約への同意画面が出て、同意すると登録が完了します。
ベアラトークンの取得
では、早速Twitter’s standard APIを使ってみたいところですが、twitterのデータにアクセスするには
- アクセストークン (万能だけど取得面倒)
- ベアラトークン (参照だけだけど取得簡単)
のどちらかが必要です。
アクセストークンは特定ユーザーとして認証してアクセスする許可証をもらう形なので面倒だけど色々できます。
ベアラトークンはユーザーとしての認証が無く、簡単に取得できるかわりに参照しかできません。
今回はtweetを取得したいだけなのでベアラトークンを取得して使います。
ベアラトークンの取得方法は、APIキーとAPIシークレットを結合してbase64エンコードしたものをhttps://api.twitter.com/oauth2/tokenに投げるだけです。
結果として次のようなjson文字列が返って来ます。
「access_token」の所に入っている長い文字列がベアラトークンです。
{ "token_type":"bearer", "access_token":"AAAAAAAAAAAAAAAAAAAAAFe38gBAAAAAsovUYomTdokjqaFAEz1on2qBBwM%3EKN56v2USmyGXu5UJJJMMKRkaQvasEfaLKblb1ZzBUoSEQHpN88" }
ベアラトークンを取得するPHP実装は次の通りです。
$REQUEST_BARER_URL = "https://api.twitter.com/oauth2/token"; $credential = base64_encode( $API_KEY . ':' . $API_SECRET ); $params = [ 'method' => 'POST', 'header' => [ 'Authorization: Basic ' . $credential, 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8', ], 'content' => http_build_query([ 'grant_type' => 'client_credentials', ]), ]; $curl = curl_init(); curl_setopt( $curl, CURLOPT_URL, $REQUEST_BARER_URL ); curl_setopt( $curl, CURLOPT_HEADER, true ); // ヘッダー取得する curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, $params['method'] ); curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false ); // 証明書の検証なし curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); // 結果を文字列で curl_setopt( $curl, CURLOPT_HTTPHEADER, $params['header'] ); curl_setopt( $curl, CURLOPT_POSTFIELDS, $params['content'] ); curl_setopt( $curl, CURLOPT_TIMEOUT, 5 ); $res1 = curl_exec( $curl ); $res2 = curl_getinfo( $curl ); curl_close( $curl ); $response = substr( $res1, $res2['header_size'] ); $response_json = json_decode( $response, true ); $bearer_token = $response_json['access_token'];
APIキーとAPIシークレットは、開発者管理画面で登録したアプリの「Keys and tokens」タブをクリックするとあります。
つぶやきの読み込み
早速、前項で取得したベアラトークンを使って、つぶやきを読み込んでみます。
こちらもベアラトークンの取得同様とてもシンプルです。
https://api.twitter.com/1.1/statuses/user_timeline.jsonに対して2つのパラメータ
- screen_name (取得したいtwitterアカウント名)
- count (取得件数。最大100)
を付けてリクエストするだけです。
PHP実装は次の通り
$REQUEST_TWEET_URL = 'https://api.twitter.com/1.1/statuses/user_timeline.json'; $REQUEST_TWEET_PARAMS = [ 'screen_name' => '@flickfrogDev', 'count' => 10, ]; $REQUEST_TWEET_URL .= '?' . http_build_query ( $REQUEST_TWEET_PARAMS ); $tweet_params = [ 'method' => 'GET', 'header' => [ 'Authorization: Bearer ' . $bearer_token, ], ]; $curl = curl_init(); curl_setopt( $curl, CURLOPT_URL, $REQUEST_TWEET_URL ); curl_setopt( $curl, CURLOPT_HEADER, true ); // ヘッダー取得する curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, $tweet_params['method'] ); curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false ); // 証明書の検証なし curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); // 結果を文字列で curl_setopt( $curl, CURLOPT_HTTPHEADER, $tweet_params['header'] ); curl_setopt( $curl, CURLOPT_TIMEOUT, 5 ); $res1 = curl_exec( $curl ); $res2 = curl_getinfo( $curl ); curl_close( $curl ); $json = substr( $res1, $res2['header_size'] );
結果がjson文字列で取得でき、textキーにつぶやき内容が入っています。
- user_mentionsキーにはメンション情報
- hashtagsキーにはハッシュタグ
がそれぞれ入っているので、頑張って文字列解析をしなくてもメンション情報やハッシュタグを取得できます。
$tweets_arr = json_decode( $json, true ); foreach ( $tweets_arr as $tweet ) { // つぶやき echo $tweet['text'] . '</br>'; // メンション if ( count( $tweet['entities']['user_mentions'] ) > 0 ) { echo 'メンション </br>'; } // ハッシュタグ foreach( $tweet['entities']['hashtags'] as $hashtag ) { echo $hashtag['text'] . '</br>'; } }
注意点としては、ツイートの取得には回数制限があって
- ユーザー認証だと900回/15分
- アプリ認証だと1500回/15分
となっているので、個人で使う分にはいいですが、サービスとして使うにはこころもとないので、MySQLなどに一旦入れて、ユーザーにはDBから取得した内容を見せるという工夫が必要ということです。
公式ドキュメントはこちら
https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline.html