PHP извлекает всех последователей Twitter и сравнивает их с друзьями - PullRequest
6 голосов
/ 03 апреля 2010

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

  • Логин пользователя
  • Получить всех друзей из Twitter
  • Получить всех последователей из Twitter
  • Показать всех друзей, которые не являются подписчиками

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

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

Кто-нибудь знает хороший способ обработки такого большого количества данных?

Ответы [ 3 ]

0 голосов
/ 12 апреля 2010

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

0 голосов
/ 12 апреля 2010

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

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 имен экранов. Если у пользователя 2 000 000 друзей, для получения списка идентификаторов потребуется 400 вызовов API, поэтому вы все равно должны кэшировать этот список, по крайней мере, для популярных пользователей.

0 голосов
/ 12 апреля 2010

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

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

Таким образом, подход, который может работать (от краткого обзора их документации API), будет

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...