VK предоставляет очень неплохие инструменты для таргетирования рекламы, которые позволяют найти людей нужного пола, возраста, социального и семейного положения, подписанных на определенные группы и т. д. Это только верхушка айсберга, если покопаться в больших данных, доступных соцсетям, можно узнать про человека чуть ли не больше, чем он сам о себе знает.

При этом механизма поиска новых друзей фактически нет, что довольно иронично в контексте социальной сети. С другой стороны, оно и понятно, если что-то не приносит дохода, значит развиваться, скорее всего, не будет. Для знакомств VK не так давно запустил приложение, но, насколько я понимаю, это фактически клон Tinder, и он совсем никаких данных из профилей не подтягивает, даже банального отношения к курению или алкоголю — от соцсети там только авторизация.

Нам стало интересно, насколько реально исправить эту ситуацию с помощью VK API, и вот, что из этого вышло:

Лента единомышленников на главном экране

Как было?


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

Но у этого варианта есть следующие минусы:

  • Много заброшенных, закрытых, фейковых профилей
  • Поиск по полям жизненной позиции сломан
  • Мультивыбора в поиске нет, то есть негативное и резко негативное отношение к алкоголю, например, — выбрать нельзя
  • Приходится постоянно переключаться между вкладками браузера
  • Приходится вручную оценивать, на каком месте у пользователя в списке рассматриваемый паблик, правда ли он ему интересен
  • Приходится вручную оценивать, на что ещё подписан пользователь, нет ли там других интересных нам пабликов, или чего-то неприемлемого.
  • Нельзя пометить просмотренные профили, если за раз всех не просмотрел

К счастью, практически всё это решаемо, а учитывая 100 миллионов активных пользователей в месяц, шансы найти единомышленников появляются даже у интровертов с очень специфичными вкусами.



Как стало?


Мы решили попробовать сделать проект, основанный на анализе подписок, с удобным интерфейсом и средствами автоматизации. В полностью автоматическом режим алгоритм примерно такой:

  1. Пользователь логинится через VK
  2. Скачиваем список его подписок (меньше 1М)
  3. Оцениваем каждую из них в соответствии с положением в списке
  4. Скачиваем N подписчиков из каждой его группы (N зависит от того, сколько времени он указал)
  5. Находим в базе пользователей, подписанных на несколько групп, и рассчитываем их рейтинг
  6. Для людей с наибольшим рейтингом скачиваем их списки подписок, чтобы убедиться, что найденные группы находятся не на 2048 месте построить их топ интересов

Далее программа переходит в ручной режим, где можно дополнительно указать нежелательные группы, изменить оценки, добавить группы, на которые не подписан, но люди из которых тоже интересны — всё пересчитается, топ перестроится.


Есть ещё полный режим, который можно применять для анализа отдельных групп небольшого размера. В нём база формируется исключительно путем получения данных от каждого пользователя, не требуется скачивать все группы в списке.

Про исходный код


Мы решили открыть исходники, чтобы каждый (знающий С++, ага) мог экспериментировать даже с теми параметрами, которые не вынесены в настройки. Ну и никто не переживал, что его страницу уведут в рабство к ботоводам, а данные продадут в даркнете.

Некоторые разработчики открывают код, чтобы похвастаться — смотрите как я могу. Это не тот случай. Проект развивался без четкого ТЗ, с постоянно меняющимися требованиями, и хорошей архитектуры тут как класса быть не может — даже самая гибкая, чаще всего, гнётся совсем не там, где предполагалось. После того, как проект примет финальный вид, и требования становятся понятны, обычно приходится делать очень масштабный рефакторинг, но в данном случае мы решили повременить с ним.

Во-первых, программа стала особенно актуальной в свете последних событий, и затягивать релиз ещё на месяц было бы глупо. Вдруг кому-то на карантине особенно одиноко, можно найти друзей в интернете.

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

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

Системные требования


Монитор от 1366 х 768, рекомендуется FullHD. SSD тоже лишней не будет.

Базы больше чем на 5 миллионов не тестировали, после 10 наверняка начнутся сильные тормоза. Перейти на более мощную СУБД можно довольно быстро (абстракции Qt позволяют), но пока это представляется нецелесообразным, потому как многомиллионные паблики мало что говорят о подписчиках, нишевые вещи не могут быть интересны настолько многим.

Исходники тут. Бинарники под Windows и Linux.

P.S. У меня есть мысли о том, как VK могла бы улучшить ситуацию на своей стороне, но это тема для отдельной статьи.

P.P.S. У многих айтишных пабликов (в т.ч. Хабра) списки подписчиков закрыты, и учитывать их не получится.