Невозможно создать объект GraphEdge из ответа Facebook - PullRequest
0 голосов
/ 24 мая 2019

Я только начал с API графа facebook и PHP SDK. Мне трудно понять, к какому типу объектов я приведу ответ fb. Я понимаю концепцию узлов и краев. Я прошел через некоторые другие вопросы переполнения стека (, когда вы используете getGraphObject и 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 и как это исправить?

Кроме того, я попробовал другой способ написать запрос, как указано в документе 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. Не могли бы вы мне сказать, почему мой токен доступа по умолчанию не работает, когда я пишу запрос, как указано выше?

...