Facebook php, как вы используете пейджинг результатов?
Привет, я использую PHP PHP SDK (v.3.1.1)
Я не понимаю, как использовать URL-адрес поискового вызова.
Я хочу получить список ВСЕХ моих друзей, вот мой код
$friends = $fb->api('/me/friends');
/*
$friend == Array
(
[data] => Array
(
...
),
[paging] => Array
(
[next] => https://graph.facebook.com/me/friends?method=GET&access_token=SOMETHING&limit=5000&offset=5000
)
*/
if (!empty($friends['paging']['next']))
{
$friends2 = $fb->api($friends['paging']['next']);
//doesn't work
}
Ответы
Ответ 1
Значения в результатах поискового вызова, которые вы получаете, являются фактическим URL-адресом, который требуется запросить, чтобы получить следующую группу результатов. Например:
...
{
"name": "Adobe Flash",
"category": "Software",
"id": "14043570633",
"created_time": "2008-06-05T17:12:36+0000"
}
],
"paging": {
"next" :https://graph.facebook.com/{USER_ID}/likes?format=json&limit=5000&offset=5000
}
Это "следующий" результат подкачки, который я получаю, когда я запрашиваю у своего пользователя страницы, которые мне нравятся. Если я попрошу этот URL-адрес, он даст мне всего 5000 понравившихся со смещением 5000 (потому что я уже получил первые 5000 в первоначальном запросе).
Надеюсь, это прояснит все! удачи!
Ответ 2
Все предыдущие ответы действительны.
Вот как я это делаю, чтобы получить весь "следующий" результат с помощью API-интерфейса Graph:
Обратите внимание, что я не получаю "предыдущие" результаты.
function FB_GetUserTaggedPhotos($user_id, $fields="source,id") {
$photos_data = array();
$offset = 0;
$limit = 500;
$data = $GLOBALS["facebook"]->api("/$user_id/photos?limit=$limit&offset=$offset&fields=$fields",'GET');
$photos_data = array_merge($photos_data, $data["data"]);
while(in_array("paging", $data) && array_key_exists("next", $data["paging"])) {
$offset += $limit;
$data = $GLOBALS["facebook"]->api("/$user_id/photos?limit=$limit&offset=$offset&fields=$fields",'GET');
$photos_data = array_merge($photos_data, $data["data"]);
}
return $photos_data;
}
Вы можете изменить значение $limit, как вы хотите, чтобы получить меньше/больше данных за звонок.
Ответ 3
Я адаптировал способ F2000 для работы с пейджингом и получил следующий код:
// Initialize the Facebook PHP SDK object:
$config = array(
'appId' => '123456789012345',
'secret' => 'be8024db1579deadbeefbcbe587c0bd8',
'fileUpload' => false );
$fbApi = new Facebook( $config );
// Retrieve list of user friends:
$offset = 0; // Initial offset
$limit = 10; // Maximum number of records per chunk
$friends = array(); // Result array for friend records accumulation
$chunk = $fbApi->api(
"/me/friends", 'GET',
array(
'fields' => 'id,name,gender',
'offset' => $offset,
'limit' => $limit ) );
while ( $chunk['data'] )
{
$friends = array_merge( $friends, $chunk['data'] );
$offset += $limit;
$chunk = $fbApi->api(
"/me/friends", 'GET',
array(
'fields' => 'id,name,gender',
'offset' => $offset,
'limit' => $limit ) );
}
// The $friends array contains all user friend records at this point.
Код работает. При желании, для лучшей надежности, он может попытаться справиться с временными проблемами подключения, но я пропустил это для ясности кода.
Я использую PHP PHP SDK 3.1.1
Ответ 4
URL-адреса страниц, возвращенные из Facebook, несовместимы со своим собственным SDK для PHP.
Вы можете извлечь информацию, необходимую API, из URL-адресов для разбивки на страницы и передать ее в API SDK.
Используйте функцию PHP parse_url или некоторые строковые манипуляции для извлечения такой информации.
Пример кода для извлечения части моего списка друзей (с помощью parse_url
):
$ret = $facebook->api('/me/friends?limit=25');
var_dump($ret);
$next = parse_url($ret['paging']['next']);
$ret = $facebook->api($next['path'] . '?' . $next['query']);
var_dump($ret);
Ответ 5
Вы не можете использовать следующий url напрямую, Facebook php sdk не поддерживает его, но вы можете использовать стандартные функции php для извлечения необходимых данных. Я использовал его для поиска в facebook api,
это пример
$result = $fb->api('/search', 'GET', $paramsArray );
$url = parse_url($result['paging']['next']);
parse_str($url['query'], $nextParams );
$nextResult = $fb->api('/search', 'GET', $nextParams );
Ответ 6
Опрос Facebook с лимитированием и смещением pagination не работал хорошо, не возвращая все результаты, поэтому я сделал рекурсивную функцию, используя поля страницы ['next'], предоставленные API.
Функция:
function chunk_results($arr,$query)
{
global $facebook;
$chunk = $facebook->api($query);
if($chunk['data']==null)
{
return $arr;
}
else
{
foreach($chunk['data'] as $dato)
$arr['data'][] = $dato;
return chunk_results($arr,substr($chunk['paging']['next'],26));
}
}
И вы можете инициализировать его пустым массивом и запросом, который вы хотите получить, например, в следующем примере:
chunk_results(array(),"/457568434275922/posts?fields=message")
Надеюсь, что это поможет!
PD: Мой объект Facebook называется $facebook
Ответ 7
Я не вижу никаких ответов на самом деле с помощью курсора Facebook, поэтому я решил добавить свое решение для получения всех форм страницы Leadgen. Это должно работать с использованием любого метода, который возвращает курсор:
$params = []; // initial parameters are empty to get the first page
$fields = []; // define the field
while ($leadgen_forms = $account->getLeadGenForms($fields, $params)) {
foreach ($leadgen_forms as $key => $value) {
// do stuff
}
$params['after'] = $leadgen_forms->getAfter();
if (!$params['after'])
break;
}