2011年7月14日 星期四

How to write a Facebook app (Use new Facebook API)

  Facebook 是目前最多人使用的社交網頁,在 Facebook 上的 app (應用程式) 越來越多,也越來越多公司利用 Facebook 的 app 做行銷工具,不少人也對這個 Facebook app 的設計很感興趣,可是市面上書籍相當的少,造成學習上的困擾。雖然網路上很多文章都有在介紹,如何去申請一個 app,以及如何去寫個 hello world,但是就是沒有後續了。這篇文章將著重在三大部分,一、取得使用者資訊,二、取得使用者的好友清單,三、在使用者的塗鴉牆上發布訊息。
  或許以上這些資訊努力在 Google 上搜尋都找的到,但是有開發過的都知道 Facebook API 有做過更新,網路上的一堆教學文章全都不適用了,這篇文章也是我看了好多人家遇到的問題,整理出來的,算是做一個新 Facebook API 撰寫教學吧。

  首先,申請 Facebook app 過程一樣沒變,應該說看的懂中文的都會申請。而基本範例 Facebook Developer 上也有範例程式碼,如何去下載 Facebook APP SDK 都請先去 Google,或是上 Facebook Developer 學吧。以下範例將利用 PHP 來做教學動作。
撰寫 Facebook app 第一步就是要把 SDK include 進來嚕:
require_once 'facebook-php-sdk/src/facebook.php';
 接下來我們將定義一些參數,我們可先到 app 的資訊頁看:
define('FB_APIID', '(1)');
define('FB_SECRET', '(2)');
define('FB_CANVAS', 'http://apps.facebook.com/your_app/');
FB_APIID:這邊將填入 app 資訊頁上的 App ID/API Key (1)
FB_SECRET:這邊將填入 app 資訊頁上的 應用程式密鑰 (2)
FB_CANVAS:就是你的應用程式網址啦,app 資訊頁上的 畫布頁
再來我們將建立一個 Facebook application instance:
$facebook = new Facebook(array(
  'appId' => FB_APIID,
  'secret' => FB_SECRET,
  'cookie' => true,
));
$session = $facebook->getSession();
之後我們將要存取一些使用者資訊,所以要先讓使用者同意我們存取他的一些資訊,下面就是登入連結:
$scope = "read_friendlists,publish_stream";
$login_url ="https://www.facebook.com/dialog/oauth?client_id=" . FB_APIID . "&redirect_uri=" . urlencode(FB_CANVAS) . "&scope=" . $scope;
scope 部分就是將要存取使用者額外的哪些資訊,這部份的參數可以參閱 permissions reference
接下來我們就要來取得使用者資訊了:
$me = null;
if ($session) {
  try {
    $uid = $facebook->getUser();
    $me = $facebook->api('/me');
    $friends = $facebook->api('/me/friends');
  } catch (FacebookApiException $e) {
    error_log($e);
  }
}
取得完資訊後我們就可以做任何事了,下面就是當我們無法存取資訊時,需要要求使用者允許我們應用程式,來存取他們的資料:
if ($me) {
  echo $uid;
} else {
  echo("<script> top.location.href='" . $login_url . "'</script>");
}
大家可以試著利用 print_r 來觀看 $me 陣列以及 $friend 陣列。
最後來到我們的第三部份『在使用者的塗鴉牆上發布訊息』,大家只要使用過 Facebook 一定都會發現,別人的塗鴉牆常出現誰誰誰正在使用某應用程式,作為一個行銷工具,這個技巧是一定要學會的!作者我(Mr. Tony),把這個部份寫成一個小函式,只要把一些資訊參數丟進去就可以嚕。
function PublishStream($uid, $message, $attachment_name, $attachment_url, $attachment_description, $image_src, $image_link, $text, $href){
  global $facebook;
  $attachment = array(
    "name"=>$attachment_name,
    "href"=>$attachment_url,
    "description"=>$attachment_description,
    "media" => array(
      array(
      "type" => "image",
      "src" => $image_src,
      "href" => $image_link
    )
  ));
  $action_links = array(array("text"=>$text, "href"=>$href));
  $facebook->api( array(
    'method' => 'stream.publish',
    'target_id' => $uid,
    'message' => $message,
    'attachment' => $attachment,
    'action_links' => $action_links
  ));
}
$id:要發佈在誰的塗鴉牆上,通常是使用者本身,若要發佈到其他人的塗鴉牆上,就必須先取得對方的同意。
$message:如成果圖中的 (1)
$attachment_name:成果圖中的 (3)
$attachment_url:成果圖中的 (3) 的連結
$attachment_description:成果圖中的 (4)
$image_src、$image_link:成果圖中的 (2)
$text、$href:成果圖中的 (5)
(成果圖)
完整程式碼請點這邊觀看【完整程式碼】,最後就祝大家順利成功啦!

10 則留言:

  1. 我覺得少一個簡潔有力的標題,哈哈

    回覆刪除
  2. 感謝分享 不知您有沒一些其他的範例?

    回覆刪除
  3. 您好,不知道你說的是有關哪些範例呢?

    回覆刪除
  4. 我使用後出現錯誤訊息

    Call to undefined method Facebook::getSession()

    請問要怎麼解決呢?

    回覆刪除
  5. 補充一下..錯誤訊息是說

    $session = $facebook->getSession();

    這行有問題

    回覆刪除
  6. 原來是SDK3.0已不支援getSession();..而且好像還加上授權過期的問題.看來要貼文到使用者塗鴉牆是越來越難了

    回覆刪除
  7. 改用 SDK 2.1.2 吧,畢竟太多資料都是 SDK 2 的

    回覆刪除
  8. 感謝.改用2.1.2後就正常了.不曉得站大是否有貼到粉絲專頁塗鴉牆的相關API呢? 我GOOGLE過都沒看到較新的相關資料

    回覆刪除
  9. 你可以去書局看看有沒有相關的 facebook 的書籍,不然就是到 facebook developers 網站查 API 了。
    好像是 manage_pages:
    http://developers.facebook.com/docs/reference/api/permissions/

    回覆刪除