This page is under 旅聯網系統更新日誌.
目的:改進現有「將一般網站的成員活動訊息,自動發布到同名的Facebook粉絲專頁塗鴉牆」的方式。主要是配合OAUTH2.0與使用Graph API。
摘要:
- 2018.5.23 在步驟2,redirect_uri若是首頁,必須加上 “/”,否則會出現 Error validating verification code 的錯誤。
- 2018.3.21 在步驟2,redirect_uri必須包含在應用程式網域中,否則會出現無法載入網址的錯誤訊息,參考資料六。
- 2013.5.18 本來只要publish_actions就可以涵括publish_stream,但昨天開始(2013.5.17)之後突然出現權限不夠的問題。解決的方式是仍要加上publish_stream。而publish_stream同時會賦予upload_video等權限,而publish_actions則不會。
- 2013.4.30 解決了管理粉絲頁accessToken會過期的問題。但如果只是取得一次性token以發佈到user wall,應參考這篇作法。
- 2013.3.6 accessTokenu延長兩個月後也還是過期,無法以程式自動延長,只能手動重新申請一個。參考這裡
- 2013.1.3 以offline_access取得的accessToken也會過期,原因是offline_access已經被廢棄。解決的方式是延長accessToken的期限,參考資料五。另外權限取得改為publish_actions, publish_stream, manage_pages
- 2011.12.19 網站與粉絲專頁的塗鴉牆的訊息發布,原本使用php sdk 1.5版的 REST api,調整成使用3.01版。取得user認證、app授權、app認證的方式亦一併調整。
- 大抵而言簡化了認證授權的程序。
- 不過如果要以粉絲專頁的身分將網站訊息發布到粉絲專頁的塗鴉牆,似乎仍需要將sesseion的資訊保存下來,而且要取得offline access的權限。因此如果要將訊息發布到粉絲專頁,至少要有publish_actions, publish_stream, manage_pages, offline_access。
- accessToken取代了session
步驟:
- 下載php-sdk與安裝到網站去。參考資料1
取得user認證、app授權,參考資料2。=>改從 Graph API Explorer 取得 app 有 manage_pages 權限的ACCESSTOKEN(2023.6.1 updated)。
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL
&scope=publish_actions,publish_stream,manage_pages&response_type=token在回返的網頁(redirect_uri)的網址列,會看到accessToken。把這個值記下來。http://YOUR_URL#access_token=ACCESSTOKEN&expires_in=5XXX
(expires_in的值不再是0,2013.1.3 remarked)- 2013.1.3 延長這個 ACCESSTOKEN 的期限至兩個月:
https://graph.facebook.com/oauth/access_token?
client_id=APP_ID&
client_secret=APP_SECRET&
grant_type=fb_exchange_token&
fb_exchange_token=EXISTING_ACCESS_TOKEN - 開始寫php程式,初始化facebook物件
require 'facebook.php';
$facebook = new Facebook(array('appId' => APPID,'secret' => APPSECRET,));
$facebook->setAccessToken(ACCESSTOKEN); //剛剛記下來的那個值 - 準備要發布到塗鴉牆的資料,可參考資料4。注意picture的位址資料型態一定要是字串,不能直接把資料庫抓出來的值塞給他。另外actions,不能塞null或是空字串,否則都無法正確發佈。注意,若將picture的位置置於name與link之前,有可能導致發佈到塗鴉牆上的圖片不能顯示出來。
$message = "發佈的訊息標題";
$action_links = array(
array(
'name' => "動作",
'link' => "動作的連結"
)
);
$postdata = array(
//'access_token'=>ACCESSTOKEN,
'message'=> $message,
'name' => "連結的標題,出現在訊息標題下方",
'link' => "連結的位址",
'picture'=>""連結的影像,
'description' => "連結的描述",
'actions'=> json_encode($action_links)
); - 呼叫api發佈到塗鴉牆
$facebook->api('/粉絲專頁id/feed', 'POST' ,$postdata);
也可以使用curl來呼叫Graph API,但必須伺服器端有安裝curl程式庫才行,而且記得要把accessToken放到 $postdata中
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://graph.facebook.com/粉絲專頁id/feed');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
$response = curl_exec($ch); 但這樣做之後雖可發佈訊息,但發佈的人卻變成粉絲專頁的管理者帳號,而非以粉絲專頁的身分發表。參考資料4。解決的方式是取得用步驟3的accessToken再去取得粉絲專頁的accessToken。參考資料2的Page Login。以下步驟將會傳回這個user帳號所管理的粉絲專頁一覽。把其中的accessToken 取出,取代步驟4之後的accessToken的值即可。,以上已經廢棄(2013.1.4);將所取得粉絲專頁的acessToken拿來用時,會出現錯誤訊息:actor不能做為….之類的錯誤訊息。所以有可能會出現以專頁的管理者身分來po文。但是若是在發布的訊息資料中,指定actions仍可變成以粉絲專頁身分來發文。如:https://graph.facebook.com/me/accounts?access_token=TOKEN_FROM_ABOVE
$postdata = array( 'message'=> $message, 'name' => $name, 'link' => $link, 'picture' => $imgstr, 'description' => $description, 'actions'=> json_encode($action_links) );
關於accessToken兩個月會過期的問題,可在refresh wall的程式碼中,加上2013.3.6 以上是無效的,60天到了之後accessToken仍會過期,而且似乎無法在程式中自動延長。如此在60天之內,必須再重複做一次申請Token,延長Token的動作,參考這篇文章。$facebook->setExtendedAccessToken();
,但必須先將php sdk更新到2012.8.14以後的版本。- 2013.4.30 找到管理粉絲專頁accessToken會過期的解法了,參考這一篇的scenario 5,取得長天期的accessToken後,必須再以graph api去query [User ID]/accounts,以取得所管理的專頁的accessToken,而這個accessToken就真的永遠不會過期了。簡單作法是在Graph API explorer中,輸入原取得的長天期accessToken,再執行 /[User ID]/accounts,就會看到所管理的粉絲頁的永不過期的accessToken
參考資料:
- php-sdk : http://developers.facebook.com/docs/reference/php/
- app認證授權 : http://developers.facebook.com/docs/authentication/
- Graph api about post : http://developers.facebook.com/docs/reference/api/post/
- How To: Post On Facebook Page As Page Not As Admin User Using PHP-SDK : http://www.masteringapi.com/tutorials/how-to-post-on-facebook-page-as-page-not-as-admin-user-using-php-sdk/31/
- 延長accessToken的期限兩個月:http://stackoverflow.com/questions/8982025/how-to-extend-access-token-validity-since-offline-access-deprecation
- FB Graph 登入 API Error 需要確認 redirect_uri 的問題修復 (v2.10)