Facebook php,如何使用结果分页


facebook php, how do you use results paging?

你好,我正在使用Facebook 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
}

前面的所有响应都有效。

我是这样做的,用图形API获得所有的"下一个"结果:

请注意,我没有得到"以前"的结果。

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的值,以便每次调用获得更少/更多的数据

您获得的分页结果中的值是您需要请求的实际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个赞)。希望这能澄清一些事情!好运!

我采用了F2000处理分页的方式,得到以下代码:

// Initialize the Facebook PHP SDK object:
$config = array(
    'appId'      => '123456789012345',
    'secret'     => 'be8024db1579deadbeefbcbe587c0bd8',
    'fileUpload' => false );
$fbApi = new Facebook( $config );
// Retrieve list of user's 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's friend records at this point.

代码似乎可以工作。可选地,为了更好的可靠性,它可以尝试处理临时连接问题,但为了代码清晰,我跳过了这一点。

我使用的是Facebook PHP SDK 3.1.1

从Facebook返回的分页url与自己的PHP SDK不兼容。

您可以从分页url中提取API所需的信息并将其传递给SDK API。

使用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);

带有限制和偏移分页的Facebook查询不能很好地返回所有结果,因此我使用API提供的pagination['next']字段创建了一个递归函数。

函数:

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

你不能直接使用next 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 );

我实际上没有看到任何使用Facebook光标的答案,所以我想我应该添加我的解决方案来获取所有页面的Leadgen表单。这应该适用于任何返回Cursor的方法:

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