[php] Twitter の Search APIで人気ツイートを取得
Twitter developerページにてアプリを登録し、APIキー、APIシークレット、アクセストークン、アクセストークンシークレットを取得しておく。
下記関数を実装しておく
<?php /************************************************** [GET search/tweets]のお試しプログラム 認証方式: アクセストークン 配布: SYNCER 公式ドキュメント: https://dev.twitter.com/rest/reference/get/search/tweets 日本語解説ページ: https://syncer.jp/Web/API/Twitter/REST_API/GET/search/tweets/ **************************************************/ function searchTweet(){ // 設定 $api_key = 'xxxxxxxx' ; // APIキー $api_secret = 'xxxxxxxx' ; // APIシークレット $access_token = 'xxxxxxxx' ; // アクセストークン $access_token_secret = 'xxxxxxxx' ; // アクセストークンシークレット $request_url = 'https://api.twitter.com/1.1/search/tweets.json' ; // エンドポイント $request_method = 'GET' ; /* // パラメータA (オプション) $params_a = array( "q" => "*", //すべてのツイートを対象とする // "geocode" => "35.794507,139.790788,1km", "lang" => "ja", // "locale" => "ja", "result_type" => "popular", // "count" => "10", // "until" => "2017-01-17", // "since_id" => "643299864344788992", // "max_id" => "643299864344788992", // "include_entities" => "true", ) ; */ // キーを作成する (URLエンコードする) $signature_key = rawurlencode( $api_secret ) . '&' . rawurlencode( $access_token_secret ) ; // パラメータB (署名の材料用) $params_b = array( 'oauth_token' => $access_token , 'oauth_consumer_key' => $api_key , 'oauth_signature_method' => 'HMAC-SHA1' , 'oauth_timestamp' => time() , 'oauth_nonce' => microtime() , 'oauth_version' => '1.0' , ) ; // パラメータAとパラメータBを合成してパラメータCを作る $params_c = array_merge( $params_a , $params_b ) ; // 連想配列をアルファベット順に並び替える ksort( $params_c ) ; // パラメータの連想配列を[キー=値&キー=値...]の文字列に変換する $request_params = http_build_query( $params_c , '' , '&' ) ; // 一部の文字列をフォロー $request_params = str_replace( array( '+' , '%7E' ) , array( '%20' , '~' ) , $request_params ) ; // 変換した文字列をURLエンコードする $request_params = rawurlencode( $request_params ) ; // リクエストメソッドをURLエンコードする // ここでは、URL末尾の[?]以下は付けないこと $encoded_request_method = rawurlencode( $request_method ) ; // リクエストURLをURLエンコードする $encoded_request_url = rawurlencode( $request_url ) ; // リクエストメソッド、リクエストURL、パラメータを[&]で繋ぐ $signature_data = $encoded_request_method . '&' . $encoded_request_url . '&' . $request_params ; // キー[$signature_key]とデータ[$signature_data]を利用して、HMAC-SHA1方式のハッシュ値に変換する $hash = hash_hmac( 'sha1' , $signature_data , $signature_key , TRUE ) ; // base64エンコードして、署名[$signature]が完成する $signature = base64_encode( $hash ) ; // パラメータの連想配列、[$params]に、作成した署名を加える $params_c['oauth_signature'] = $signature ; // パラメータの連想配列を[キー=値,キー=値,...]の文字列に変換する $header_params = http_build_query( $params_c , '' , ',' ) ; // リクエスト用のコンテキスト $context = array( 'http' => array( 'method' => $request_method , // リクエストメソッド 'header' => array( // ヘッダー 'Authorization: OAuth ' . $header_params , ) , ) , ) ; // パラメータがある場合、URLの末尾に追加 if( $params_a ) { $request_url .= '?' . http_build_query( $params_a ) ; } // オプションがある場合、コンテキストにPOSTフィールドを作成する (GETの場合は不要) // if( $params_a ) { // $context['http']['content'] = http_build_query( $params_a ) ; // } // cURLを使ってリクエスト $curl = curl_init() ; curl_setopt( $curl, CURLOPT_URL , $request_url ) ; curl_setopt( $curl, CURLOPT_HEADER, 1 ) ; curl_setopt( $curl, CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ; // メソッド curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない curl_setopt( $curl, CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す curl_setopt( $curl, CURLOPT_HTTPHEADER , $context['http']['header'] ) ; // ヘッダー // if( isset( $context['http']['content'] ) && !empty( $context['http']['content'] ) ) { // GETの場合は不要 // curl_setopt( $curl , CURLOPT_POSTFIELDS , $context['http']['content'] ) ; // リクエストボディ // } curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数 $res1 = curl_exec( $curl ) ; $res2 = curl_getinfo( $curl ) ; curl_close( $curl ) ; // 取得したデータ $json = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど) $header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ) // [cURL]ではなく、[file_get_contents()]を使うには下記の通りです… // $json = file_get_contents( $request_url , false , stream_context_create( $context ) ) ; // JSONをオブジェクトに変換 $obj = json_decode( $json ) ; $dump = json_decode($json, true); return $dump; }
上記関数の使い方は以下の通り
$dump = searchTweet(); foreach($dump as $v){ foreach ($v as $arr) { $recentID .= $arr["id"]; //ツイートIDを取得 } }
返ってきた情報は公式ページを参照のこと
クエリ一覧
Search APIで使用できるクエリは以下の通り
"島風 かわいい"
–島風 かわいい
が含まれるツイートの検索島風 OR 天津風
–島風
か天津風
が含まれるツイートの検索島風 -天津風
–島風
が含まれ天津風
が含まれないツイートの検索#島風
– ハッシュタグ島風
が含まれるツイートの検索from:user
– ユーザーuser
のツイートを検索to:user
– 宛先がユーザーuser
のツイートを検索@user
– リプライ@user
が含まれるツイートの検索島風 since:2015-02-23
– 2015年2月23日以降の島風
が含まれるツイートを最新から順に検索(search/tweetsでは1週間以上前のツイートは検索不可)島風 until:2015-02-23
– 2015年2月23日以前の島風
が含まれるツイートを最新から順に検索(search/tweetsでは1週間以上前のツイートは検索不可)島風 :)
–島風
が含まれ内容がポジティブなツイートの検索島風 :(
–島風
が含まれ内容がネガティブなツイートの検索島風 ?
–島風
が含まれ内容が疑問形なツイートの検索島風 source:flantter
–島風
が含まれFlantterからつぶやかれたツイートの検索島風 lang:ja
–島風
が含まれ日本語のツイートを検索(他en等)島風 include:retweets
–島風
が含まれるリツイートを含むツイートを検索島風 exclude:retweets
–島風
が含まれるリツイートを含まないツイートを検索島風 exclude:nativeretweets
–島風
が含まれるリツイートを含まないツイートを検索?島風 list:user/listname
–user
のlistname
というリスト内で島風
が含まれるツイートを検索島風 geocode:37.78115,-122.39872,1mi
–島風
を含み、緯度、経度、範囲を指定して検索(単位はkm,mi等)島風 near:me
–島風
を含み自分に近いところにいる人間のツイートを検索 (ドキュメントに書いてない)島風 near:新潟
–島風
を含み新潟付近でつぶやかれたツイートの検索島風 near:新潟 within:10km
–島風
を含み新潟付近でつぶやかれたツイートの検索(範囲を10kmに指定、単位はkm,mi等)島風 filter:links
–島風
とリンクが含まれるツイートの検索島風 filter:verified
–島風
が含まれ認証されたアカウントからつぶやかれたツイートを検索島風 filter:images
–島風
と画像が含まれるツイートの検索島風 filter:twimg
–島風
とツイッターの画像が含まれるツイートの検索島風 filter:videos
–島風
と動画が含まれるツイートの検索島風 filter:media
–島風
とメディア(画像と動画)が含まれるツイートの検索島風 filter:vine
–島風
とVineが含まれるツイートの検索 (ドキュメントに書いてない)島風 filter:news
–島風
が含まれ、ニュースだと思われるツイートの検索 (ドキュメントに書いてない)島風 filter:safe
–島風
が含まれ、possibly_sensitiveフラグが0のツイートの検索?島風 filter:periscope
–島風
が含まれ、periscopeで配信しているツイートの検索島風 filter:native_video
–島風
が含まれ、periscope,vineまたはTwitterにアップロードされた動画の検索島風 card_name:animated_gif
–島風
が含まれ、GIFが含まれるツイートを検索 (ドキュメントに書いてない)島風 min_retweets:100
–島風
が含まれリツイートが100以上のツイートを検索 (ドキュメントに書いてない)島風 min_faves:100
–島風
が含まれお気に入りが100以上のツイートを検索 (ドキュメントに書いてない)島風 min_replies:5
–島風
が含まれリプライが5以上のツイートを検索 (ドキュメントに書いてない)