Получение фотографий друзей с помощью FQL

Я создаю продукт, который использует изображения друзей пользователей Facebook. Я нашел несколько примеров на SO, которые фильтруют фотографии, фильтруя альбомы и список друзей пользователей следующим образом:

SELECT pid, link, owner
FROM photo
WHERE aid IN 
  (SELECT aid FROM album WHERE owner IN 
    (SELECT uid2 FROM friend WHERE uid1=me()) 
  )

Но почему я не могу пропустить сборник альбомов? Следующее должно работать, но запуск его в Graph API Explorer никогда не возвращает результат (например, тайм-аут, который никогда не происходит):

SELECT pid, link, owner
FROM photo
WHERE owner IN (SELECT uid2 FROM friend WHERE uid1=me())
AND created > strtotime("10 February 2013")
ORDER BY created DESC

Токен, который я использую, наверняка имеет «user_photos» и «friends_photos». Использование обычного обозревателя графиков также имеет такое же поведение, результат никогда не отображается:

введите здесь описание изображения

Это ошибка моей логики, ошибка платформы Facebook или здесь происходит что-то странное?


person Nippysaurus    schedule 10.03.2013    source источник


Ответы (1)


Говоря о:

SELECT pid, link, owner
FROM photo
WHERE owner IN (SELECT uid2 FROM friend WHERE uid1=me())
AND created > strtotime("10 February 2013")
ORDER BY created DESC
  • Во-первых, этот запрос истекает.
  • Во-вторых, запрос FQL может дать только 5000 результатов, тогда как наши друзья загрузили гораздо больше фотографий.
  • В-третьих, вы пытались улучшить первый запрос, который не работает (в моем случае он нашел только 1470 фотографий моего друга).
  • В-четвертых, даже если бы ваш второй запрос не истек по таймауту и ​​мог бы дать более 5000 результатов, этот запрос не дал бы всех фотографий друзей пользователя. Потому что этот запрос:

    SELECT pid, link, owner FROM photo WHERE owner=USER_ID дает только последние 100 фотографий пользователя, тогда как у пользователя может быть, например, 2000 фотографий.

Так что, по крайней мере, нам не нужно исправлять ваш запрос, но мы должны попытаться сделать новый. Цель состоит не в том, чтобы сделать как можно меньше запросов при выполнении сложных запросов, а в том, чтобы сделать что-то ясное, что работает.

Сначала попробуем получить все фотографии одного пользователя.

SELECT pid, link, owner
FROM photo
WHERE owner=USER_ID
AND created > strtotime("10 February 2013")
ORDER BY created DESC
LIMIT 5000 OFFSET 0

Теперь мы получаем не 100 фотографий, а 5000!

Во-вторых, получаем всех пользователей-друзей:

SELECT uid2 FROM friend WHERE uid1=me() LIMIT 5000

Максимальное количество друзей для пользователя действительно 5000.

Теперь все, что вам нужно сделать, это:

  1. сделать один запрос, который получает список друзей пользователя.
  2. чтобы зациклиться на каждом друге и сделать один запрос для каждого из них, чтобы получить их фотографии. ЕСЛИ количество фотографий не менее 5000, это означает, что у пользователя еще есть фотографии для показа. Затем вам нужно будет сделать еще один запрос, увеличив OFFSET на 5000!

Теперь вы обязательно получите все фотографии друзей пользователя! Кроме того, неплохо разбить эту процедуру на несколько более мелких запросов; вы сможете узнать ход выполнения запроса, который вы можете отобразить, например, в виде индикатора выполнения в AJAX. Это может быть хорошо, потому что это займет много времени!

person Stéphane Bruckert    schedule 10.03.2013
comment
Спасибо за подробный ответ, очень приятно :) - person Nippysaurus; 11.03.2013
comment
Да, это занимает некоторое время. Мой первоначальный метод занимал 10 минут, чего просто не происходит :) Я делал что-то похожее на то, что вы предлагаете, что занимало около 2 минут, что все еще немного долго, но может быть лучшим решением. - person Nippysaurus; 11.03.2013
comment
Старайтесь держать пользователя в курсе прогресса! Иначе он может заскучать. Но 2 минуты для такого количества данных — это нормально, да. - person Stéphane Bruckert; 11.03.2013