復興ログ

未来の被災地にいるアナタと数十年後のキミたちへ。すべての記録を残します。

Facebookのオフラインアクセストークンを得る方法

FacebookPHPSDKのバージョンが1年前とは変わっていたのでメモです。2011年8月30日現在 v.3.1.1
オフラインのアクセストークン(access_token)を得ることで何が出来るようになるかというと。Facebookアプリにユーザの権限を委譲してウォールに書きこむ事が出来るようになります。オリジナルアプリの基本的動作を実現することができます。

1.SDKをダウンロードする

最新版のSDKをGitHubから落とします
https://github.com/facebook/php-sdk

2.アプリへの権限委譲画面の出力

アプリを登録します。
https://developers.facebook.com/apps

登録したらApp IDとアプリの秘訣(secret)をメモります。

以下のアプリをサーバへ転送します。

<?php
require 'php-sdk/src/facebook.php';

$facebook = new Facebook(array(
  'appId'  => 'YOUR_APP_ID',
  'secret' => 'YOUR_APP_SECRET',
));

// Get User ID
$user = $facebook->getUser();

// To make API calls:
if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}

// Login or logout url will be needed depending on current user state.
if ($user) {
  $logoutUrl = $facebook->getLogoutUrl();
  echo $facebook->getAccessToken();
  echo '<br>';
  echo $logoutUrl;
} else {
  // アプリに委譲する権限を記述します
  $loginUrl = $facebook->getLoginUrl(array(
     'scope' => 'status_update,publish_stream,manage_pages,offline_access'
   ));
  echo $loginUrl;
}
?>

権限を委譲したいユーザでfacebookへログインし、上記アプリにブラウザでアクセスします。すると、ログインURLが出力されるので、そのURLにアクセスします。見慣れたアプリへの権限委譲の画面が出力されるので、承認してあげればOK。
ポイントは

  $loginUrl = $facebook->getLoginUrl(array(
     'scope' => 'status_update,publish_stream,manage_pages,offline_access'
   ));

以前のreq_permsからscopeという記述に変わりました。変わりすぎ・・・。
ここで与えられる権限はこの辺を参考にしてください。アプリに与えた権限を削除したいときには、プライバシー設定のアプリとウェブサイトのリンクから該当アプリを削除してください。スコープの与え方を失敗した場合には削除して、もう一回委譲画面を出して、権限を与えてください。セキュリティーを考えると必要のないスコープは与えない方が良さそうですね。。
ここまでやると、アプリにオフラインでの書き込み権限を委譲したことになります。

3.アクセストークンを得る

アプリへの権限の委譲が完了したら、もう一度上記アプリにブラウザでアクセスします。すると、委譲が済んでいるので、アクセストークンを得ることができます。
ポイントは

  $facebook->getAccessToken();

このメソッドです。このメソッドを呼ぶことで、有効期限が無期限のオフラインアクセストークンを得ることができます。

オフラインアクセストークンの使用例

例えば、自分が管理しているfacebookページへアプリから投稿させることが出来ます。

<?php
require 'php-sdk/src/facebook.php';

$facebook = new Facebook(array(
  'appId'  => 'YOUR_APP_ID',
  'secret' => 'YOUR_APP_SECRET',
));

$facebook->setAccessToken("上で得たオフラインアクセストークン");

$userProfile = $facebook->api('/me/accounts');
// 投稿対象のfacebookページのID(数字)
$pagesId = '***************';
foreach($userProfile['data'] as $data){
	if($data['id'] == $pagesId){
		$user_token = $data['access_token'];
		break 1;
	}
}

$title = '石巻市役所';
$link = 'http://www.city.ishinomaki.lg.jp/';
$urlEnc = urlencode($link);
$actionUrl = 'http://facebook.com/sharer/sharer.php?u=' . $link;
$attachment = array(
	'picture'=>'画像URL',
	'link'=>$link,
	'name'=>$title,
	'caption'=>'キャプション',
	'actions'=>array('name'=>'シェアする','link'=>$actionUrl),
	'access_token'=>$user_token,
);
$statusUpdate = $facebook->api("/$pagesId/feed", 'post', $attachment);

?>

たぶん、これでいくはず。。
オフラインアクセストークンを使って、facebookページに投稿するためのトークンを得る処理をします。foreachでぐるぐる回しているところ。ここの$user_tokenで投稿することで、facebookページとしてウォールに投稿することが可能になります。
通常のアプリ?であれば、このオフラインアクセストークンをDBやらに保持して書き込みに行くんでしょうね。やったことないけど。。なので、オフラインアクセスの権限を与えるときは慎重に!ということですね。アプリを作る側も注意しないといけませんね。

上記アプリが動かなかったらご連絡ください。又は、もっと簡単な投稿方法があったら教えて下さい><
よろしくお願いしますー。