0

私は、私のページが好きな友達ごとにユーザーにポイントを与えるアプリに取り組んでいます。

私のページが好きなユーザーの友達の数を確認する方法が必要です。このコードを開発して、特定のページが好きかどうかを友達ごとに確認しました。

    $friends = $facebook->api('/me/friends'); //list my friends
    $time_start = microtime(true);
    echo "<pre>";
    $i = 0; //counter of likes
    $b = 0; //counter of request in single batch API request
    $batch_max = 50 // facebook allows max 50 requests in single batch API call
    $page_id = '187941397895831'; //example page ID, i'm checking how many of my    friends like this page
    $batch = array(); //array used for creating batch API request
    $data = array(); //array collecting all API requests results
    foreach ($friends['data'] as $friend) {
        $req = array(
            'method' => 'GET',
            'relative_url' => '/'.$friend['id'].'/likes'
        );
        $batch[] = json_encode($req);
        $b++;
        if ($b == 50) {
            $params = array(
                'batch' => '[' . implode(',',$batch) . ']'
            );
            $data[] = $facebook->api('/', 'POST', $params);
            $b = 0;
            $batch = array();
        }
    }
    $params = array(
        'batch' => '[' . implode(',',$batch) . ']'
    );
    $data[] = $facebook->api('/', 'POST', $params);
    foreach ($data as $data_set) { //iterate through results of each api request
        foreach ($data_set as $friend_likes) { //iterate through data of particular friend
            $likes_array = json_decode($friend_likes['body'], true);
            foreach ($likes_array['data'] as $single_like) { //iterate through all likes of a single friend
                if ($single_like['id'] == $page_id) { //if page id found in user's likes increase counter
                    $i++;
                }
            }
        }
    }
    $time_end = microtime(true);
    $time = $time_end - $time_start;
    echo $time."\n";
    echo $i;
    echo "</pre>";
    exit;

最終バージョンでは、友達をチェックするのではなく、各ユーザーの友達をチェックします。私のコードは 14 秒で実行されます。たとえば、100 人のユーザーを反復処理する必要がある場合、1400 秒かかります。それを行うより良い方法はありますか?私はFacebook APIの初心者なので、明らかなことを見逃す可能性があります:)

4

1 に答える 1

0

OK、これが実際のコードです。チェックする各ユーザーのアクセス トークンを知る必要があります。前のコードの 14 秒ではなく、約 0.6 秒で実行されます。

$queryResults = array();
$facebook->setAccessToken($user->getAccessToken());
$fql = "SELECT '' FROM page_fan WHERE page_id = 'xxxxxxxxxxxx' AND uid IN (SELECT uid2 FROM friend WHERE uid1 = '".$user->getFbId()."')";
$fql = urlencode($fql);

try {
    $queryResults = $facebook->api(
        '/fql?q='.$fql
    );
} catch (FacebookApiException $e) {
    $log->setMessage(print_r($e,true));
    $logMapper->save($log);
}

if (!empty($queryResults)) {
    $user->setPoints(count($queryResults['data']));
    $usersMapper->save($user);
}
于 2013-01-02T09:37:41.357 に答える