Добрый день.
У меня осталось 15 минут до конца обеденного перерыва (это важно), завтра выходной, а потому прошу мой пост приравнивать к пятничному.
В своем недавнем
посте товарищ
ParadoxFilm исследовал связи между участниками одной из групп «ВКонтакте», саму группу оставив анонимной. Поскольку в статье фигурировали реальные люди — участники группы, анонимизация по названию меня удивила. Процесс «деанонимизации» — под катом.
Итак, есть три
человека юзера: id97723 — Валерий Окунев, id206186029 Глеб Коломиец, id105522823 Ингруп Стс. Все они участники одной группы почти на 16000 человек, группа университетская. Задача: отыскать группу.
Первым делом я открыл контакты юзеров — если уж истина где-то рядом, почему бы ей не быть там? Один товарищ упоминает КВН с выступающей командой ВШЭ, другой там учился (третий состоит в группе dotNet разработчиков, привет, коллега). Окей, ищем группы по названию «ВШЭ». Результатов десятки, но поиск контакта удобно сортирует их по числу участников. Группы с 16 000 юзеров нет. Шерлок Холмс знал бы самые часто используемые синонимы, но мое имя даже на Ш не начинается.
Так что я расчехлил свою привычную VS2015 с Dark Theme, и скачал
VkNet библиотеку — она первая попалась в гугле. Обновил все необходимые NuGet пакеты, сориентировал проект на .net framework 4, накидал код
private static readonly int[] UserIds = { 97723, 206186029, 105522823 };
private static readonly VkApi Api = new VkApi();
static void Main(string[] args)
{
var zeroUserGroups = GetUserGroups(UserIds[0]);
Thread.Sleep(1000);
Console.WriteLine($"Groups for id {UserIds[0]}: {zeroUserGroups.Count}");
var firstUserGroups = GetUserGroups(UserIds[1]);
Thread.Sleep(1000);
Console.WriteLine($"Groups for id {UserIds[1]}: {firstUserGroups.Count}");
var secondUserGroups = GetUserGroups(UserIds[2]);
Thread.Sleep(1000);
Console.WriteLine($"Groups for id {UserIds[2]}: {secondUserGroups.Count}");
// Тут мы ищем группы, встречающиеся в наборах всех юзеров.
// Эх, надо было сразу вместо групп идентификаторы выделять
var groupsIntersection = zeroUserGroups
.Where(group => firstUserGroups.Any(insGroup => insGroup.Id == group.Id))
.Where(group => secondUserGroups.Any(insGroup => insGroup.Id == group.Id))
.ToList();
}
private static ReadOnlyCollection<Group> GetUserGroups(long userId)
{
GroupsGetParams getUserGroupParams = new GroupsGetParams() {UserId = userId};
return Api.Groups.Get(getUserGroupParams);
}
и словил
баттхерт исключение. Неавторизованный доступ, все дела. Пришлось регистрироваться в контакте, создавать приложение, копипастить applicationId, mail моей странички и мой же пароль в код (не повторяйте это в продакшне).
В итоге в самом начале метода Main появился код
ApiAuthParams authParams = new ApiAuthParams
{
ApplicationId = myAppId,
Login = "my@mail.com",
Password = "myPagePassword",
Settings = Settings.All
};
Api.Authorize(authParams);
В итоге все заработало, я получил лист из двух групп:
25205856,
66036248. Вторая группа называется «The Вышка», в ней сейчас 15968 человек. Среди них, кстати, и
автор первоначальной статьи.
Удачи тебе в IT, бро.
P.S. Процесс поиска занял 45 минут, «за 15 минут я еще и бутерброд доесть успею».
комментарии (15)