MENU

facebookのPHP-SDKを使わずに自力でフォトアップロード(アルバムに3連投)。

よく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枚画像テンプレートを販売してますので何卒。