Feed on
Posts
Comments
Email訂閱

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

APP取得 User授權的方式已有調整,請參看這一篇的說明(2010.10.30)

(旅聯網粉絲專頁提醒您按下「讚」,就可以加入旅聯網粉絲團了)

2008年年底在旅聯網的各主要頁面導入Google Friend Connect插件,希望能夠帶動社群討論風氣,但是效果不彰。Facebook盛行之後,透過粉絲團擬聚人氣似乎是個好方式。於是想要把旅聯網網站內的活動發布到Facebook粉絲團的塗鴉牆上,這樣只要是旅聯網Facebook的粉絲,登入Facebook就可以看到旅聯網站內的成員活動狀況,若粉絲針對活動狀況作了回應之後,他的Facebook朋友們也會看到他的回應,因此原本不知道旅聯網的人,或許就會因為看到旅聯網的活動訊息而開始對旅聯網產生興趣,近而加入分享登山健行記錄的行列。

其實更早之前,是想要把網站的活動訊息貼到Google FriendConnect(GFC)的Activities,然後在網站上定期去抓取GFC的Activities資料,並顯示在網站的邊攔上彙整讓網站上的讀者可以在一處知曉網站內所有頁面的活動。不過那時一時查不到相關的API可以將訊息發佈到Activies,很是苦惱。最近改研究Facebook的API,終於找到如何將網站訊息發佈到塗鴉牆的方法。另外就是GFC的訊息傳播沒有那麼直接,你的朋友比較難看到你在其他網站上幹了什麼事。

所以總而言之一句話:要將讀者在旅聯網上的活動行為(可以公開的)發佈在社群網站上,透過群眾傳播的力量讓更多人知道旅聯網的好處。

截至目前在旅聯網活動訊息會發佈到Facebook粉絲團塗鴉牆上的包括:發表在討論區的留言主題(攝影、邊吃邊玩、登山活動)、最近點閱率高的遊記前三名、最近多產作者前三名(最近發表至少超過兩篇以上)、最近獲得最多讀者回應的文章前三名、發表在GFC recommendation 或 rating插件的留言或評論、使用者設定待爬行程或是完成待爬行程、使用者完成一項足跡任務點、主題區的新增與圖像變更事件觸發。原本發表新遊記或更新遊記時也會發布到塗鴉牆上,不過這樣發佈出去的訊息就太多了。

但是要如何將旅聯網網站(www.waytogo.cc)上的訊息「自動」發佈到Facebook (www.facebook.com) 的旅聯網粉絲團塗鴉牆上呢,這可是兩個不同的網站。網路上多是在教人如何快速建立Facebook App,但是卻很少看到有人介紹如何將訊息發佈到Facebook塗鴉牆,不過既然在「開心農場」這種外部小遊戲上幹了什麼事都會被Facebook上的朋友知道,那把訊息發佈到使用者塗鴉牆上應該是一件很基本的事情,於是我轉而參考WordPress 一個可以讓WordPress跟Facebook互通的plugin:wordbook的作法,而且直接檢視其原始碼。不過要注意的是這個plugin使用的是舊的Facebook Rest API,而不是最新發表的Open Graph API。整理出的實作步驟如下:

  1. 在Facebook上建立一個粉絲專頁。
  2. 在旅聯網上安裝Facebook Rest API程式庫,不過由於Facebook現在主打新的Open Graph API,所以舊的程式庫下載點已經不見了。這裡提供一個下載點(http://code.google.com/p/facebook-athenaeum/source/browse/trunk/libs/?r=48#libs/facebook_api)。稍後可在你的php程式中將facebook api 引入:
    require_once('facebook.php');
  3. 建立一支Facebook App,這一部分請參考網路上網友的介紹,不再贅述,因為我們的重點不是真的要開發一個像開心農場那樣的程式,而是要利用這個新App的一些資訊(apikey等)來讓旅聯網跟Facebook可以連結。
  4. Facebook App建立之後,在App設定頁取得App的相關資訊,如:
    $appapikey = 'your api key';
    $appsecret = 'your api secret';
  5. 取得一次登入密碼,也就是token(onetimecode,意指這組密碼只能用來登入一次),然後寫死在程式中(Hard code)。因為取得token的步驟並不會是我們的最終程式碼,最後的程式碼要將之移除。目的是要讓旅聯網系統程式,以Facebook APP的身分跟Facebook溝通,且溝通過程中為「登入狀態」,這樣才能跨網站向Facebook粉絲專頁的塗鴉牆發佈訊息。取得一次登入密碼的網址如下:
    http://www.facebook.com/code_gen.php?v=1.0&api_key=your_app_apikey
  6. 用剛剛取得的token造成登入事實,並取得登入之後的連線狀態鎖鑰(session key),取得後同樣寫死在程式中,同樣的取得session key的步驟也不會是我們的最終程式碼,最後的程式碼也要將之移除。
    $fbclient = new FacebookRestClient($appapikey, $appsecret, '');
    $sessionresult = $fbclient->auth_getSession($logintoken);
    if ($sessionresult)
    {
            $secret = $result['secret'];
            $session_key = $sessionresult['session_key'];
    }
    else
    	die("you are not logined");
  7. 向Facebook旅聯網粉絲專頁,要求授予寫入塗鴉牆訊息的權限。既然我們在以上的步驟取得了session_key,也就是告訴Facebook這個App已經在「登入」狀態了,我們可以開始呼叫Facebook API,方法是產生wrap class的Facebook Client,透過client的函式請求授予權限,同樣的這個動作也只要做一次。
    $fbclient = new FacebookRestClient($appapikey, $appsecret, $session_key);
    
    if(!$fbclient->users_hasAppPermission('publish_stream'))
    {
    	$url = "http://www.facebook.com/connect/prompt_permissions.php"
                     . "?v=1.0"
                     . "&api_key=" . $appapikey
                     . "&ext_perm=" .'publish_stream'
                     . "&fbconnect=true"
                     . "&display=popup"
                     . "&extern=1"
                     . "&enable_profile_selector=1"
                     . "&next=" . urlencode("http://your_app__callback_addr");
    ?>

    旅聯網聯外通需要得到您的授權才能將訊息發布到您的塗鴉牆。請按以下的”facebook”按鈕,將會另開一頁授權頁,請再按下”同意授權”

            <a href="<?php echo $url; ?>" target="facebook">
            
            </a>
  8. 只要取得旅聯網粉絲專頁同意授權後,這個App以後就可以將訊息寫入塗鴉牆了。以下範例中的參數$fansid就是旅聯網粉絲專頁的id。最後的程式碼要記得把剛剛取得logintoken與session_key的過程程式碼移除。
    $fbclient->stream_publish("這是測試", null, null, $fansid, $fansid);

整合Google FriendConnect與Facebook APP

接下來要說明如何從Google FriendConnect取得Activities,並將這些Activies發佈到Facebook粉絲專頁的塗鴉牆上,如此便將Google和Facebook的社交元件整合在一起。為什麼不捨棄GFC,通通改用Facebook,而要大費周章來整合兩者呢?因為GFC有一個好用的功能,也就是可以針對每一個單一物件設定唯一代號,並建立其社交元件(如該物件專用的留言板)。其實Facebook也可以對每個頁面設定專屬留言板,但是GFC可以再透過Activities的方式取得網站中分散在各物件的留言,然後整合呈現,而不用像Facebook要逐一去進入各頁面才能看到各頁面的留言。舊版的Facebook API應該還不能支援(新版的Open Graph API或許有辦法吧)。

(安插在旅聯網首頁邊欄的Google Friend Connect社群插件)

  1. 透過Open Social API取得Activities,包裝成xml字串,透過Ajax傳送到伺服器端處理
    <script>
    google.friendconnect.container.loadOpenSocialApi({site: 'your gfc site id', onload:function(securityToken) { initGFCAllData(); }});  	
    
    function initGFCAllData()
    {
          var req = opensocial.newDataRequest();
          req.add(req.newFetchActivitiesRequest(new opensocial.IdSpec({'userId' : 'OWNER', 'groupId' : 'FRIENDS'})), 'activities');
          req.send(setupGFCData);
    };
    
    function setupGFCData(data) {
    
          var activities = data.get('activities').getData();
    
          if (activities)
          {
          	var strxml = '<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel>';
    
            activities = activities.asArray();
            for (var i = 0; i < activities.length && i < 5; i++)
            {
              strxml+="<item>";
    
              var activity = activities[i];
    
              var actid = activity.getId();
              var title = activity.getField('title', {escapeType: 'none'});
              var body = activity.getField('body', {escapeType: 'none'});
              var url = activity.getField('url', {escapeType: 'none'});
    
              strxml+=("<guid>"+actid+"</guid>");
              strxml+=("<title><![CDATA["+title+"]]></title>");
              strxml+=("<link>"+url+"</link>");
    	  strxml+=("<description><![CDATA["+body+"]]></description>");
            }
            strxml+="</item>";
    
           	xajax_refreshGFCActivities(strxml);
        }
    };
    
    </script>
  2. 在伺服器端解析xml字串,萃取出訊息並發布到Facebook旅聯網粉絲團塗鴉牆上
    function refreshGFCActivities($strActivities)
    {
    	...
     	global $appapikey, $appsecret, $session_key, $fansid;
      	$fbclient = new FacebookRestClient($appapikey, $appsecret, $session_key);	
    
     	$xmlobj = simplexml_load_string($strActivities);
    
     	foreach ($xmlobj->channel->item as $item)
     	{
       		try{
            	       	$message = ($item->title);
            	       	$hrefpos = strpos($message,"href=");
            	       	$href="";
            	       	if($hrefpos !== false)
            	       	{
            	       		$hrefend = strrpos($message, "\"");
            	       		$href = substr($message, $hrefpos+6, $hrefend-$hrefpos-6);
            	       	}
    
            	       	$message=strip_tags(html_entity_decode($message, ENT_QUOTES, "UTF-8"));
            	       	$description = strip_tags(html_entity_decode( $item->description, ENT_QUOTES, "UTF-8"));        	       	 
    
            		$attachment = array(
                			'name' => $message,
                			'href' => $href,
                			'description' => $description,
                			'media' => null,
                		);
                		$result = $fbclient->stream_publish($message." - Google FriendConnect", json_encode($attachment), null, $fansid, $fansid); 
    
            	} catch (Exception $e) {
            		$error_code = $e->getCode();
            		$error_msg = $e->getMessage();
        		}
    	}
     	unset($fbclient);
    	...
    }

 

5 則回應 to “透過Facebook App將網站活動訊息(包括GFC Activities)發布到Facebook粉絲團塗鴉牆(100805)”

  1. 小清表示:

    不好意思.是否能請問這是用哪一版的SDK.因為我使用3.0版出現沒有 stream_publish函數的錯誤

  2. EZ表示:

    請問步驟6
    用剛剛取得的token造成登入事實,並取得登入之後的連線狀態鎖鑰(session key)`,
    當中的連線狀態鎖鑰(session key) 要如何取得? 自己抓cooki 還是另有方法取得?

  3. JSEMTS表示:

    加油~ 感謝分享

回覆 EZ