PHP: バージョンアップできなくて使えない関数がある時の対応
2012年04月20日 16時03分
PHPがバージョンアップされて関数が増えたがサービスを停止するわけにもいかずPHPのバージョンアップができず使用できない。
こんな状況はないだろうか。
俺の場合は具体的にjson_decodeが使いたい。
でないとFacebookのSDKがFacebook needs the JSON PHP extensionってエラーが出て使用できない。
なんとかしたいなぁと思っていたらupgradephpというライブラリを発見した。
upgradephp
http://include-once.org/p/upgradephp/
バージョンアップされて追加された関数が定義されていない場合、追加されるという代物。
これインクルードしてからFacebookのSDKをインクルードしたらjson_decodeが定義されて問題なく処理できた。
こんなんあったんかぁ、素晴らしい。
ついでにFacebookが返すマルチバイト文字形式の\uxxxx形式が文字化けするので以下の関数をjson_decodeする前に通す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
// UTF-8文字列をUnicodeエスケープする。ただし英数字と記号はエスケープしない。 function unicode_encode($str) { return preg_replace_callback("/((?:[^\x09\x0A\x0D\x20-\x7E]{3})+)/", "encode_callback", $str); } function encode_callback($matches) { $char = mb_convert_encoding($matches[1], "UTF-16", "UTF-8"); $escaped = ""; for ($i = 0, $l = strlen($char); $i < $l; $i += 2) { $escaped .= "\u" . sprintf("%02x%02x", ord($char[$i]), ord($char[$i+1])); } return $escaped; } // Unicodeエスケープされた文字列をUTF-8文字列に戻す function unicode_decode($str) { return preg_replace_callback("/\\\\u([0-9a-zA-Z]{4})/", "decode_callback", $str); } function decode_callback($matches) { $char = mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UTF-16"); return $char; } |
facebook:fan pageのウォールに投稿された画像を一覧表示する
2012年04月16日 11時07分
ファンページのウォールに投稿した画像を自分のサイトに表示したいという要望があった。
上記ぐらいだったらSDK使わずに直にGraph APIのURL叩く方式で問題なく実装できたのでそのメモ。
アルバム一覧取得のAPI URL
http://graph.facebook.com/[ファンページID]/albums/
上記のURLを叩くとアルバム一覧がJSON形式で帰ってくるのでその一覧の中でtype属性がwallのデータのアルバムIDを取得する。
|
$album_list_cont = file_get_contents("http://graph.facebook.com/[ファンページID]/albums/"); $js = new Services_JSON(SERVICES_JSON_LOOSE_TYPE); $albums_arr = $js->decode($album_list_cont); if (!empty($albums_arr["data"])) { foreach($albums_arr["data"] as $crt_album) { if ($crt_album["type"] == "wall") { // ウォールに投稿されたデータ // $crt_album["id"]にアルバムIDが入っているので保持しておく } } } |
※PHPのバージョンが古いためjson_decodeが使えないのでPearのライブラリを使用している
次はalbumから画像を取得する手順。
アルバム一覧取得のAPI URL
http://graph.facebook.com/[アルバムID]/photos?limit=25&offset=0&fields=images
上のURLを叩くと画像一覧が取得できる。
offsetやfieldsパラメータは適せん変更するべし。
一回で取得できなかった場合は[paging][next]というパラメータに続きを取得するパラメータが入ってくるので拾うこと。
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
|
$photos_cont = file_get_contents("http://graph.facebook.com/[アルバムID]/photos?limit=25&offset=0&fields=images"); $photos_arr = $js->decode($photos_res); $next_page_url = "first url"; while ($next_page_url != "") { $next_page_url = ""; foreach($photos_arr as $crt_photo_key => $crt_photo_val) { switch ($crt_photo_key) { case "paging": $next_page_url = isset($crt_photo_val["next"]) ? $crt_photo_val["next"] : ""; break; case "data": $crt_image_arr = get_image_infos($crt_photo_val, $thumb_size_set); $image_arr = array_merge($image_arr, $crt_image_arr); break; default: break; } } if ($next_page_url != "") { $photos_res = file_get_contents($next_page_url); $photos_arr = $js->decode($photos_res); } } // とりあえずブラウザ表示 for ($img_idx = 0 ; $img_idx < count($image_arr) ; $img_idx ++) { echo "<img src='{$image_arr[$img_idx]['source']}' />\n"; } |
サンプルURL
http://www.crossl.net/blog/pg_sample/fb_album_image/wall_images.php
※うちの会社のブランドです。
別にアルバムを作ってしまうとtypeがwallではなくnormalになるのでこの方法では取得できない。
あくまでアルバムwallの画像一覧になる。
Webの資料を調べるけど結局は本家が一番わかりやすいという罠。(英語ですが…)
Graph API参考
http://developers.facebook.com/docs/reference/api/album/