2011年4月7日 星期四

Facebook應用程式開發-使用 PHP SDK

3.0之後的版本要把原有的權限判斷 "req_perms" 更改為 "scope"

Facebook api 權限控制

步驟一、下載PHP SDK

網址: https://github.com/facebook/php-sdk/
下載下來解壓縮後可以看到以下幾個資料夾,examples、src、tests


您可以直接修改範例裡頭的檔案,只要更改應用程式ID、API金匙
還有應用程式密匙,也就是上一篇建立完成後所產生的(不懂的話看上一篇)

在此不介紹範例的程式,筆者這裡有用過,一開始還正常,之後就發生了錯誤
 Uncaught OAuthException: Error validating access token. thrown
所以底下是我尋找各種方案後所找到比較可靠的範例。
出處(感謝各位作者):
http://thinkdiff.net/facebook/php-sdk-graph-api-base-facebook-connect-tutorial/
這位作者寫的很好~假如看不懂英文,底下是我中文說明,以及修改的程式

 步驟二、建立連線
程式碼如下,都有打上註解(複製貼上吧)

<?php

$fbconfig['appid'] = "";
$fbconfig['secret'] = "";
try {
    include_once "src/facebook.php";
} catch (Exception $o) {
    echo '<pre>';
    print_r($o);
    echo '</pre>';
}

function p($d) {
    echo '<pre>';
    print_r($d);
    echo '</pre>';
}

$facebook = new Facebook(array(
            'appId' => $fbconfig['appid'],
            'secret' => $fbconfig['secret']
        ));
$uid = $facebook->getUser();
$login_url = $facebook->getLoginUrl//登入連結以及要取得使用者哪些資訊
        (
        array
            (
            "scope" => "id,link,username,birthday,email,user_photos", //要取得的使用者資訊
            'next' => 'http://apps.facebook.com/wingnetgraphapi/', //按下完成後轉向網址
            'redirect_uri' => 'http://apps.facebook.com/wingnetgraphapi/', //下一頁轉向網址
            'fbconnect' => 1,
            'canvas' => 1, //Facebook內的畫布,沒有用到,為0
        )
);
if (!$uid) {
    echo "<script type='text/javascript'>top.location.href = '" . $login_url . "';</script>";
    exit;
}
?> 



步驟三、取得使用者資訊
增加FQL,取得使用者所加入的粉絲資訊、取得使用者所加入的粉絲資訊、應用程式留言的資訊
如下程式碼

<?php
include_once "fbinclude.php";
if ($uid) {
    $fbme = $facebook->api('/me');
    //使用SDK函式提供的方法(users.getinfo)取得使用者資訊
    try {
        $param = array(
            'method' => 'users.getinfo',
            'uids' => $uid,
            'fields' => 'name,current_location,profile_url',
            'callback' => ''
        );
        $userInfo = $facebook->api($param);
    } catch (Exception $o) {
        p($o);
    }
    //使用FQL取得使用者資訊
    try {
        //get user id
        $uid = $facebook->getUser();
        //or you can use $uid = $fbme['id'];

        $fql = "select uid,name,profile_url, hometown_location, sex, pic_square from user where uid=" . $uid;
        $param = array(
            'method' => 'fql.query',
            'query' => $fql,
            'callback' => ''
        );
        $fqlResult = $facebook->api($param);
    } catch (Exception $o) {
        p($o);
    }

    try {
        //get user id
        $uid = $facebook->getUser();
        //or you can use $uid = $fbme['id'];
        $fqlfans = "SELECT page_id, name, type,pic FROM page WHERE page_id IN (SELECT page_id FROM page_fan WHERE uid=" . $uid . ")";
        $fans = array(
            'method' => 'fql.query',
            'query' => $fqlfans,
            'callback' => ''
        );
        $fansResult = $facebook->api($fans);
    } catch (Exception $o) {
        p($o);
    }
    //判斷使用者是否有加入粉絲專頁
    try {
        //get user id
        $uid = $facebook->getUser();
        $pageID = '261910770463';
        //or you can use $uid = $fbme['id'];
        $fans = "SELECT target_id,target_type,source_id,is_following,updated_time,is_deleted FROM connection WHERE source_id = $uid AND target_id = $pageID";
        $fansteam = array(
            'method' => 'fql.query',
            'query' => $fans,
            'callback' => ''
        );
        $fansteamResult = $facebook->api($fansteam);
    } catch (Exception $o) {
        p($o);
    }
    //END 判斷使用者是否有加入粉絲專頁
    //取得在此應用程式留言的使用者(以官方的文件為例)
    try {
        $comment = "select fromid, object_id, text, time from comment where object_id in (select post_fbid from comment where object_id in (select comments_fbid from link_stat where url ='http://developers.facebook.com/docs/reference/fql/comment/'))";
        $comments = array(
            'method' => 'fql.query',
            'query' => $comment,
            'callback' => ''
        );
        $commentResult = $facebook->api($comments);
    } catch (Exception $o) {
        p($o);
    }
    //END 取得在此應用程式留言的使用者 

    /* try {
      //get user id
      $uid = $facebook->getUser();
      //or you can use $uid = $fbme['id'];
      //        $fqlphotos="SELECT pid,src_big,link FROM photo WHERE aid IN ( SELECT aid FROM album WHERE owner='20531316728' ) ORDER BY created DESC LIMIT 1,42";
      $fqlphotos = "SELECT aid, owner, name, object_id,link FROM album WHERE aid='100002637024906_12582'";//取得相簿 owner
      $photos = array(
      'method' => 'fql.query',
      'query' => $fqlphotos,
      'callback' => ''
      );
      $photosResult = $facebook->api($photos);
      } catch (Exception $o) {
      p($o);
      } */
}
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">
    <!-- 標籤裡頭 要加入xmlns:fb="http://www.facebook.com/2008/fbml" -->
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <script type="text/javascript" src="http://connect.facebook.net/zh_TW/all.js"></script>
        <!--載入FBJS SDK -->
    </head>
    <body>
        <div id="fb-root"></div>
        <script type="text/javascript">
            window.fbAsyncInit = function() {
                FB.init({appId: '<?= $fbconfig['appid'] ?>', status: true, cookie: true, xfbml: true});
            };
            (function() {
                var e = document.createElement('script');
                e.type = 'text/javascript';
                e.src = document.location.protocol +
                    '//connect.facebook.net/zh_TW/all.js';
                e.async = true;
                document.getElementById('fb-root').appendChild(e);
            }());
        </script>
    <fb:login-button autologoutlink="true" perms="email,user_birthday,status_update,publish_stream"></fb:login-button>
    <table border="0" cellspacing="3" cellpadding="3">
        <tr>
            <td>
                <!-- Data retrived from user profile are shown here -->
                <div class="box">
                    <b>FacebookApp(PHP SDK V3.0.0)</b>
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <!-- Data retrived from user profile are shown here -->
                <div class="box">
                    <b>API取得的使用者資訊"api(/me)"</b>
                    <?php p($fbme); ?>
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <div class="box">
                    <b>使用API方法取得使用者資訊 "users.getinfo"</b>
                    <?php p($userInfo); ?>
                </div>
            </td>
        </tr>
        <tr>

            <td>
                <div class="box">
                    <b>呼叫 API FQL的方法取得使用者資訊 "fql.query"</b>
                    <?php p($fqlResult); ?>
                </div>
            </td>
        </tr>
        <tr>

            <td>
                <div class="box">
                    <b>呼叫 API FQL的方法取得使用者所加入的粉絲資訊</b>
                    <?php
                    p($fansResult);
                    ?>
                </div>
            </td>
        </tr>
        <tr>

            <td>
                <div class="box">
                    <b>呼叫 API FQL的方法取得使用者所加入的粉絲資訊</b>
                    <?php
                    p($fansteamResult);
                    ?>
                </div>
            </td>
        </tr>
        <tr>

            <td>
                <div class="box">
                    <b>呼叫 API FQL的方法取得在應用程式留言的資訊</b>
                    <?php
                    p($commentResult);
                    ?>
                </div>
            </td>
        </tr>
    </table>
</body>
</html>




 ※ 請到官方網站 重新下載新的 Facebook PHP SDK ※
還是看不懂嗎…….

懶人包直接 下載 ,改一下應用程式ID、金匙、應用程式密匙

4 則留言:

匿名 提到...

不能下載耶。
您的 GOOGLE 空間出問題。
能寄給我嗎?
chnamis98@gmail.com

Unknown 提到...

HI 你好
進入google空間後,點選左上角"檔案"便可看到下載的字樣,點選項下載就可以下載囉 目前版本臉書已更新在SDK 3.1.1
這邊有空整理好後再放上,使用上有什麼問題,不訪提出來討論吧

這城市,天空下 提到...

你好,我已經按照你的方式改成自已app的id、金鑰,可是我在執行網址的時候,如同你的https://apps.facebook.com/我的網址/

canvas無法跑出如同你的連結,而只是一個錯誤頁面,請問是否在設定上還有什麼要注意的嗎?

Unknown 提到...

回 這城市,天空下>>
1.或許SDK為舊版 請去FB官方下載新的
(https://developers.facebook.com/docs/reference/php/4.0.0) ,把src裡頭檔案更新
2.設定沙盒模式 是否有關閉
3.連結網址是否有錯誤