Взлом Nuzzel
Как информационный наркоман, я большой поклонник приложения для агрегирования новостей Nuzzel. Поиск интересных вещей для чтения - один из моих основных вариантов использования Twitter, и Nuzzel значительно ускоряет этот процесс. Для непосвященных приложение ранжирует статьи за определенный период времени (по умолчанию - 24 часа) по тому, сколько людей, на которых вы подписаны, поделились этой статьей. Очень аккуратный.
Одна функция приложения, которую я считаю особенно полезной, - это возможность просматривать ленты других людей. Если я зациклен на макроэкономике, я могу проверить ленту Марка Андрессена. Хотите узнать, о чем сегодня говорят технические журналисты? Посмотрите ленту Алексии Цоцис.
Однажды ночью, просматривая ленты других людей, я заметил, что у самых популярных статей в ленте всех было максимум около 10 репостов. Это число оказалось на удивление низким. Достаточно низкий, чтобы можно было манипулировать.
Поэтому я решил попробовать именно это.
Обрамление проекта
Учитывая, что я работаю в сфере технологий и большинство людей, на которых я подписан в Твиттере, тоже, я полагал, что будет значительное совпадение пользователей, на которых подписаны люди, на которых я подписан (что за вздор). Таким образом, я решил определить, каким 10 пользователям нужно будет написать твит об одной и той же статье, чтобы она попала в топ самого большого числа каналов моих друзей Nuzzel.
Моя стратегия заключалась в следующем:
- Получите список всех моих друзей Nuzzel
- Получите список всех людей, на которых они подписаны в Twitter.
- Найдите пользователей с наибольшим количеством подписчиков, которые являются моими друзьями Nuzzel
Это довольно просто, так что давайте углубимся. Или, если вы нетерпеливы, быстро прокрутите вниз до раздела «Результаты».
(не забудьте проверить примечания, чтобы найти дополнительные данные, информацию и содержательные комментарии. - ›)
Получение списка всех моих друзей на Nuzzel.
К счастью, в Nuzzel есть функция обнаружения, которая показывает вам всех, на кого вы подписаны, кто также использует Nuzzel. К сожалению, они открывают только полный список через свое мобильное приложение, что затрудняет его сбор.
Я мог бы собрать список вручную, но я ленивый. Вместо этого я решил получить данные прямо из их API. Для этого мне пришлось немного перехватить пакет с помощью инструмента Charles. Вот как я это сделал:
- Скачал, установил и запустил Charles.
- Настроил мой iPhone на прокси через Чарльза.
- Сам MITM установил корневую сертификацию Charles, чтобы я мог читать запросы SSL.
- Добавьте https://api.nuzzel.com в настройки SSL-прокси в Charles.
- Запустите Nuzzel, откройте левое меню, нажмите «Ленты друзей», дождитесь загрузки и проверьте полезную нагрузку в Charles.
Похоже, у Nuzzel есть хороший RESTful API, использующий заголовок X-NuzzelApiKey для аутентификации. Конечная точка для вашего списка друзей:
https://api.nuzzel.com/v1.0/users/[Your Nuzzel ID]/friends
Ответ от этой конечной точки представляет собой хорошо структурированный ответ JSON с некоторыми интересными данными: какие услуги выполняет аутентификация пользователя, считает ли Nuzzel спамом, все их списки в Twitter и т. Д.
Но единственная информация, которая меня действительно интересовала из ответа, - это их идентификатор в Twitter, поэтому я мог получить их следующий список из Twitter. Немного Python упростил синтаксический анализ:
В моем случае у меня было 128 друзей на Nuzzel (~ 25% людей, на которых я подписан в Твиттере).
Шаг 1 выполнен.
Получение списка пользователей, на которых подписаны мои друзья
У Twitter могут быть не самые лучшие отношения с разработчиками в Долине, но их API прост и хорошо документирован. Давайте сразу перейдем к коду:
Ограничение скорости Twitter здесь довольно жесткое. В зависимости от того, сколько у вас друзей Nuzzel, это может занять некоторое время. В моем случае время работы составило 2 часа.
Переходим к шагу 3.
Анализ данных
Как только я собрал все данные, пришло время покопаться. Во-первых, я проверил парочку интересных статистических данных:
- 7 человек в наборе подписаны более чем на 5000 человек.
- 128 человек в наборе данных следят в среднем за ~ 1300 людьми.
- Всего за данными 175 тыс. Подписчиков, за которыми следят 89 тыс. Разных людей.
- Самым читаемым человеком среди моих друзей Nuzzel был Марк Андриссен - 102 из них следовали за ним. Он едва выиграл у Фреда Уилсона 101. Игра на ребят.
Хорошо, перейдем к реальной задаче: найти группу из 10 человек, из-за которых статья окажется в верхней части наибольшего числа каналов Nuzzel моего друга. Оказывается, это не так просто.
С 89 тысячами разных людей есть чертовски почти бесконечное количество различных наборов из 10 человек, которые нужно проверить. Итак, первый шаг - попытаться сократить пространство поиска. Мы можем добиться значительного прогресса, сделав основное наблюдение, что 10 самых популярных людей в моем списке, вероятно, составят довольно сильный сет из 10 человек. Давайте посмотрим, сколько каналов моего друга может показывать статья с этим базовым набором:
В моем случае число обычных подписчиков среди 10 самых популярных людей составляло 43. Довольно впечатляюще. Этот базовый уровень позволяет нам отсечь всех, у кого нет по крайней мере 43 моих друзей Nuzzel, следующих за ними. Извините. Вот код для этого:
В моем отфильтрованном списке сейчас всего 194 человека. Это хорошее сокращение, но все же остается 1,6 x 10 ^ 16 возможных наборов из 10 человек. Очевидно, все еще слишком много возможностей, чтобы попробовать попытку грубой силы.
Теперь начинается самое интересное. Поскольку пространство поиска очень велико, невозможно найти гарантированный глобальный максимум из 10 человек, но мы можем поискать приближение.
Стратегия, которую я реализовал, представляла собой смесь определенного типа генетического алгоритма с имитацией отжига. Процесс был следующим:
- Начните с базового набора из 10 человек с наибольшим количеством подписчиков.
- Найдите человека, который больше всего снижает количество общих подписчиков. Это делается путем удаления каждого человека из списка и проверки количества общих подписчиков в оставшейся группе. Тот, кто больше всего сокращает список, является нашей целью.
- С некоторой вероятностью игнорируйте цель удара и вместо этого выберите случайного члена группы в качестве цели удара. По мере приближения алгоритма к завершению эта вероятность уменьшается.
- Замените цель удара случайным, не членом группы. Убедитесь, что количество общих подписчиков в новой группе больше, чем в старой. Если это так, оставьте это себе. Если это не так, оставьте старую группу без изменений.
- Повторяйте много раз.
- Чтобы продвинуться еще дальше, запустите алгоритм еще раз, но выберите самых влиятельных людей из вашего первого прохода в качестве базового набора.
Код времени. Вот метод оптимизации. Я передал отфильтрованный список пользователей из предыдущего шага и 100 000 в качестве параметров.
Вы можете взглянуть на эту суть, если хотите увидеть остальную часть кода.
Результаты, достижения!
Без лишних слов, я представляю вам лучший набор из 10 человек, который придумал мой алгоритм:
- Марк Андриссен (https://twitter.com/pmarca)
- Фред Уилсон (https://twitter.com/fredwilson)
- Крис Диксон (https://twitter.com/cdixon)
- Аарон Леви (https://twitter.com/levie)
- Охотничья прогулка (https://twitter.com/hunterwalk)
- Илон Маск (https://twitter.com/elonmusk)
- М.Г. Зиглер (https://twitter.com/mgsiegler)
- Дик Костоло (https://twitter.com/dickc)
- Кейт Рабуа (https://twitter.com/rabois)
- Джош Эльман (https://twitter.com/joshelman)
Welp. Непростая задача - заставить этот список тех, кто активно занимается технологической индустрией, поделиться одной и той же статьей в течение 24 часов.
Но если бы они это сделали, эта статья прочно заняла бы первое место в 48 каналов моих друзей Nuzzel (исключая их собственные каналы). Помните, что список из 10 самых популярных людей поместил бы статью в топ 43 каналов. За всю эту работу мы получили 5 дополнительных топ-каналов. Это 37,5% всех каналов моего друга Nuzzel. Нет. Тоже. Потрепанный.
Поздравления М. Сиглер, Дик Костоло, Кейт Рабуа и Джош Элман. У вас больше мощности подачи, чем у Криса Сакки, Пола Грэма, Эва Уильямса и Дэйва МакКлюра.
Для полноты, список каналов 48 человек можно найти по этой сути.
Заключение
Надеюсь, читать и следить за этим было так же интересно, как и исследовать и писать. Короче говоря, если нужная группа людей поделится историей, она получит больше внимания, чем самые известные люди. Полагаю, это не удивительно, но, безусловно, интересно конкретно изучить.
Если у вас есть лучший способ сделать шаг оптимизации, мне интересно узнать, как вы могли бы это сделать! Рад поделиться своими дамами данных :-)