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

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

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

Есть ещё полный режим, который можно применять для анализа отдельных групп небольшого размера. В нём база формируется исключительно путем получения данных от каждого пользователя, не требуется скачивать все группы в списке.
Мы решили открыть исходники, чтобы каждый (знающий С++, ага) мог экспериментировать даже с теми параметрами, которые не вынесены в настройки. Ну и никто не переживал, что его страницу уведут в рабство к ботоводам, а данные продадут в даркнете.
Некоторые разработчики открывают код, чтобы похвастаться — смотрите как я могу. Это не тот случай. Проект развивался без четкого ТЗ, с постоянно меняющимися требованиями, и хорошей архитектуры тут как класса быть не может — даже самая гибкая, чаще всего, гнётся совсем не там, где предполагалось. После того, как проект примет финальный вид, и требования становятся понятны, обычно приходится делать очень масштабный рефакторинг, но в данном случае мы решили повременить с ним.
Во-первых, программа стала особенно актуальной в свете последних событий, и затягивать релиз ещё на месяц было бы глупо. Вдруг кому-то на карантине особенно одиноко, можно найти друзей в интернете.
Во-вторых, непонятно, интересна ли кому-нибудь вообще эта программа, и если нет — то смысла тратить время на улучшения кода тоже нет, ведь поддержки не предполагается. Так что за технический долг и срезание углов сильно не пинайте, мы в курсе.
Так же пришлось отложить и другие доработки, например ускорение работы через процедуры VK, или учет позиции группы в списке пользователя, чтобы уменьшить вклад групп, находящихся низко. Более ранний релиз и большая стабильность оказались важнее.
Монитор от 1366 х 768, рекомендуется FullHD. SSD тоже лишней не будет.
Базы больше чем на 5 миллионов не тестировали, после 10 наверняка начнутся сильные тормоза. Перейти на более мощную СУБД можно довольно бы��тро (абстракции Qt позволяют), но пока это представляется нецелесообразным, потому как многомиллионные паблики мало что говорят о подписчиках, нишевые вещи не могут быть интересны настолько многим.
Исходники тут. Бинарники под Windows и Linux.
P.S. У меня есть мысли о том, как VK могла бы улучшить ситуацию на своей стороне, но это тема для отдельной статьи.
P.P.S. У многих айтишных пабликов (в т.ч. Хабра) списки подписчиков закрыты, и учитывать их не получится.
При этом механизма поиска новых друзей фактически нет, что довольно иронично в контексте социальной сети. С другой стороны, оно и понятно, если что-то не приносит дохода, значит развиваться, скорее всего, не будет. Для знакомств VK не так давно запустил приложение, но, насколько я понимаю, это фактически клон Tinder, и он совсем никаких данных из профилей не подтягивает, даже банального отношения к курению или алкоголю — от соцсети там только авторизация.
Нам стало интересно, насколько реально исправить эту ситуацию с помощью VK API, и вот, что из этого вышло:

Как было?
Итак, для начала стоит расписать исходное состояние. Единственная адекватная стратегия, которая приходит на ум — это найти сообщество, которое максимально близко тебе по мировоззренческим / эстетическим / хоббийным показателям, и открыть поиск по подписчикам. Ввести некоторые фильтры, например возраст, и дальше уже смотреть просто всех подряд.
Но у этого варианта есть следующие минусы:
- Много заброшенных, закрытых, фейковых профилей
- Поиск по полям жизненной позиции сломан
- Мультивыбора в поиске нет, то есть негативное и резко негативное отношение к алкоголю, например, — выбрать нельзя
- Приходится постоянно переключаться между вкладками браузера
- Приходится вручную оценивать, на каком месте у пользователя в списке рассматриваемый паблик, правда ли он ему интересен
- Приходится вручную оценивать, на что ещё подписан пользователь, нет ли там других интересных нам пабликов, или чего-то неприемлемого.
- Нельзя пометить просмотренные профили, если за раз всех не просмотрел
К счастью, практически всё это решаемо, а учитывая 100 миллионов активных пользователей в месяц, шансы найти единомышленников появляются даже у интровертов с очень специфичными вкусами.

Как стало?
Мы решили попробовать сделать проект, основанный на анализе подписок, с удобным интерфейсом и средствами автоматизации. В полностью автоматическом режим алгоритм примерно такой:
- Пользователь логинится через VK
- Скачиваем список его подписок (меньше 1М)
- Оцениваем каждую из них в соответствии с положением в списке
- Скачиваем N подписчиков из каждой его группы (N зависит от того, сколько времени он указал)
- Находим в базе пользователей, подписанных на несколько групп, и рассчитываем их рейтинг
- Для людей с наибольшим рейтингом скачиваем их списки подписок, чтобы убедиться, что найденные группы находятся не на 2048 месте построить их топ интересов
Далее программа переходит в ручной режим, где можно дополнительно указать нежелательные группы, изменить оценки, добавить группы, на которые не подписан, но люди из которых тоже интересны — всё пересчитается, топ перестроится.

Есть ещё полный режим, который можно применять для анализа отдельных групп небольшого размера. В нём база формируется исключительно путем получения данных от каждого пользователя, не требуется скачивать все группы в списке.
Про исходный код
Мы решили открыть исходники, чтобы каждый (знающий С++, ага) мог экспериментировать даже с теми параметрами, которые не вынесены в настройки. Ну и никто не переживал, что его страницу уведут в рабство к ботоводам, а данные продадут в даркнете.
Некоторые разработчики открывают код, чтобы похвастаться — смотрите как я могу. Это не тот случай. Проект развивался без четкого ТЗ, с постоянно меняющимися требованиями, и хорошей архитектуры тут как класса быть не может — даже самая гибкая, чаще всего, гнётся совсем не там, где предполагалось. После того, как проект примет финальный вид, и требования становятся понятны, обычно приходится делать очень масштабный рефакторинг, но в данном случае мы решили повременить с ним.
Во-первых, программа стала особенно актуальной в свете последних событий, и затягивать релиз ещё на месяц было бы глупо. Вдруг кому-то на карантине особенно одиноко, можно найти друзей в интернете.
Во-вторых, непонятно, интересна ли кому-нибудь вообще эта программа, и если нет — то смысла тратить время на улучшения кода тоже нет, ведь поддержки не предполагается. Так что за технический долг и срезание углов сильно не пинайте, мы в курсе.
Так же пришлось отложить и другие доработки, например ускорение работы через процедуры VK, или учет позиции группы в списке пользователя, чтобы уменьшить вклад групп, находящихся низко. Более ранний релиз и большая стабильность оказались важнее.
Системные требования
Монитор от 1366 х 768, рекомендуется FullHD. SSD тоже лишней не будет.
Базы больше чем на 5 миллионов не тестировали, после 10 наверняка начнутся сильные тормоза. Перейти на более мощную СУБД можно довольно бы��тро (абстракции Qt позволяют), но пока это представляется нецелесообразным, потому как многомиллионные паблики мало что говорят о подписчиках, нишевые вещи не могут быть интересны настолько многим.
Исходники тут. Бинарники под Windows и Linux.
P.S. У меня есть мысли о том, как VK могла бы улучшить ситуацию на своей стороне, но это тема для отдельной статьи.
P.P.S. У многих айтишных пабликов (в т.ч. Хабра) списки подписчиков закрыты, и учитывать их не получится.
