リツイートされたつぶやきを取得する[statuses/retweets_of_me](Twitter API)
Twitter APIの使い方シリーズも、いよいよ第9回目を迎えました。今回は、自分(アクセストークンの主)がしたつぶやきの中から、リツイートされたものだけに絞ったリスト、「リツイーツ・オブ・ミー」を取得してみましょう。
目次
1リクエスト方法
「リツイーツ・オブ・ミー」とは、リツイートされたことがあるつぶやきリストです。取得に関する公式の解説(英語)は、下記ページにあります。
GET statuses/retweets_of_me Twitter Developer Center
1-1リクエストURL(メソッド)
GETメソッドで、下記URLにリクエストを送ります。
[GET] https://api.twitter.com/1.1/statuses/retweets_of_me.json
1-2パラメータ
データ取得用のパラメータ(OAuth1.0認証を除く)は下記の通りです。全てオプショナル(任意)なので、指定しても、しなくてもどちらでもかまいません。
項目 | 解説 | 初期値 |
---|---|---|
count | 取得する件数。最大値は200。 | 20 |
since_id | つぶやきIDを指定すると、このIDより未来のデータのみを取得する(このIDを含めて取得する)。詳しくは当ブログの過去記事、「[max_id][since_id]の使い方」で解説している。 | - |
max_id | つぶやきIDを指定すると、このIDより過去のデータのみを取得する(このIDを含めて取得する)。詳しくは当ブログの過去記事、「[max_id][since_id]の使い方」で解説している。 | - |
include_entities | [false]にすると、[entities]を含めない。「[include_entities]とは?」で解説している。 | true |
include_user_entities | [false]にすると、ユーザーオブジェクトにある[entities]を含めない。[entities]については、「[include_entities]とは?」を参照。 | true |
※は「指定必須」、※は「どちらか指定必須」のパラメータです。
[include_user_entities]とは
今回、新しく登場したinclude_user_entities
というパラメータがあります。これは、つぶやきオブジェクトではなく、「ユーザーオブジェクト」の中にあるエンティティ("entities": {〜}
)をJSONデータに含めるか、含めないかを選択できるものです。
2リツイーツ・オブ・ミーを取得する手順
「リツイーツ・オブ・ミー」を取得してみましょう。このシリーズではお馴染みですが、2パターン用意しています。単体バージョンと、外部ライブラリを利用するバージョンです。
2-1単体で動作するプログラム
こちらは単体版です。外部ライブラリを利用せず、このファイルだけで動作します。この記事から読み始めた人、OAuth1.0認証を通した一連の流れを把握したい人は、こちらをご利用下さい。
<?php //[API Key]と[API Secret] ([API Secret]はついでにURLエンコード) $api_key = ''; $api_secret = rawurlencode(''); //[アクセストークン]と[アクセストークンシークレット] ([アクセストークンシークレット]はついでにURLエンコード) $access_token = ''; $access_token_secret = ''; //リクエストURLとリクエストメソッド $request_method = 'GET'; $request_url = 'https://api.twitter.com/1.1/statuses/retweets_of_me.json'; //データ取得用のパラメータ(連想配列形式) $params_a = array( 'count' => 10, ); //キーを作成する $signature_key = "{$api_secret}&{$access_token_secret}"; //OAuth1.0認証用のパラメータ(連想配列形式) $params_b = array( 'oauth_consumer_key' => $api_key, 'oauth_token' => $access_token, 'oauth_nonce' => microtime(), 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_timestamp' => time(), 'oauth_version' => '1.0' ); //データを作成する $params_c = array_merge($params_a,$params_b); ksort($params_c); $signature_params = http_build_query($params_c,'','&',PHP_QUERY_RFC3986); $signature_params = rawurlencode($signature_params); $encoded_request_method = rawurlencode($request_method); $encoded_request_url = rawurlencode($request_url); $signature_data = "{$encoded_request_method}&{$encoded_request_url}&{$signature_params}"; //署名を作成する $hash = hash_hmac('sha1',$signature_data,$signature_key,TRUE); $signature = base64_encode($hash); //GETリクエストの準備 $params_c['oauth_signature'] = $signature; $header_params = http_build_query($params_c,'',',',PHP_QUERY_RFC3986); $tail = '?'.http_build_query($params_a,'','&',PHP_QUERY_RFC3986); //リクエストを実行する $response = @file_get_contents( $request_url.$tail, //[第1引数:リクエストURL($request_url)とクエリー($tail)を合体] false, //[第2引数:リクエストURLは相対パスか?(違うのでfalse)] stream_context_create( //[第3引数:stream_context_create()でメソッドとヘッダーを指定] array( 'http' => array( 'method' => $request_method, //リクエストメソッド 'header' => array( //カスタムヘッダー 'Authorization: OAuth '.$header_params, ), ) ) ) ); //配列[$data]を作成する $data = array(); $data[0] = $response; //JSONデータ $data[1] = $http_response_header; //レスポンスヘッダー //JSONデータを出力する(確認のため) echo $data[0];
2-2外部ライブラリを利用するプログラム
こちらはこの連載シリーズの過去記事、「OAUth認証用のライブラリを作ろう」で作成したOAuth1.0認証用ライブラリ(twoh10_scr)を利用するタイプです。まだ入手してない人は、下記からダウンロードして下さい。
<?php //ライブラリを読み込む(ファイルの相対パスを指定) require_once './twoh10_scr.php'; //引数の指定 $url = 'https://api.twitter.com/1.1/statuses/retweets_of_me.json'; $method = 'GET'; $params = array( 'count' => 10, ); //リクエスト実行 $data = twoh10_scr($url,$method,$params); //取得したJSONデータの出力(確認のため) echo $data[0];
2-3デモを確認する
プログラムを起動すると、Twitterにリクエストを送り、その返り値としてJSONデータを取得することができますね。それをブラウザに出力します。デモを確認したい場合は次のページにアクセスして下さい。
3取得できるJSONデータ
それでは、取得したJSONデータを見ていきましょう。これまでの「ホームタイムライン」「ユーザータイムライン」「メンションタイムライン」と内容は変わりません。1点だけ、今回新しく登場した[include_user_entities]というパラメータがどの部分に影響を及ぼすのかを意識しておいて下さいね。
3-1つぶやきのサンプル
アクセストークンの主は@SyncerJPで、取り上げるのが次のつぶやきです。リツイートされていることを確認して下さい。
これは、元のつぶやきです。
— Syncer (@SyncerJP) 2014, 8月 15
3-2JSONデータの解説
下記がJSONデータの内、上記サンプルの箇所を取り上げたものです。ユーザーオブジェクト内のエンティティが、[include_user_entities]で除外できるデータです。
[つぶやきオブジェクト {1つ目のつぶやき "created_at": "Fri Aug 15 00:15:50 +0000 2014",投稿日時$object[0]->created_at "id": 500073344876544001,投稿ID(数値型)$object[0]->id "id_str": "500073344876544001",投稿ID(文字型)$object[0]->id_str "text": "これは、元のつぶやきです。",つぶやきの内容(プレーンテキスト)$object[0]->text "source": "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>",投稿した端末$object[0]->source "truncated": false,$object[0]->truncated "in_reply_to_status_id": null,返信先の投稿ID(数値型)$object[0]->in_reply_to_status_id "in_reply_to_status_id_str": null,返信先の投稿ID(文字型)$object[0]->in_reply_to_status_id_str "in_reply_to_user_id": null,返信(またはリツイート)先のユーザーID(数値型)$object[0]->in_reply_to_user_id "in_reply_to_user_id_str": null,返信(またはリツイート)先のユーザーID(文字型)$object[0]->in_reply_to_user_id_str "in_reply_to_screen_name": null,返信(またはリツイート)先のスクリーンネーム$object[0]->in_reply_to_screen_name "user": {ユーザーオブジェクト(内容は「ユーザープロフィールのJSONデータ」を参照) "id": 2304957660,ユーザーID(数値型)$object[0]->user->id "id_str": "2304957660",ユーザーID(文字型)$object[0]->user->id "name": "Syncer",ユーザー名$object[0]->user->name "screen_name": "SyncerJP",ユーザーのスクリーンネーム$object[0]->user->screen_name "location": "",ユーザーの居住地$object[0]->user->location "description": "ネット活動を同期するというテーマのWEBサービス、「Syncer」のアカウントです。現在、鋭意作成中。進行状況などつぶやきます。",ユーザーの説明文$object[0]->user->description "url": null,ユーザーのwebサイト$object[0]->user->url "entities": {ユーザープロフィールのエンティティオブジェクト "description": {説明文に含まれるリンク情報(ユーザーがプロフィールで説明文を設定していない場合は存在しない) "urls": [URLアドレス ] } }, "protected": false,このユーザーは非公開設定か?$object[0]->user->protected "followers_count": 2,フォロワー数$object[0]->user->followers_count "friends_count": 17,フォロー数$object[0]->user->friends_count "listed_count": 0,リストに入った数$object[0]->user->listed_count "created_at": "Wed Jan 22 14:42:28 +0000 2014",アカウント作成日$object[0]->user->created_at "favourites_count": 1,このユーザーがお気に入りしたつぶやき数$object[0]->user->favourites_count "utc_offset": 32400,UTCとの時差$object[0]->user->utc_offset "time_zone": "Tokyo",タイムゾーン$object[0]->user->time_zone "geo_enabled": true,位置情報をつぶやきに含める設定をしているか?$object[0]->user->geo_enabled "verified": false,本人認証済みか?$object[0]->user->verified "statuses_count": 9,総つぶやき数$object[0]->user->statuses_count "lang": "ja",言語設定$object[0]->user->lang "contributors_enabled": false,ライター(複数人による投稿)機能を利用しているか?$object[0]->user->contributors_enabled "is_translator": false,翻訳ボランティアに参加しているか?$object[0]->user->contributors_enabled "is_translation_enabled": false, "profile_background_color": "C0DEED",プロフィールの背景色$object[0]->user->profile_background_color "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",プロフィールの背景画像URL$object[0]->user->profile_background_image_url "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",プロフィールの背景画像URL(https版)$object[0]->user->profile_background_image_url_https "profile_background_tile": false,背景をタイル(繰り返し)設定にしているか?$object[0]->user->profile_background_tile "profile_image_url": "http://pbs.twimg.com/profile_images/474552531817738240/GpXe2Lch_normal.jpeg",プロフィール画像URL$object[0]->user->profile_image_url "profile_image_url_https": "https://pbs.twimg.com/profile_images/474552531817738240/GpXe2Lch_normal.jpeg",プロフィール画像URL(https版)$object[0]->user->profile_image_url_https "profile_link_color": "0084B4",プロフィールのリンク色$object[0]->user->profile_link_color "profile_sidebar_border_color": "C0DEED",サイドバーのボーダー色$object[0]->user->profile_sidebar_border_color "profile_sidebar_fill_color": "DDEEF6",「重ねて表示」の色$object[0]->user->profile_sidebar_fill_color "profile_text_color": "333333",プロフィールの文字色$object[0]->user->profile_text_color "profile_use_background_image": true,プロフィールの背景画像を利用しているか?$object[0]->user->profile_use_background_image "default_profile": true,プロフィールページのデザインテーマはデフォルトか?$object[0]->user->default_profile "default_profile_image": false,プロフィール画像はデフォルトか?$object[0]->user->default_profile_image "following": false,アクセストークン主は、このユーザーをフォローしているか?$object[0]->user->following "follow_request_sent": false,アクセストークン主は、このユーザーにフォローリクエストを送っているか?$object[0]->user->follow_request_sent "notifications": falseアクセストークン主は、このユーザーつぶやきを通知設定しているか?$object[0]->user->notifications }, "geo": null,位置情報[1]$object[0]->user->geo "coordinates": null,位置情報[2]$object[0]->user->coordinates "place": null,場所情報$object[0]->user->place "contributors": null,ライター機能を利用した投稿か?$object[0]->user->contributors "retweet_count": 1,リツイートされた回数$object[0]->user->retweet_count "favorite_count": 0,お気に入りされた回数$object[0]->user->favorite_count "entities": {エンティティオブジェクト(内容は「[entities]を処理しよう!」を参照) "hashtags": [ハッシュタグ情報(配列形式) ], "symbols": [シンボルタグ情報(配列形式) ], "urls": [URLアドレス情報(配列形式) ], "user_mentions": [メンション情報(配列形式) ] }, "favorited": false,アクセストークンの主が、このつぶやきをお気に入りしたか?$object[0]->user->favorited "retweeted": false,アクセストークンの主が、このつぶやきをリツイートしたか?$object[0]->user->retweeted "lang": "ja"言語$object[0]->user->lang }, ...(2つ目、3つ目のつぶやきと続く) ]
4つぶやきを出力する
この章では、JSONデータを取り扱って、「リツイーツ・オブ・ミー(リツイートされたつぶやき)」の一覧を出力していきます。
4-1[entities]の処理方法
「Twitter APIの使い方」を読んできた人は、この説明にも飽きてきたかもしれません。JSON内のつぶやきデータ("text": "〜"
)は、リンクタグが付いていないプレーンテキストになっています。リンクを反映するにはエンティティオブジェクトを利用するんでしたね。
具体的な処理方法については、過去記事の「ホームタイムラインを取得する」で解説し、処理用の関数ライブラリ(twoh10_en_scr
)も作成しています。この後利用するので、まだの人は下記から入手して下さい。
4-2つぶやきの整形処理
用意ができたら、早速、ブラウザに出力する処理を記述していきましょう。といっても、過去に取り扱ってきた「つぶやきオブジェクト」と構造が変わらないので、今までのプログラムをそのまま利用することが可能です。
なお、今回はリツイートされたつぶやきのリストなので、27〜28行目に、「リツイートされた回数」を赤文字で表示する処理を加えてみました。
//ライブラリ[twoh10_en_scr()]の読み込み require_once './twoh10_en_scr.php'; //取得したJSONデータ[$data[0]]をオブジェクト形式に変換 $object = json_decode($data[0]); //HTMLのヘッダーを出力 echo '<meta name="charset" content="utf-8"><h1>リツイーツ・オブ・ミー</h1>'; //つぶやきデータの配列をループ処理 foreach($object as $item){ //通常のつぶやきか、公式リツイートで取り扱うデータなどを振り分ける if(isset($item->retweeted_status) && !empty($item->retweeted_status)){ $obj = $item->retweeted_status; $head = '[@'.$obj->user->screen_name.'さんがRT] '; }else{ $obj = $item; $head = ''; } //返信の場合、冒頭に元記事へのリンクを付ける if(isset($obj->in_reply_to_status_id) && !empty($obj->in_reply_to_status_id) && isset($obj->in_reply_to_screen_name) && !empty($obj->in_reply_to_screen_name)){ $head .= ' [<a href="https://twitter.com/'.$item->in_reply_to_screen_name.'/status/'.$item->in_reply_to_status_id.'" target="_blank">@'.$item->in_reply_to_screen_name.'さんへの返信</a>] '; } //何回リツイートされたかを表示 $head .= '<span style="color:#f00;">['.$obj->retweet_count.'RT]</span> '; //名前・スクリーンネーム・アイコン画像 $name = $obj->user->name; $screen_name = $obj->user->screen_name; $icon = $obj->user->profile_image_url; //つぶやき・投稿日時(整形) $text = $head.twoh10_en_scr($obj->text,$obj->entities); $date = date('Y/m/d H:i:s',(strtotime($obj->created_at))); //位置情報を付けている場合、リンクを追加 if(isset($obj->place->full_name) && !empty($obj->place->full_name)){ //場所名 $place_name = $obj->place->full_name; //座標情報があればGoogle Mapsへのリンクを付ける if(isset($obj->geo->coordinates[1]) && !empty($obj->geo->coordinates[1])){ $place_name = '<a href="https://www.google.co.jp/maps/place/'.$obj->geo->coordinates[0].','.$obj->geo->coordinates[1].'" target="_blank">'.$place_name.'</a>'; } //つぶやきに追加 $text .= ' ['.$place_name.']'; } //添付ファイルがある時はサムネイル画像を表示させる if(isset($obj->extended_entities->media) && !empty($obj->extended_entities->media)){ $text .= '<br>'; foreach($obj->extended_entities->media as $media){ $text .= '<a href="'.$media->media_url.'" target="_blank"><img src="'.$media->media_url.':thumb" width="150" height="150"></a>'; } } //出力 echo '<img src="'.$icon.'" width="50" height="50"> @'.$screen_name.'('.$name.') '.$text.' ('.$date.')<hr>'; }
4-3デモを確認する
出力すると、自分(アクセストークンの主)のつぶやきの中から、リツイートされたものだけが表示され、さらにそれぞれの「リツイートされた回数」も赤文字で確認することができます。デモを見たい人は下記ページよりどうぞ。
5完成版プログラムの配布
お疲れ様でした。この記事で作成した、「リツイーツ・オブ・ミー」の取得から出力までを取り扱ったサンプルプログラムを配布しているので、確認用にお使い下さい。
5-1リツイーツ・オブ・ミーの取得(PHP)
「リツイーツ・オブ・ミー」を取得、出力するプログラム(PHP)です。単体動作版と、外部ライブラリ利用版を用意しているので、お好きな方をダウンロードして下さい。
5-2関数ライブラリ:twoh10_en_scr()
「外部ライブラリ利用版」に必要です。プレーンテキストのつぶやきデータを、[entities]を利用してリッチテキストに変換する関数ライブラリです。過去記事の「ホームタイムラインを取得する」で、仕組みと使い方を解説しています。
5-3関数ライブラリ:twoh10_scr()
「外部ライブラリ利用版」に必要です。Twitter APIで必要なOAuth1.0認証を処理し、「JSONデータ」と「レスポンスヘッダー」の情報を返却する関数ライブラリです。過去記事の「OAUth認証用のライブラリを作ろう」で仕組みと使い方を解説しています。
6今回のまとめ
いかがでしたか?連載を順番に読み進めてきた人にとっては、今までの応用、というよりほぼ今まで通りの内容だったので、難しいことはなかったと思います。今回で「つぶやきリスト」を取得、整形して出力するタイプのリクエストは終了です。次回からは、他の様々なリクエストを見ていきましょう。それでは!
Twitter API
この記事へのコメント
感想、ご指摘などお気軽にお寄せ下さい。「関連記事を書いた」という方はご報告いただければリンクします。
記事の更新履歴
- 記事を公開しました。
2014/08/16 18:30
※Twitter、Facebook、はてな、いずれかのアカウントをお持ちの方は、本人認証(ログイン)を行なうことができます。
※本人認証をすることで、書き込みの待ち時間なし、画像アップロード、アイコンなどが利用できます。
※認証時にサービスと連携しますが、名前とアイコン以外の情報を読み込んだり、また書き込みを行なうことはありません。連携で要求する権限は「公開情報の読み取り」のみです。
コメントは、0件です。