2011-11-21 15 views
15

Ciao sto usando l'SDK PHP di Facebook (v.3.1.1)facebook php, come si usa il paging dei risultati?

Non capisco come utilizzare l'URL di paging dei risultati.

voglio ottenere un elenco di tutti i miei amici, qui è il mio codice

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

risposta

8

I valori nei risultati di paging che si ottiene sono il vero URL che è necessario richiedere, al fine di ottenere il prossimo gruppo di risultati. Per esempio:

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

Questo è il "prossimo" risultato di paging ottengo quando interrogo il mio utente per le pagine che mi piacciono. Se richiedo questo URL mi daranno un totale di 5000 mi piace con un offset di 5000 (perché ho già ricevuto i primi 5000 nella richiesta iniziale). Spero che questo chiarisca le cose! in bocca al lupo!

+2

e come si esegue una query che? $ facebook-> api ??? – max4ever

+1

Ci sono molti modi ... puoi fare "file_get_contents ($ paging_url)" o usare cURL ... secondo me [file_get_contents()] (http://php.net/manual/en/function.file-get- contents.php) è il modo più semplice ... – Lix

+1

potresti anche usare la funzione facebook-> api e aggiungere solo quei limiti, i parametri di offset alla chiamata - es .: '$ fb-> api ("/me/mi piace /? limite = 5000 & offset = 5000 ");' – Lix

13

Tutte le risposte precedenti sono valide.

Qui è il mio modo di fare, per ottenere tutti i risultati "next" con l'API Grafico:

Si noti che non ottengo risultati "precedenti".

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

È possibile modificare il valore di $ limite come desiderato, per ottenere meno/più dati per chiamata.

+1

questo è un buon pezzo di codice, tuttavia si prega di notare che '' 'La paginazione basata su offset non è supportata per tutte le chiamate API. Per ottenere risultati coerenti, ti consigliamo di impaginare utilizzando i link precedenti/successivi che restituiamo nella risposta. '' 'Fonte: https://developers.facebook.com/docs/graph-api/using-graph-api/v2.2 – augusto

+0

riferirsi anche a questo http://stackoverflow.com/questions/9576211/facebook-graph -api-loop-through-paging –

+0

Nel mio test di questo 'in_array ('paging', $ data)' non ha restituito true, ma 'array_key_exists ('paging', $ data)' ha fatto. –

5

mi sono adattato modo di trattare con paginazione F2000 s' e ottenuto seguente codice:

// Initialize the Facebook PHP SDK object: 
$config = array(
    'appId'  => '123456789', 
    '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. 

Il codice sembra funzionare. Facoltativamente, per una maggiore affidabilità, potrebbe provare a gestire problemi di connessione temporanei, ma l'ho saltato per chiarezza del codice.

Sto usando Facebook PHP SDK 3.1.1

+1

So che questo ha due anni, ma volevo solo aggiungere: Se usi un ciclo while mentre invece un ciclo while, metti "$ friends = ..." e "$ offset + = ..." linee dopo la chiamata api, è possibile ritagliare quella prima chiamata api. – musicnothing

2

Gli URL impaginazione restituite da Facebook non sono compatibili con il proprio PHP SDK.

È possibile estrarre le informazioni necessarie dall'API dagli URL di impaginazione e passarle all'API SDK.

Utilizzare la funzione PHP parse_url o alcune manipolazioni di stringhe per estrarre tali informazioni.

codice di esempio per recuperare parte della mia lista di amici (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); 
0

Facebook interrogazione con limite e impaginazione di offset non funzionava bene non tornare tutti i risultati, così ho fatto un ricorsiva funzione utilizzando i campi di paginazione ['successivo'] forniti dall'API.

La funzione:

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 è possibile inizializzare con un array vuoto e la query che si desidera ottenere, come nel seguente esempio:

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

Speranza che aiuta!

PD: Il mio scopo Facebook si chiama $ facebook

1

Non si può effettivamente utilizzare il prossimo URL direttamente, Facebook PHP SDK non lo supporta, ma è possibile utilizzare le funzioni standard di PHP per estrarre i dati necessari. L'ho usato per facebook Search API, questo è l'esempio

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