无法根据Facebook响应创建GraphEdge对象

时间:2019-05-24 06:57:05

标签: facebook-graph-api facebook-php-sdk

我刚刚开始使用facebook graph API和PHP SDK。我发现很难理解将fb响应转换为哪种类型的对象。我了解节点和边缘的概念。我还遇到了其他一些Stack Overflow问题(when do you use getGraphObject and getGraphEdge),因此我一直在寻找答案创建对象。

请考虑以下示例。我想从用户那里得到5条帖子。

    // getting  posts published by user
    try {
        $posts_request = $fb->get('/me?fields=feed.limit(5)');

    }

   $posts_response = $posts_request->getGraphEdge();

此查询应返回边,但这给我一个错误

Uncaught Facebook\Exceptions\FacebookSDKException: Unable to convert response from Graph to a GraphEdge because the response does not look like a GraphEdge. Try using GraphNodeFactory::makeGraphNode() instead.

如果我将其更改为

$posts_response = $posts_request->getGraphNode();

我收到以下错误:

Uncaught TypeError: Argument 1 passed to Facebook\Facebook::next() must be an instance of Facebook\GraphNodes\GraphEdge, instance of Facebook\GraphNodes\GraphNode given, 

问题1:有人问我为什么在使用getGraphEdge时会抛出错误,即使查询在Graph API资源管理器中返回了graphedges以及如何解决此问题?

此外,我尝试了另一种编写查询的方式,如FB文档(https://developers.facebook.com/docs/graph-api/using-graph-api)中所述。.

$posts_request = $fb->get('/me',array (
                                 'fields' => 'feed.limit(3)' 
    ) 

但这给我一个错误:

hash_hmac() expects parameter 2 to be string, array given in /storage/ssd2/231/8670231/public_html/truthposts/Facebook/Authentication/AccessToken.php on line 70

虽然我正在使用

设置默认访问令牌
$fb->setDefaultAccessToken($_SESSION['facebook_access_token']);

我的完整代码如下:

<?php
session_start();
require_once __DIR__ . '/Facebook/autoload.php'; // download official fb sdk for php @ https://github.com/facebook/php-graph-sdk

$fb = new Facebook\Facebook([
  'app_id' => 'xxxxxxx',
  'app_secret' => 'xxxxxxxxx',
  'default_graph_version' => 'v2.12',
]);

$helper = $fb->getCanvasHelper();

$permissions = ['user_posts','user_photos']; // optionnal

try {
    if (isset($_SESSION['facebook_access_token'])) {
    $accessToken = $_SESSION['facebook_access_token'];
    } else {
        $accessToken = $helper->getAccessToken();
    }
} catch(Facebook\Exceptions\FacebookResponseException $e) {
    // When Graph returns an error
    echo 'Graph returned an error: ' . $e->getMessage();
    exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
    // When validation fails or other local issues
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
    exit;
 }

if (isset($accessToken)) {

    if (isset($_SESSION['facebook_access_token'])) {
        $fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
    } else {
        $_SESSION['facebook_access_token'] = (string) $accessToken;

        // OAuth 2.0 client handler
        $oAuth2Client = $fb->getOAuth2Client();

        // Exchanges a short-lived access token for a long-lived one
        $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($_SESSION['facebook_access_token']);

        $_SESSION['facebook_access_token'] = (string) $longLivedAccessToken;

        $fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
    }

    // validating the access token
    try {
        $request = $fb->get('/me');
    } catch(Facebook\Exceptions\FacebookResponseException $e) {
        // When Graph returns an error
        if ($e->getCode() == 190) {
            unset($_SESSION['facebook_access_token']);
            $helper = $fb->getRedirectLoginHelper();
            $loginUrl = $helper->getLoginUrl('https://apps.facebook.com/APP_NAMESPACE/', $permissions);
            echo "<script>window.top.location.href='".$loginUrl."'</script>";
            exit;
        }
    } catch(Facebook\Exceptions\FacebookSDKException $e) {
        // When validation fails or other local issues
        echo 'Facebook SDK returned an error: ' . $e->getMessage();
        exit;
    }

    // getting all posts published by user
    try {
        $posts_request = $fb->get('/me',array (
                                 'fields' => 'feed.limit(3)' 
    )                             );

    } catch(Facebook\Exceptions\FacebookResponseException $e) {
        // When Graph returns an error
        echo 'Graph returned an error: ' . $e->getMessage();
        exit;
    } catch(Facebook\Exceptions\FacebookSDKException $e) {
        // When validation fails or other local issues
        echo 'Facebook SDK returned an error: ' . $e->getMessage();
        exit;
    }

    $total_posts = array();
    $posts_response = $posts_request->getGraphEdge();
    if($fb->next($posts_response)) {
        $response_array = $posts_response->asArray();
        $total_posts = array_merge($total_posts, $response_array);
        while ($posts_response = $fb->next($posts_response)) {
            $response_array = $posts_response->asArray();
            $total_posts = array_merge($total_posts, $response_array);
        }
        print_r($total_posts);
    } else {
        $posts_response = $posts_request->getGraphEdge()->asArray();
        print_r($posts_response);
    }

    // Now you can redirect to another page and use the access token from $_SESSION['facebook_access_token']
} else {
    $helper = $fb->getRedirectLoginHelper();
    $loginUrl = $helper->getLoginUrl('https://apps.facebook.com/nnnnn/', $permissions);
    echo "<script>window.top.location.href='".$loginUrl."'</script>";
}

问题2:您能告诉我为什么我在编写上述查询时默认访问令牌不起作用吗?

0 个答案:

没有答案