Facebook Graph API - поиск лучших друзей пользователей

Я пишу приложение для Android, которое потянет список всех друзей пользователей, чтобы они могли пометить их на фотографии, но отображая большую папку друзей с их фотографией вместо списка. Поскольку у некоторых людей более 500 друзей, мы все знаем, что их всего лишь несколько (может быть, 50), которые являются друзьями, которые активно общаются на Facebook по комментариям или помечены на фотографиях. Я хотел бы иметь возможность просто вытащить своих лучших друзей xxx, поскольку кажется, что Facebook делает то же самое на своем сайте, но я просто не могу найти что-либо в Graph API для выполнения этой задачи.

У кого-нибудь есть указатели?

Ответы

Ответ 1

Другой способ сделать это - сделать запрос API Графа для сообщений о статусе, отправленных пользователем, друзей, которые прокомментировали или понравились его статус, являются те, с кем он/она взаимодействует больше всего, делая это довольно просто, вы можете использовать это:

    $statuses = $facebook->api('/me/statuses');

    foreach($statuses['data'] as $status){
    // processing likes array for calculating fanbase. 

            foreach($status['likes']['data'] as $likesData){
                $frid = $likesData['id']; 
                $frname = $likesData['name']; 
                $friendArray[$frid] = $frname;
            }

         foreach($status['comments']['data'] as $comArray){
         // processing comments array for calculating fanbase
                    $frid = $comArray['from']['id'];
                    $frname = $comArray['from']['name'];
    }
}

сохранить счетчики по вашему выбору, и это будет сделано.

Ответ 2

Я хотел сделать это, не требуя дополнительных/расширенных разрешений. Я нашел довольно приличное приближение для своих нужд, это поле mutual_friend_count в таблице пользователя FQL.

Итак, я использовал:

$params = array('method' => 'fql.query',
                'query' => 'SELECT uid, pic_square, name 
                 FROM user 
                 WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me()) 
                 ORDER BY mutual_friend_count DESC

А затем просто запустите это с помощью SDK PHP

$friend_array = $facebook->api($params);

Ответ 3

Я столкнулся с этой же проблемой в веб-приложении, над которым я работаю, и открыл исходный код, который я использовал, хотя в Ruby:

https://github.com/mikejarema/facebook-friend-rank

Это фактически веб-служба, которая принимает активный токен доступа и идентификатор пользователя и (при условии предоставления разрешения read_stream) возвращает хэш идентификаторов для подсчетов, которые могут использоваться для сортировки в вашем приложении для Android.

Я полагаю, что, поскольку вы работаете на смартфоне, это позволяет вам выгружать серию вызовов и любую задержку вызова на сервер где-нибудь, где работает код, оптимизированный специально для задачи ранжирования друзей.

В частности, алгоритм ранжирования рассматривает пользователя в 500 самых последних взаимодействий (поток активности) и подсчитывает частоту появления всех друзей. Результат дает разумный порядок друзей, лучше всего худший, а также работает на подмножества друзей (например, сортировка общих друзей).

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

Здесь пример приложения с использованием этого подхода и Friend Rank на бэкэнд, проверьте сетевые вызовы, чтобы увидеть, как выглядит API:

http://facebook-friend-rank.herokuapp.com/demo/index.html

Ответ 4

Если вы просматриваете сетевой трафик из приложения Facebook iPhone, вы можете увидеть, что они делают этот вызов FQL, чтобы получить 10 лучших друзей, которых они больше всего общаются:

SELECT uid2, communication_rank   
FROM friend where uid1 = me() 
ORDER BY communication_rank DESC LIMIT 10

К сожалению, по умолчанию это приложение недоступно. Вам нужно будет связаться с инженером Facebook, чтобы получить это поле для вашего приложения.

Ответ 5

Я рекомендую вам следующий класс:

https://github.com/gajus/facebook-friend-rank

Это дает вашим друзьям оценку на основе взаимодействия с пользователем:

'feed_like' 'Feed_comment' 'Feed_addressed' 'Photo_tagged_friend_by_user'
'Photo_tagged_user_by_friend'
'Photo_like'
'Photo_comment' 'Friend_mutual' 'Inbox_in_conversation' 'inbox_chat'

то он сортирует список по счету desc.

Надеюсь, что это поможет.

Ответ 6

Я могу думать о двух прямых способах получить "лучших друзей" пользователя. Первый не требует каких-либо расширенных разрешений, а просто действительный токен доступа (который, как владелец приложения, у вас будет). Вы вызываете API-вызов, чтобы получить пользовательский фид, который является подключением к пользователю node.

Этот вызов будет у пользователя 25 последних сообщений. В любом случае, по крайней мере, некоторые из элементов в массиве JSON, возвращенные из этого вызова, будут сообщениями от друзей этого пользователя. Как узнать? Хорошо, что каждое сообщение, содержащее фид, будет иметь уникальный идентификатор, связанный с ним, независимо от того, является ли приложение или пользователь FB источником Post, и каждый из этих идентификаторов FB можно сравнить с списком друзей пользователя.

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

Второй способ заключается в вызове API-интерфейса Graph, запрашивающего подключение друзей-листов к пользователю node. Для этого вызова требуется разрешение * read_friendlists *. Имя, которое пользователь дает данному списку, часто является убедительным доказательством важности друзей, входящих в этот список (например, * best_friends * или что-то еще); другими словами, одна или комбинация из нескольких этих списков, вероятно, даст вам этих лучших друзей.