Facebook Graph API批量分页

时间:2014-05-16 04:00:58

标签: php facebook api

我正在努力了解如何利用分页请求对Facebook的Graph API进行批量请求。

我对下面代码的问题是,尽管我试图跟踪数据库中每个facebook_id的偏移量,但我无法确定特定请求何时出现空白,因此不应该再次请求。

我正在从响应中的分页数组中解析facebook_id。当没有更多帖子可用时,FB返回一个空的data数组,因此我无法识别哪个请求没有更多页面,从而减少后续请求。每次我使用$fb_batch_limit网址查询FB,尽管并非所有请求都返回了上一次呼叫中的寻呼令牌。

真正的程序员将如何解决这个问题?

    $posts = array();

    //$fb_batch_limit = 30;
    $fb_batch_limit = 2;
    $fb_req_limit=10;

    $facebook = new Facebook(array(
            'appId'  => $fb_app_id,
            'secret' => $fb_app_secret
    ));
    $facebook->setAccessToken($fb_user_token);
    $index = 0;
    $since = '1Jan14';
    $until = 'today';

    $num_records_res = $oDB->select("SELECT count(*) as count FROM facebook f");
    $num_records_row = mysqli_fetch_array($num_records_res);
    $num_records = $num_records_row['count'];
    while($index < $num_records) {
            printf("# %d to %d\n", $index, $index+$fb_batch_limit);
            $res = $oDB->select("SELECT facebook_id FROM facebook f ".
                                "LIMIT $index, $fb_batch_limit");
            $index = $index + $fb_batch_limit;
            $offsets = array();
            while($rr = mysqli_fetch_array($res)){
                    $offsets[$rr['facebook_id']] = 0;
            }
            if (!count($offsets)) {
                    printf("no more accounts\n");
                    break;
            }

            $r=1;
            do {
                    $urls = array();
                    foreach ($offsets as $fbid => $offset) {
                            $tmp["method"] = 'GET';
                            $tmp["relative_url"] = "/".$fbid."/feed?fields=likes.limit(1).summary(true)&offset=$offset&limit=$fb_req_limit";//&since=$since&until=$until";
                            $tmp["include_headers"] = false;
                            $urls[] = $tmp;
                    }
                    $numurls = count($urls);
                    printf("$r: fetching %d urls have %d posts\n", $numurls, count($posts));
                    $response = $facebook->batch($urls);
                    foreach ($response as $result) {
                            if (array_key_exists("error", $result)) {
                                    //FIXME handle rate limits somehow
                                    print_r($result);
                                    die;
                            }
                            if (array_key_exists("paging", $result)) {
                                    $fbid = substr(parse_url($result['paging']['previous'])['path'],6);
                                    $fbid = substr($fbid, 0, -5);

                                    if (($count = count($result['data'])) > 0) {
                                            $posts = array_merge($posts, $result['data']);
                                            if (array_key_exists("paging", $result) && array_key_exists("next", $result["paging"])) {
                                                    if (array_key_exists($fbid, $offsets)) {
                                                            $offsets[$fbid] += $count;
                                                    }
                                            }
                                    }
                                    else {
                                            printf("$fbid complete with ". 
                                                     $offsets[$fbid]." posts\n");
                                            unset($offsets[$fbid]);
                                    }
                            }
                            else {
                                    // how to stop requesting this single url?
                                    print_r($result);
                                    echo "--\n";
                                    $numurls--;
                            }
                    }
            } while (++$r && $numurls);
    }

0 个答案:

没有答案