facebook php, como você usa paginação de resultados?

Olá eu estou usando o Facebook SDK do Facebook (v.3.1.1)

Não entendo como usar o url de paginação de resultados.

Eu quero obter uma lista de TODOS meus amigos, aqui está o meu código

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

Os valores nos resultados de paginação que você obtém são os URLs reais que você precisa solicitar para obter o próximo grupo de resultados. Por exemplo :

 ... { "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 } 

Este é o resultado de paginação “próximo” que recebo quando consulta o meu usuário para as páginas que eu gosto. Se eu solicitar este URL, vai me dar um total de 5.000 pessoas com um deslocamento de 5000 (porque eu já tenho o primeiro 5000 na solicitação inicial). Espero que isso esclareça as coisas! boa sorte!

Todas as respostas anteriores são válidas.

Aqui está o jeito que eu faço, para obter todo o resultado “próximo” com a API do gráfico:

Observe que eu não obtenho resultados “anteriores”.

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

Você pode alterar o valor de $ limite como quiser, obter menos / mais dados por chamada.

Adaptei a maneira da F2000 de lidar com a paginação e obtive o seguinte código:

 // 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. 

O código parece funcionar. Opcionalmente, para uma melhor confiabilidade, ele poderia tentar lidar com problemas temporários de conexão, mas eu pulcava isso para clareza de código.

Estou usando o Facebook PHP SDK 3.1.1

Os URLs de paginação retornados do Facebook não são compatíveis com o seu próprio SDK do PHP.

Você pode extrair as informações necessárias pela API a partir dos URLs da paginação e passá-la para a API do SDK.

Use a function parse_url do PHP ou algumas manipulações de string para extrair essas informações.

Código de exemplo para recuperar parte da minha lista de amigos (usando 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); 

Você não pode realmente usar o próximo URL diretamente, o Facebook php sdk não o suporta, mas você pode usar as funções padrão do php para extrair os dados que você precisa. Eu usei-o para o facebook api de pesquisa, este é o exemplo

$result = $fb->api('/search', 'GET', $paramsArray ); $url = parse_url($result['paging']['next']); parse_str($url['query'], $nextParams ); $nextResult = $fb->api('/search', 'GET', $nextParams );

A consulta no Facebook com paginação de limite e deslocamento não funcionou bem, não retornando todos os resultados, então fiz uma function recursiva usando os campos de paginação [‘próximo’] fornecidos pela API.

A function:

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

E você pode inicializá-lo com uma matriz vazia e a consulta que deseja obter, como no exemplo a seguir:

 chunk_results(array(),"/457568434275922/posts?fields=message") 

Espero que ajude!

PD: meu object do Facebook é chamado de $ facebook