Feed on
Posts
Comments
Email訂閱

目的:改進現有「將一般網站的成員活動訊息,自動發布到同名的Facebook粉絲專頁塗鴉牆」的方式。主要是配合OAUTH2.0與使用Graph API。

摘要:

  1. 2013.5.18 本來只要publish_actions就可以涵括publish_stream,但昨天開始(2013.5.17)之後突然出現權限不夠的問題。解決的方式是仍要加上publish_stream。而publish_stream同時會賦予upload_video等權限,而publish_actions則不會。
  2. 2013.4.30 解決了管理粉絲頁accessToken會過期的問題。但如果只是取得一次性token以發佈到user wall,應參考這篇作法
  3. 2013.3.6 accessTokenu延長兩個月後也還是過期,無法以程式自動延長,只能手動重新申請一個。參考這裡
  4. 2013.1.3 以offline_access取得的accessToken也會過期,原因是offline_access已經被廢棄。解決的方式是延長accessToken的期限,參考資料五。另外權限取得改為publish_actions, publish_stream, manage_pages
  5. 網站與粉絲專頁的塗鴉牆的訊息發布,原本使用php sdk 1.5版的 REST api,調整成使用3.01版。取得user認證、app授權、app認證的方式亦一併調整。
  6. 大抵而言簡化了認證授權的程序。
  7. 不過如果要以粉絲專頁的身分將網站訊息發布到粉絲專頁的塗鴉牆,似乎仍需要將sesseion的資訊保存下來,而且要取得offline access的權限。因此如果要將訊息發布到粉絲專頁,至少要有publish_actions, publish_stream, manage_pages, offline_access。
  8. accessToken取代了session

步驟:

  1. 下載php-sdk與安裝到網站去。參考資料1
  2. 取得user認證、app授權,參考資料2。
    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
  3. 在回返的網頁(redirect_uri)的網址列,會看到accessToken。把這個值記下來
    http://YOUR_URL#access_token=ACCESSTOKEN&expires_in=5XXX(expires_in的值不再是0,2013.1.3 remarked)
  4. 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
  5. 開始寫php程式,初始化facebook物件require 'facebook.php';
    $facebook = new Facebook(array('appId' => APPID,'secret' => APPSECRET,));
    $facebook->setAccessToken(ACCESSTOKEN); //剛剛記下來的那個值
  6. 準備要發布到塗鴉牆的資料,可參考資料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)
    );
  7. 呼叫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);
  8. 但這樣做之後雖可發佈訊息,但發佈的人卻變成粉絲專頁的管理者帳號,而非以粉絲專頁的身分發表。參考資料4。解決的方式是取得用步驟3的accessToken再去取得粉絲專頁的accessToken。參考資料2的Page Login。以下步驟將會傳回這個user帳號所管理的粉絲專頁一覽。把其中的accessToken 取出,取代步驟4之後的accessToken的值即可。https://graph.facebook.com/me/accounts?access_token=TOKEN_FROM_ABOVE,以上已經廢棄(2013.1.4);將所取得粉絲專頁的acessToken拿來用時,會出現錯誤訊息:actor不能做為….之類的錯誤訊息。所以有可能會出現以專頁的管理者身分來po文。但是若是在發布的訊息資料中,指定actions仍可變成以粉絲專頁身分來發文。如:
    $postdata = array(
      	'message'=> $message,
    	'name' => $name,
    	'link' => $link,	  				
            'picture' => $imgstr,                    
            'description' => $description,
    	'actions'=> json_encode($action_links)
    );
  9. 關於accessToken兩個月會過期的問題,可在refresh wall的程式碼中,加上$facebook->setExtendedAccessToken();,但必須先將php sdk更新到2012.8.14以後的版本。2013.3.6 以上是無效的,60天到了之後accessToken仍會過期,而且似乎無法在程式中自動延長。如此在60天之內,必須再重複做一次申請Token,延長Token的動作,參考這篇文章
  10. 2013.4.30 找到管理粉絲專頁accessToken會過期的解法了,參考這一篇的scenario 5,取得長天期的accessToken後,必須再以graph api去query [User ID]/accounts,以取得所管理的專頁的accessToken,而這個accessToken就真的永遠不會過期了。簡單作法是在Graph API explorer中,輸入原取得的長天期accessToken,再執行 /[User ID]/accounts,就會看到所管理的粉絲頁的永不過期的accessToken

參考資料:

  1. php-sdk : http://developers.facebook.com/docs/reference/php/
  2. app認證授權 : http://developers.facebook.com/docs/authentication/
  3. Graph api about post : http://developers.facebook.com/docs/reference/api/post/
  4. 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/
  5. 延長accessToken的期限兩個月:http://stackoverflow.com/questions/8982025/how-to-extend-access-token-validity-since-offline-access-deprecation

相關文章

留言區