TwitterAPIの仕様上、つぶやきに添付された画像は、複数取得することができます。
On May 28th PDT (UTC-7) we will launch support for composing tweets with multiple images via the REST API. Details: https://t.co/XB1rnLfFmo
— Twitter API (@twitterapi) 2014, 5月 22
しかし、単数の画像は取得することができましたが、複数画像はどうやって取得すればいいのか分からず、かなり悩んでいました。
- Twitterの検索APIの画像を取得するために実体化するPHPのコード。[‘entities’][‘media’][‘media_url’]について
- Twitter REST API1.1のGET statuses/user_timelineで画像の取得にチャレンジ。単数の画像は取れましたが複数画像は取れませんでした…
個人的な希望で、何としても複数画像を取得したいので、詳しい方にオフラインでアドバイスを頂きました。
単数画像を取得するコードと複数画像を取得するコード
とりあえず先に結論となるコードを示しておきましょう。
単数画像を取得するときのコード
[php]
<img src="<?php echo $tweet->entities->media[0]->media_url; ?>
[/php]
複数画像を取得するときのコード
[php]
<?php if (is_array($tweet->extended_entities->media)) { ?>
<?php foreach($tweet->extended_entities->media as $key => $media) { ?>
<?php if (isset($tweet->extended_entities->media[$key])) { ?>
<img src="<?php echo $tweet->extended_entities->media[$key]->media_url; ?><?php echo ‘:thumb’;?>"></br>
<?php } ?>
<?php } ?>
<?php } ?>
[/php]
コードの比較
単数画像を取得するときと比べて、複数画像を取得するときは、ずいぶんと複雑になっていますね。比較のポイントは4つあります。
1.entitiesとextended_entities
オブジェクト形式で取り出した、$tweetの次の階層が両者で異なります。単数のときはentitiesで、複数のときは、extended_entitiesです。後者で”extended”という名前がついているのは、「拡張した」という意味なんでしょう。
2.配列の値変数とキー変数の設定
そもそも単数画像を取得するときは、配列の中身は1つしかありません。従ってキー値はおのずと[0]だけになります。
一方、複数の画像のときは、配列の中身は複数あります。値変数($media)をキー変数($key)に入れて、”media_url”を複数取り出せるようにする必要があります。そのため、繰り返し構文のforeach文でくくります。
3.isset関数による配列定義の検査
imgタグのsrc属性で、media_urlを出力する前に、if文の中で、isset関数で条件文を設定しています。
これは、”$tweet->extended_entities->media[$key]”が、配列であるかどうかをチェックするためのものです。
もし配列の中身がなかったときに、isset関数がなければ、エラー”Warning”が返されます。isset関数でチェックをかけておくと、配列の中身がなくても(null値)、falseが返されるだけになります。
4.is_array関数による配列の検査
さらにforeach文による繰り返しを実行する前に、”$tweet->extended_entities->media”の、”media”が配列であるかどうかをチェックします。is_array関数による配列の検査がないと、次のようなエラーが表示されます。
Warning: Invalid argument supplied for foreach() in..
複数画像の出力
ここまでの説明で複数画像を出力するとこんな感じになります。画像のサイズは”thumb(150m×150m)”にしています。
他に取り出せる画像のサイズは、”medium”,”small”,”large”があります。
〔参考サイト〕