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