Feed on
Posts
Comments
Email訂閱

2011.12 已全面改用 php-sdk 3.01 與 Graph API,以下文字純粹留作紀錄。


旅聯網粉絲團訊息發布
三個月前完成將旅聯網網站活動訊息同步更新到Facebook粉絲團塗鴉牆上,讓網友可以透過社群網站的力量加強互動。四天前先是不經意發現土地公廟圖庫大部分相簿與影像被刪除,可能無法復原,因此必須做最壞的打算(或許也是最好的打算),也就是發起山友重新上傳影像。為了鼓勵山友進行這項任務,打算將山友熱心上傳影像的訊息發布到粉絲團塗鴉牆,激發大家共同參與的意願,這才發現旅聯網粉絲團塗鴉牆的訊息更新功能失效了。

開始追查原因,在publish_stream時的exception訊息是:The user hasn’t authorized the application to perform this action。但是為何前三個月都還好好的,突然之間就不能運作了。而且程式顯示這個APP仍然有publish_stream的權限。

於是懷疑是session已經無效。於是想要針對這個APP再產生一次one time code,然後重新取得session:

http://www.facebook.com/code_gen.php?v=1.0&api_key=your_app_apikey

出現的訊息是類似是:應用程式發生錯誤,請稍後再試。

接下來嚐試在使用者頁面解除這個應用程式發佈的授權,然後再試著產生one time code,結果依然不行。再執行這個APP時,出現的訊息已經是:session invalid。

要注意的是,並不是每個APP都會出現The user hasn’t authorized the application to perform this action的訊息。於是嘗試另外寫一支新的APP,重新開始。

但是新的APP透過codegen仍然無法產生one time code,推論是沒有得到使用者授權所以無法進一步去取得seesion,但這似乎是雞生蛋,蛋生雞的問題?

自己亂嘗試很久始終都在原地打轉,浪費許多時間,或許是Facebook的平台做了調整,而末端的程式設計者對這樣的調整無能為力。於是上Facebook的論壇去看大家討論,發現The user hasn’t authorized the application to perform this action這個問題好幾個月前就有人提出來了,而直到最近都是有人出現同樣的問題,我沒有看到Facebook對此做一個徹底的解決。我猜想這應該是Authorization機制改變了的問題,但為何有些APP仍然可以照常運作也可以繼續取得one time code?(但必須仍在使用者已經給予這APP某些權限的情況下)。我心中隱約覺得這跟年初Facebook發表了新的Open Graph API或許有關。

我想到三個月前開發Facebook APP遇到問題無法解決,最後是求助於Wordpress的Wordbook plugin,於是這一次我又再度去WordPress plugins尋找Post to Facebook相關的插件,原來的Wordbook似乎已經不再更新了,我找了好幾個也都安裝試試看,最後又看到Wordbooker這個插件,多了er但功能似乎更強,最重要的是這個插件使用2.0版本的API,也就是Open Graph API,而其取得授權的方式,省去了取得one time code,直接去取得使用者的授權之後,再回來plugin的管理介面reload再進行plugin的其他相關設定。

我把取得授權這一段程式碼抽出來研究,想要依樣畫葫蘆,至少讓我的APP也可以按照同樣的方式取得使用者授權,或許這有助於接下來取得session。

<?
require("fb2/facebook.php");
global $facebook2;
$facebook2 = new Facebook2(array(
	  'appId'  => YOURAPP_ID,
	  'secret' => YOURAPP_SECRET,
	  'cookie' => false,
	));

	# set up the permissions .
	$par['req_perms'] = "publish_stream,offline_access,user_status";
	$par['next'] = 'http://your_domain/fb/index.php';
	$par['cancel_url']= 'http://your_domain/fb/index.php';
	$loginUrl = $facebook2->getLoginUrl($par);

	echo '<a href="'.$loginUrl.'">';
        echo '<img src="http://static.ak.fbcdn.net/rsrc.php/zB6N8/hash/4li2k73z.gif"/>';
        echo '</a>';

?>

要注意參數中的 next 是取得授權之後的回返位址,必須跟APP中的canvas位址設定一致,而且很奇怪的是使用urlencode去封裝竟然還會出現位址不一致的錯誤訊息:載入XXX應用程式頁面時發生錯誤,所以還是讓它保持原狀好了。

在瀏覽器執行上述的程式,只是這樣做了之後,有時還不一定能夠看到如下的取得授權畫面,但如果「有幸」可以看到就表示已成功了一大半。
Facebook APP取得使用者授權畫面
(Facebook APP取得使用者授權畫面)

同意授權之後,接下來這個APP就真的可以順利取得one time code,以及獲得session,都不會再有問題,於是困擾了三天的粉絲團塗鴉牆更新失效的問題終於解決。但是土地公廟的圖庫的復原,卻還有一大段路要走..。

注意此次更動與之前方式的差別在於:取得使用者同意這個APP授權的時間點。之前的方式是APP不用先取得user授權存取就可以先取得one time code,而APP會透過one time code 登入,取得session,設定client然後進行user授權APP存取。現在的做法正好倒過來,user要先授權APP有存取權限(透過上述的方式),然後才能取得one time code,session等,之所以還需要session的原因是:雖然取得授權的方式已有改變,但wordbooker還是利用舊的REST API來發布訊息到塗鴉牆,這個API的client的建立必須有session為參數(新的GRAPH API雖不需要session,但是在發布訊息時,必須要提供access_token)。

為什麼wordbooker還是利用舊的REST API來跟Facebook同步呢?大概是因為舊的API包裝的比較好吧。

2010.11.10 再度無法自動發布訊息到塗鴉牆,經查錯誤訊息是:Session user xxxxxxxxx does not have permission to post to page 126315554075378 as the page,猜想原因是先前是以我另一個user id取得這個session,而前幾天我移除了這個user id粉絲團管理員身分,也許因此APP無法之前取得的permission失效。經改以原來的粉絲團管理員身分登入重新取得token與session後,又可以自動發布訊息。

 

6 則回應 to “多事之秋:旅聯網網站訊息自動發布到粉絲團塗鴉牆失效與土地公廟圖庫大部分被刪除(101027)”

  1. Rachel表示:

    不好意思請問這到底要怎麼設定呢??? 我的文章還是不會自動PO到FB上面

    • 冬烘先生表示:

      這裡描述的做法是針對網站的訊息以「程式」發布到Facebook;如果你是自己發表在部落格的文章,現在的部落格平台或許有提供同步發表到Facebook的功能,可參考部落格平台的說明文件。

  2. Min表示:

    想請教我設定的APP授權只有存取個人資料
    要如何像您一樣可以存取郵件、塗鴉牆等呢

    感謝

  3. 小清表示:

    抱歉.我使用程式時在一開始登入取得權限後是可以POST的.但是只要過一段時間就會出現
    Uncaught Exception: 102: parameters uid or session key required
    的錯誤.需要重登入一次才能再貼文章.但是我有取得offline_access權限!
    想請問站大是否也有這問題呢? 該如何修改?

回覆 Rachel