PHP выбирают всех Подписчиков в Твиттере и сравнивают их с друзьями

Я ищу масштабируемый способ сделать следующее:

  • Пользовательский вход в систему
  • Выберите всех Друзей с Твиттера
  • Выберите всех Подписчиков с Твиттера
  • Отобразите всех Друзей, которые не являются Подписчиками

Проблема: Как это может быть сделано масштабируемым способом? У пользователя может быть до 2 миллионов друзей или подписчиков. В настоящее время я храню и в таблице SQLite и сравниваю их через цикл. Когда пользователь возвращается, таблица очищена, и процесс запускается снова.

Это работает оштрафованное над 100 - 1000 Друзьями.. но будет хитро с 500 000 Друзей. Я не могу кэшировать списки, потому что они могут изменяться каждый момент..

Кто-либо знает хороший способ обработать такой большой объем данных?

6
задан Charles 23 December 2012 в 21:45
поделиться

3 ответа

Я не знаю, как выглядит ваша база данных, но я бы настроил ее так.

CREATE TABLE twitter_users (
    user_id INTEGER PRIMARY KEY NOT NULL,
    screen_name VARCHAR(20) NOT NULL
);

CREATE TABLE friends (
    friend_id INTEGER PRIMARY KEY NOT NULL
);

CREATE TABLE followers (
    follower_id INTEGER PRIMARY KEY NOT NULL
);

Затем вы можете использовать этот SQL, чтобы найти друзей, которые не являются подписчиками.

SELECT friend_id, screen_name
FROM friends
LEFT JOIN followers ON follower_id = friend_id
LEFT JOIN twitter_users ON user_id = friend_id
WHERE follower_id IS NULL

Если экранное имя NULL , это означает, что их нет в вашей таблице twitter_users . Вы можете найти пропавших без вести пользователей и сохранить их на будущее. Названия экранов могут меняться, поэтому вам может потребоваться периодически обновлять таблицу.

Используйте API друзей / идентификаторов и подписчиков / идентификаторов , чтобы получить список идентификаторов друзей и подписчиков по 5000 за раз. Используйте API users / lookup , чтобы получить до 100 экранных имен. Если у пользователя 2000000 друзей, потребуется 400 вызовов API для получения списка идентификаторов, поэтому вам все равно следует кэшировать список, по крайней мере, для популярных пользователей.

0
ответ дан 18 December 2019 в 04:52
поделиться

Не единственный способ сделать это, но эффективный: запустить crontab для загрузки список пользователей твиттера каждый день с сайта, имеющего общедоступный список (или самого твиттера), а затем индексировать этих друзей (запускать, может быть, 1000 каждый день). Затем войдите в Twitter API через PHP с помощью cUrl, чтобы получить список ваших друзей и сопоставить массивы. Это хорошо работает, потому что вы можете улучшать свой алгоритм по мере продвижения - как отмечалось выше, ограничивающие политики не позволят вам делать что-либо еще. Удачи! =)

0
ответ дан 18 December 2019 в 04:52
поделиться

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

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

Итак, подход, который может сработать (после беглого просмотра документации по API), заключается в том, чтобы

  • взять часть их друзей (похоже, что вы получаете 100 за запрос в любом случае), используя statuses/friends API
  • для каждого полученного друга.
    • используйте friendships/show для определения статуса последователя между двумя
    • если у вас достаточно результатов (например. 20), то прервитесь, вы закончили

Этот подход требует больше запросов к серверу, чем разрешено политикой twitter ограничения скорости, но опять же, получение всего списка друзей пользователя с 2,000,000 друзей при 100 друзьях за запрос также превысит лимит задолго до того, как вы получите их всех (150 запросов x 100 за запрос = 15,000). Как вы планируете решить эту проблему?

.
0
ответ дан 18 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: