В Facebook API Graph, как найти, кому из ваших друзей нравится определенная книга или фильм - PullRequest
7 голосов
/ 15 февраля 2011

Я пытаюсь выяснить, как узнать, сколько моих друзей любит определенную сущность.

Например, для определенной книги или фильма, как я могу узнать, сколько моих друзей уже полюбили одну и ту же книгу или фильм.

Я считаю, что информация появляется, когда мы показываем плагин fb: like button social, но я хочу получить это количество, чтобы я мог программно отображать самые популярные книги среди моих друзей и т. Д. В порядке убывания.

Мой бэкэнд - php, но я также использую Javascript SDK. Спасибо за ваш вклад заранее

1 Ответ

15 голосов
/ 15 февраля 2011

Эти "объекты" на самом деле являются страницами, поэтому, чтобы получить список друзей, например фильм или книгу (страницу), используйте следующий запрос:

SELECT uid FROM page_fan WHERE page_id = 91290503700 AND uid IN (SELECT uid2 FROM friend WHERE uid1=me())

Попробуйте это в консоли fql.query , он получит идентификатор всех ваших друзей, которым нравится начальный фильм.

EDIT:
Очевидный способ получить фильмы (например), который понравился бы вашим друзьям:

SELECT page_id,uid 
FROM page_fan 
WHERE type="MOVIE" 
AND uid IN (
    SELECT uid2 
    FROM friend 
    WHERE uid1=me()
)

Но я заметил, что он не вернет всех пользователей, если набор велик (что, скорее всего, имеет место для каждого пользователя) .. поэтому я взломал просто для начала!

function sectionArray($array, $step) {
    $sectioned = array();

    $k = 0;
    for ( $i=0;$i < count($array); $i++ ) {
        if ( !($i % $step) ) {
            $k++;
        }
        $sectioned[$k][] = $array[$i];
    }
    return $sectioned;
}

$result = $facebook->api(array(
    "method"    => "fql.query",
    "query"     => "SELECT page_id FROM page_fan WHERE type='MOVIE' AND uid IN (SELECT uid2 FROM friend WHERE uid1=me())"
));
$pages = array();

foreach($result as $k=>$v) {
    $pages[] = $v["page_id"];
}

$pages = array_unique($pages);
$pages = array_values($pages);
$sets = sectionArray($pages,10);

$movies = array();
foreach($sets as $set) {
    $page_set = implode(',',$set);
    $friends = $facebook->api(array(
        "method"    => "fql.query",
        "query"     => "SELECT page_id,uid FROM page_fan WHERE page_id IN ($page_set) AND uid IN (SELECT uid2 FROM friend WHERE uid1=me())"
    ));
    $movies[] = $friends;
}

$final = array();
foreach($movies as $v)
    foreach($v as $k=>$arr)
        $final[$arr["page_id"]][] = $arr["uid"];
print_r($final);

Этот код выполняет следующие действия:

  1. Получите все идентификаторы ФИЛЬМОВ, которые нравятся вашим друзьям
  2. Удалите повторяющиеся результаты и разделите результирующий массив на набор массивов (по 10 фильмов в каждом)
  3. Снова запросите Facebook, чтобы получить друзей для каждого сета (по 10 фильмов за раз), который , надеюсь, , даст вам полный список друзей
  4. сортировка по идентификатору фильма

И результат будет примерно таким:

Array
(
    [movie_id] => Array
        (
            [0] => friend_id
            [1] => friend_id
            [2] => friend_id
            [3] => friend_id
        )

    [movie_id] => Array
        (
            [0] => friend_id
            [1] => friend_id
            [2] => friend_id
            [3] => friend_id
            [4] => friend_id
            [5] => friend_id
            [6] => friend_id
            [7] => friend_id
        )

    [movie_id] => Array
        (
            [0] => friend_id
        )

    [movie_id] => Array
        (
            [0] => friend_id
        )
)

Отсюда вы можете проверить наиболее понравившиеся ... и т.д.

P.S .: Как я уже сказал выше, просто для начала, и я думаю, вы можете кэшировать некоторые запросы и повысить производительность.

...