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;
}