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. У многих айтишных пабликов (в т.ч. Хабра) списки подписчиков закрыты, и учитывать их не получится.