Twitterに投稿される画像だけ集めたギャラリーサイトなど面白いのではないかと思い、ツイートに含まれる画像のURLを取得する方法について調べてみました。
テストがてら簡単につくったものですが、たとえば「須磨」という単語が含まれた写真付きのツイートを検索した結果はこのようになります。
(´-`).。oO(夏休みですね。。。。。。)
ADs
TwitterAPIが1.1になってからしばらくになりますが、単なる検索結果を得るためだけでも認証が必要となりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
//TwitterOAuthを使う //https://github.com/abraham/twitteroauth require_once 'twitteroauth/twitteroauth.php'; //設定 $keyword = "";//検索キーワード 「http」をAND検索するとより確実なように思う $consumerKey = "カスタマーキー"; $consumerSecret = "カスタマーシークレット"; $accessToken = "アクセストークン"; $accessTokenSecret = "アクセストークンシークレット"; //認証 $connection = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret); //検索結果の取得($stringはJSONの検索結果が入る) $string = $connection->OAuthRequest( 'https://api.twitter.com/1.1/search/tweets.json', 'GET', array( "q"=>rawurlencode($keyword), //検索キーワード "result_type"=>"recent", //新着順に取得 "count"=>100, //取得件数(100件が上限) "include_entities"=>true //trueにすると添付URLについての情報を追加で取得できる ) ); if($string){ //検索結果をjson_decodeで配列にしてforeach $obj = json_decode($string); foreach ($obj->statuses as $statuses) { //ここで出力させたりDBに登録したりいろいろ・・・。 } } |
上記検索を実行の際、include_entitiesというパラメータをtrueに設定することによりツイート内に含まれるURLについての情報を追加で取得することができます。
詳しくはTweet Entitiesという公式ドキュメントを見てみてください。
画像でないURLについての情報も取得出来ますが、今回は画像に絞って見てみます。
タイムラインを見ていて画像投稿によく使われている(っぽく見える)、
・Twitter標準の画像投稿機能
・Twitpic
・ついっぷる
・フォト蔵
・Instagram
について画像URLの取得方法を調べてみました。
外部サービスを経由せずに画像を投稿した場合、画像そのもののURLが「media_url」というキーで取得できます。
上記の検索基本形のように$obj->statusesをforeachでループした場合、以下のように取得できます。
1 2 |
//Twitter標準の画像添付機能(p.twimg.comというアドレスのやつ) $img = $statuses->entities->media[0]->media_url; |
ただ、外部の画像投稿サービスを利用した場合はmedia_urlでは取得することができません。
代表的jな画像投稿サービス別に、取得方法を調べてみました。
TwitPicの場合、URLの一部を置換することで画像そのもののURLが取得できます。
Twitter標準ではない画像投稿を使った場合、expanded_urlというキーにリンク先URLが入ります。ただこれは画像のURLではなく詳細ページ(という言い方でいいのでしょうか・・・)のURLですので、そのURLより画像URLを取得する必要があります。
1 2 3 4 5 6 7 |
$img = $statuses->entities->urls[0]->expanded_url; //URLを「twitpic.com/show/full/ID」とすることで画像の直リンクが取得できる。 //「full」を「thumb」にすればサムネイルサイズが取得できます。 if(strpos($img,'twitpic') != 0){ $img = str_replace('twitpic.com/','twitpic.com/show/full/',$img); } |
ついっぷるの場合もTwitpicと同様に、URLの一部を置換することで画像URLが取得できます。
1 2 3 4 |
$img = $statuses->entities->urls[0]->expanded_url; if(strpos($img,'twipple') != 0){ $img = str_replace('twipple.jp/','twipple.jp/show/large/',$img); } |
フォト蔵もほぼ同様ですが、フォト蔵の場合は写真掲載URLにはユーザーIDが含まれますが画像URLにはユーザーIDが含まれません。そのユーザーIDの部分を除く必要があります。
1 2 3 4 |
$img = $statuses->entities->urls[0]->expanded_url; if(strpos($img,'photozou') != 0){ $img = preg_replace('/photozou.jp\/photo\/show\/[0-9]*\//','photozou.jp/p/img/',$img); } |
InstagramはURLを単純な置換で取得することが出きず、必要ない場合でもJSONが返却されます。
そこでそのJSONをfile_get_contents→json_decodeという手順が必要です(URL取得だけならjson_decodeではなくpreg_matchなどのほうがいいような気もするが)。
1 2 3 4 5 6 7 |
$img = $statuses->entities->urls[0]->expanded_url; if(strpos($img,'instagram.com/p/') != 0){ $instaurl = 'http://api.instagram.com/oembed?url=' . $img; $instajson = file_get_contents($instaurl); $json = json_decode($instajson); $img = $json->url; } |
ADs
大変参考になりました。
ありがとうございました!
とても参考になりました!
ありがとうございます!
すいません、1つお伺いしてもよろしいですか?
この方法で、「Twitter標準の画像アップロードの場合」のときは、画像URL以外も拾ってしまいます。
例えばただのリンクの場合も拾ってしまいますが、
「画像」という判定はできるのでしょうか。
よろしくお願いします。
れい 様
コメントありがとうございます。
mediaというキーが入るのはTwitter標準の画像アップロードだけのはずなのですが、おかしいですね。。。
Twitter標準の画像アップロードのときは
$statuses->entities->media[0]->media_url;
で、それ以外は
$statuses->entities->urls[0]->expanded_url;
となりますが間違いはないでしょうか?
「須磨」という単語が含まれた写真付きのツイートを検索した結果はこのようになります
画像1枚もでてきませんけど。
アクセストークンを削除してしまってましたのでサンプルが動いてませんでした。修正しました。