您好我正在使用Facebook PHP SDK(v.3.1.1)
我不明白如何使用结果分页网址。
我想获得所有朋友的列表,这是我的代码
$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
}
答案 0 :(得分:13)
之前的所有回复均有效。
以下是我使用Graph 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的值,以便每次调用获得更少/更多的数据。
答案 1 :(得分:8)
您获得的分页结果中的值是您需要请求的实际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 :(得分:5)
我采用了 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
答案 3 :(得分:2)
从Facebook返回的分页网址与其自己的PHP SDK不兼容。
您可以从分页网址中提取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);
答案 4 :(得分:1)
你实际上不能直接使用下一个网址,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 );
答案 5 :(得分:0)
Facebook查询限制和偏移分页并不能很好地不返回所有结果,所以我使用API提供的分页['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
答案 6 :(得分:0)
使用Facebook光标实际上看不到任何答案,因此我想我将添加解决方案以获取所有Page的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;
}