よくfacebookを使ったキャンペーンで使われる、アルバムを使ったプロモーション。
こんなヤツ。ほんと何度も言いますが、PHP-SDK使えば超カンタンだぜ!的に書いたんですが、PHP5.2未満のお客様って〜のはまだまだいるんですよね〜。
てわけで、またもや自力で実装してみました。
※セキュリティに関する部分とかチェックとかは省略しているので、そのままコピペで使っちゃダメですよん。
まずは共通で使うパラメータを設定。
define('FACEBOOK_KEY', '123456789012345'); define('FACEBOOK_SECRET', '123456789abcdef123456789abcdef12'); define('FACEBOOK_CONNECT', 'http://test.com/_connect.php');
3行目は、アプリ登録時に指定したものでよければ、なくてもOK。
次にログインURLを取得。
//facebookログイン用URLを取得 session_start(); $_SESSION['facebook_state'] = md5(uniqid(rand(), TRUE)); $authorize_url = 'https://www.facebook.com/dialog/oauth?' . 'client_id='. FACEBOOK_KEY . '&redirect_uri='. rawurlencode(FACEBOOK_CONNECT) . '&scope='. rawurlencode('publish_stream') . '&state='. $_SESSION['facebook_state']; echo $authorize_url;
次は、facebookの認証ページから帰ってきたときの処理。
session_start(); if ($_GET['state'] == $_SESSION['facebook_state']) { $token_url = 'https://graph.facebook.com/oauth/access_token' . '?client_id='. FACEBOOK_KEY . '&redirect_uri='. urlencode(FACEBOOK_CONNECT) . '&client_secret='. FACEBOOK_SECRET . '&code='. $_GET['code']; $response = file_get_contents($token_url); $params = NULL; parse_str($response, $params); $_SESSION['facebook_access_token'] = $params['access_token']; }
これでアクセストークンをゲット。
で、次に、アルバムの作成。作成せずにフォトアップロードを(/me/photos)でもOKなんだけど、そうするとアルバム名が「アプリ名 Photo」となっちゃう。プロモーションとしては成り立たないので、事前にアルバムを作成しましょうね。
session_start(); if ($_SESSION['facebook_access_token']) { try { require_once 'HTTP/Request2.php'; $request = new HTTP_Request2(); $request->setConfig('ssl_verify_peer', FALSE); $request->setUrl('https://graph.facebook.com/me/albums'); $request->setMethod(HTTP_Request2::METHOD_POST); $request->addPostParameter(array( 'name' => 'ほげふがキャンペーン : '. date('Y-m-d H:i:s'), 'message' => 'ほげふがではこんなキャンペーンやっとるですよ→http://test.com/', 'access_token' => $_SESSION['facebook_access_token'], )); $result = $request->send(); } catch(HTTP_Request2_Exception $e) { echo "Error: {$e->getMessage()}\n"; } catch (Exception $e) { echo "Error: {$e->getMessage()}\n"; } if (isset($result)) { $album_response = $json->decode($result->getBody()); if (isset($album_response->error)) { echo "Error: {$album_response->error->message}\n"; } else { echo "アルバムID: {$album_response->id}\n"; } } }
これでアルバムIDが取得できました。次に写真を3枚連投します。
for ($i = 0; $i < 3; $i++) { try { $request->setUrl("https://graph.facebook.com/{$album_response->id}/photos"); $request->setMethod(HTTP_Request2::METHOD_POST); $request->setHeader('content-type', 'multipart/form-data'); //サーバでの写真画像へのパスを指定 $request->addUpload('image', '/var/www/hogefuga/photo'. ($i+1). '.jpg', NULL, 'image/jpeg'); $post_parameter = array( 'name' => 'フォトネーム : '. date('Y-m-d H:i:s'), 'message' => 'テストフォト : '. date('Y-m-d H:i:s'), 'access_token' => $_SESSION['facebook_access_token'], ); $request->addPostParameter($post_parameter); $result = $request->send(); } catch(HTTP_Request2_Exception $e) { echo "Error: {$e->getMessage()}\r\n"; } catch (Exception $e) { echo "Error: {$e->getMessage()}\r\n"; } if (isset($result)) { $photo_response = $json->decode($result->getBody()); if (isset($photo_response->error)) { echo "Error: {$photo_response->error->message}\r\n"; } else { echo "Done: {$photo_response->id}\r\n"; } } }
こげな感じでどげんですかね〜。2011年の秋頃から、facebookのUIが変わって、スクウェア3枚並びがカバー写真が一番大きくなって表示されるようになりました。しかしながらスマホ版のfacebookアプリなんかはまだスクウェア3枚並びのまんま。写真の扱い方が難しくなってますね、知らんけど。
ちなみにGumroad - facebookアルバム投稿用3枚画像テンプレートを販売してますので何卒。