Поиск друзей пользователя с помощью Facebook Graph API - PullRequest
8 голосов
/ 27 апреля 2011

Я пытаюсь разрешить пользователям, которые подключили свои учетные записи Facebook к моему приложению rails, найти своих друзей на Facebook, которые уже зарегистрированы в приложении, предпочтительно в формате индекса (аналогично отображению на Formspring).

В настоящее время я использую Devise, OAuth + Fbook Javascript SDK и Koala.У меня есть UID Facebook каждого пользователя, который подключает его Facebook, сохраненный в БД, но я не знаю, как отфильтровать результаты вызова API Facebook @friends = @ graph.get_connections ("я", "друзья")для того, чтобы отобразить пользователей, которые имеют соответствующие UID, к данным вызова API.

Есть мысли?Вероятно, есть даже лучший способ, так что позвольте мне знать, нужна ли какая-либо дополнительная информация.Большое спасибо за вашу помощь!

РЕДАКТИРОВАТЬ (снимок экрана действия индекса в контроллере пользователя)

enter image description here

Примечание в @oauth, идентификатор приложения и секрет приложения обрезаютсяв примере изображения

Ответы [ 2 ]

16 голосов
/ 27 апреля 2011

Если вы можете получить массив UID для друзей пользователя, вы можете найти их все в одном SQL-выражении, используя IN (некоторые здесь - ручная пометка и / или псевдокод, в зависимости от атрибутов и т. Д.):

uids = @friends.collect(&:uid)
# uids is an array of Facebook UID's, say [1234, 5678, 9012]
registered_friends = User.where('fb_uid IN (?)', uids)
# "SELECT users.* FROM users WHERE (fb_uid IN (1234, 5678, 9012))"

Если ваши данные Facebook находятся в другой модели, вы можете выбрать эту модель и сделать includes, чтобы ввести пользователя.

registered_friends = Authorizations.where(:type => 'Facebook') \
  .where('fb_uid IN (?)', uids).includes(:user).collect(&:user)

[Обновить]

Похоже, что Koala возвращает массив хэшей на основе строк, поэтому вы не сможете использовать collect(&:id) для получения идентификаторов.Вот что я использовал для получения массива идентификаторов на консоли (секретные данные замаскированы, очевидно):

pry(main)> oauth = Koala::Facebook::OAuth.new 'xxxxxxx', 'yyyyyyyyy'
=> #<Koala::Facebook::OAuth:0x00000100d03be8>
pry(main)> token = 'zzzzzzzzzz'
=> "zzzzzzzzzz"
pry(main)> graph = Koala::Facebook::GraphAPI.new token
=> #<Koala::Facebook::GraphAPI:0x00000100ce3ac8>
pry(main)> friends = graph.get_connections "me", "friends"
=> [{"name"=>"A Friend", "id"=>"An ID"}, {"name"=>"Another Friend", "id"=>"Another ID"}]
uids = friends.collect { |f| f["id"] }
=> ["An ID", "Another ID"]

Кроме того, если вы следуете соглашениям Rails, поле id вашего ServicesТаблица будет основным ключом записи, а не идентификатором Facebook пользователя службы, поэтому вам может потребоваться выполнить запрос в другом поле.

2 голосов
/ 14 июля 2015

[Обновить]

API Graph Facebook больше не предоставляет доступ к полному списку друзей пользователя для версии> = 2.0.Из документации API :

Друзья приложения : Конечная точка /me/friends больше не включает в себя полный список друзей человека.Вместо этого он теперь возвращает список друзей этого человека, которые также используют ваше приложение.

...