Собираем группы и паблики

Значит в этой статье, мы рассматриваем всё то что находится в папке groups. К сбору информации для этой папки относятся:
- Группы
- Паблики
- Администраторы групп, пабликов и всего того где есть админы
- Аккаунты пользователей, на которых пользователь, за которого собирается информация подписался и у которых много подписчиков. То есть это те, которые находятся в подписках после пабликов.

К этой статье в программах написаны три функции, которые непосредственно отвечают за сбор информации с сайта ВК: infGr, adminsGr и grPages. Немного о каждой по подробнее.
- infGr эта функция почти такая же как и функция infUs которая применяет для запроса метод users.get. Только infUs собирает общую информацию о пользователях с сайта ВКонтакте, а infGr о группах и пабликах, применяя для запроса метод groups.getById. Когда мы будем собирать информацию за группы и паблики эта функция нам так же понадобится, для того что бы в папку wjsoncontents сохранять файл groupsget.txt, который будет аналогичным файлу usersget.txt, только для групп и пабликов. Сейчас же мы эту функцию будем применять для сбора администраторов с пабликов и групп, то есть всех тех пользователей, которые находятся в разделе контакты.
- adminsGr, по названию этой функции ясно, что она собирает админов групп и пабликов. И всех из раздела контактов. Вот в ней мы как раз и будем применять функцию infGr.
- grPages эта функция собирает и сохраняет группы, паблики и аккаунты пользователей, на которых пользователь подписался.

Так же ещё в обеих программах написана функция actives, которая подсчитывает количество повторяющихся элементов в массивах или в списках. Подавать ей нужно массив, а возвратит эта функция список. Давайте рассмотрим небольшой пример, допустим у нас есть список:
hello
quick
world
computer
hello
computer
computer
quick

И нам надо подсчитать сколько раз повторяется каждая строчка этого списка. Вот как раз для этого функция actives и написана. Подаём функции массив из этих строчек и на выходе у нас получается вот такой список, который можно сразу же сохранять в файл.

3 : computer
2 : quick
2 : hello
1 : world
Из примера видно, что функция не только подсчитывает элементы массива, но и сортирует результат, выводя в самое начало те элементы, которые больше всего повторяются и по убыванию вниз те которые меньше всего повторяются.

Для чего это нужно нам, в наших программах?
Для того что бы например подсчитывать активность пользователей по определённому аккаунту в отдельных задачах.
Допустим таких задач как лайки новостей, фото, комментариев, видео и т. д.. То есть кто-то лайкнул одну или две фотографии в аккаунте, а кто-то больше тысячи. Кто-то написал один или два комментария, а кто-то больше тысячи. На это конечно стоит обратить внимание.

Именно в этом случае, то есть в этой статье мы будем подсчитывать активность администраторов на определённое количество всех пабликов и групп взятых с одного аккаунта. Предположим у какого-то пользователя по которому собирается информация, к примеру 360 групп и пабликов на которые он подписан. И в этих трёхсот шестидесяти группах допустим есть 47 групп и пабликов, в которых админом является один и тот же пользователь. Это значит что в списке администраторов отображаться он будет вот таким способом- 47 : и дальше идентификатор этого пользователя или админа.

Теперь по программе Visual Studio. В коде этой программы написано ещё пять функций, четыре из которых являются аналогами функций из PHP языка:
array_unique - уникализирует повторяющиеся значения массива.
array_merge - добавляет в конец массива ещё один массив.
array_push - добавляет строчку в конец массива.
array_chunk - делит массив на части.

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

И ещё про пятую функцию в Visual Studio: bubble_sort. Эта функция будет отвечать за сортировку массива и применяться она будет в функции actives для сортировки списка активности пользователей. А именно выводить элементы массива которые больше всего повторяются, в низ по порядку. Потом в функции actives сработает функция Reverse и выведет элементы в обратном порядке, что бы начиналось с большего.
В PHP роль нашей функции bubble_sort исполняет функция natsort.
Значит в чём как бы их различие. Функция natsort, не просто располагает первые цифры до двоеточия по порядку, а ещё и те строчки которые после двоеточия, тоже располагает по порядку или по алфавиту если эти строчки с буквами.
Вот допустим пример который был приведён выше, сделан функцией actives написанной на PHP, то есть с применением natsort. И как вы можете наблюдать, не только первые цифры идут по порядку, но и слова после двоеточия тоже идут по порядку, а именно по алфавиту. Только не забываем, что функция array_reverse с PHP которая применяется в функции actives, переворачивает результат в обратную сторону.

Функция bubble_sort в Visual Studio так не сделает, она выведет по порядку только первые числа до двоеточия, а слова у которых первые числа, показывающие количество повторения одинаковые, будут расположены по месту своего расположения в массиве. Вот пример работы функции actives с Visual Studio на C Sharp:
3 : computer
2 : hello
2 : quick
1 : world
Из этого примера видно что слова hello и quick у которых одинаковое количество повторений, выводятся не по алфавиту и первое идёт quick, а второе hello. И расположены они, по месту своего расположения в массиве.
Вот это то, в чем будет разница результатов между функцией actives на C Sharp в Visual Studio и функцией actives в программе Devel Studio на PHP.

Но это не столь важное различие, так как количество идентификаторов пользователей или строчек которые будут расположены после двоеточия в этих списках будет одинаковым и одним и тем же. А это и есть самое главное. И так же ещё одно из важных условий, а именно вывод в верх самых активных пользователей или строчек, будет тоже выполнено. А как там будут расположены идентификаторы пользователей или строчек с повторяющимися числами активности, то ли один будет выше а другой ниже, а вот в PHP будет как бы наоборот. Это уже не имеет значения.
Самое главное что бы не различалось количество идентификаторов и самые активные были выведены в верх. Что и делается.

Конечно можно немного переписать или дописать функцию bubble_sort, что бы не только цифры до двоеточия выводились по порядку, а и те строчки которые после двоеточия тоже выводились по порядку. Тем более в нашем случае строчки после двоеточия являются цифрами, так как это идентификаторы пользователей. И точно так же применив к ним Convert.ToInt32(X), а после зависимость if, можно добится такого же результата как и в функции natsort из PHP.
И тогда будет примерно так, что вот если допустим после двоеточия переменная X меньше чем переменная Y, то тогда делаем сдвиг по порядку в переборе массива.

Но давайте оставим всё так как есть, потому что если брать небольшие массивы для работы, то можно всё что угодно дописать или переписать. А если допустим массивы будут довольно таки объёмные, что при сборе информации с сайта ВКонтакте очень даже не редкость, то тогда лишние телодвижения не слишком то и рекомендуются и по возможности этих лишних телодвижений надо избегать.
Вот представим себе массив в котором пять миллионов элементов, а то и больше. И допустим функция bubble_sort делает даже не одно действие над каждым элементом этого массива, используя перебор циклом for. То есть пять миллионов раз этой функции надо проделать ряд определённых действий. Конечно всё это делается с очень быстрой скоростью, но пять миллионов раз, это не один два три четыре пять.
И ещё раз можно сказать, что при сборе информации с широко известных социальных сетей, каким и есть сайт ВКонтакте, обработка массивов с огромным количеством элементов это не редкость, а очень частое явление.

Через какое-то время.
Вот здесь можно почитать за функцию bubble_sort: Сортировка пузырьком. Оказывается в Википедии её тоже назвали bubble_sort:) Как оказалось, эта функция для обработки больших массивов не подходит, в чём мы и убедились на собственном примере. Взята эта функция была с интернета и немного подправлена под нашу программу. Вот наш пример:
public string[] bubble_sort(string[] arr)
{
string temp;
for (int i = 0; i < arr.Length; i++)
{
for (int j = i + 1; j < arr.Length; j++)
{
Regex regex = new Regex(@"\s\:\s.*$");
string res1 = regex.Replace(arr[i], "");
int res1_ = Convert.ToInt32(res1);
regex = new Regex(@"\s\:\s.*$");
string res2 = regex.Replace(arr[j], "");
int res2_ = Convert.ToInt32(res2);
if (res1_ > res2_)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
file_put_contents("TEST.TXT", i.ToString() + " " + DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss"), "FILE_APPEND");
}
return arr;
}
В нашей функции в конце первого цикла создаётся файл TEST.TXT, в который записывается время прохождения одного цикла. Вы можете вставить эту функцию в свою программу и попробывать её в действии. Эта функция перебирает массив ровно столько раз, сколько элементов в этом массиве.
Так вот если подаётся массив в котором несколько тысяч элементов, затраты во времени на выполнение всех действий не большие. Но если подать массив в котором к примеру миллион элементов, то тогда эта функция будет перебирать миллионный массив, миллион раз. Конечно миллионный массив обрабатывается не пол года. Но заметьте, он будет перебираться миллион раз! И тогда по времени это будет очень долго. Что для нас естественно не подходит.
Поэтому функцию bubble_sort убираем и пишем другую, у которой затраты по времени будут не слишком огромными. В нашей программе эту другую функцию назовём actives_sort. Вы можете на неё посмотреть в коде программы написанной на Visual Studio, который будет представлен ниже. Конечно эта функция получилась скажем так на троечку, но самое главное что бы работало:)

Почему функция actives_sort затрачивает меньше времени на обработку массива? Потому что за основу в этой функции была взята мысль обработки только тех элементов массива, у которых активность больше единицы. И первым циклом здесь мы создаём новый массив arrInt в котором будут находится только цифры отображающие активность. Потом через OrderByDescending сортируем эти цифры на убывание.
Как показывает практика сбора информации с социальных сетей, аккаунтов которые проявили себя больше одного раза намного меньше, чем тех у которых активность равна единице, то есть проявивших себя один раз.
В реальности дело обстоит так, что большая половина элементов массива, с активностью равной единице. Так зачем же эти элементы обрабатывать и сортировать? В функции actives_sort мы исключаем эти элементы из перебора и просто добавляем их в конец в виде списка. Благодаря этому, время обработки массива сокращается во много раз.

Теперь давайте по программам. Вот скрин работы программы написанной на Visual Studio для этой статьи:
Скачать ВКонтакте
Строчка с названием GROUPS отображает количество групп пользователя. Или если группы пользователя закрыты в настройках приватности, тогда мы наблюдаем надпись Denied privacy settings.
PUBLICS отображает количество пабликов пользователя.
PROFILES отображает количество аккаунтов на которых пользователь подписался. Это те аккаунты, которые находятся в разделе подписки, в самом конце после пабликов.
USER ADMIN отображает количество всех пабликов и групп в которых пользователь за которого собирается информация является администратором или просто находится в разделе контакты.
ADMINS отображает количество всех пользователей (администраторов) которые находятся в разделе контакты по всем пабликам и группам, собранных с одного аккаунта, с которого мы собираем информацию.

И скрин с программы Devel Studio на PHP, он ничем не отличается от предыдущего.

Скачать ВКонтакте
. И ещё немного по файлам которые создаются в папке groups. Названия файлов похожи на строчки с поля aLOG, которым было дано описание выше.
all_admins.txt в этом файле будет находится список администраторов, читаем строчку ADMINS. Администраторы в этом списке будут представлены по активности. То есть сколько раз определённый пользователь является админом или находится в списке контакты.
filtergroups.txt в этом файле будет находится список групп пользователя за которого собирается информация. Читаем описание строчки GROUPS. Если группы пользователя закрыты в настройках приватности, тогда в файле записывается строка: Access to the groups list is denied due to the user's privacy settings.
filternull.txt в этом файле будет находится список всех пабликов и групп, то есть в одной куче. Вот с этого списка мы и получаем пользователей которые находятся в разделе контакты в этих пабликах и группах.
filternull_admins.txt в этом файле находится список пабликов и групп в которых есть администраторы или пользователи находящиеся в разделе контакты. Эти пользователи тоже будут представлены в этом списке. Как это выглядит. Сначала будет идти идентификатор паблика или группы, перед ним будет стоять знак минус. Со следующей строчки будет идти списочек пользователей которые находятся в разделе контакты данной группы или паблика. Потом опять со следующей строчки идентификатор паблика или группы со знаком минус, а после него администраторы.
filterpublics.txt в этом файле будет находится список пабликов пользователя за которого собирается информация. Читаем описание строчки PUBLICS.
profiles.txt в этом файле будет находится список аккаунтов пользователей, на которых подписался пользователь, за которого ведётся сбор информации. То есть эти пользователи из файла profiles и находятся они в разделе подписки, в самом конце после пабликов.
user_admin.txt в этом файле будет находится список пабликов и групп в которых пользователь за которого собирается информация является администратором этих пабликов или групп. Или просто находится в разделе контакты. Расположение строк в этом списке будет точно таким же как и в файле filternull_admins. То есть сначала будет идти паблик или группа со знаком минус, а со следующей строчки будет идти список пользователей которые находятся в разделе контакты данной группы или паблика. Среди этих пользователей должен находится и вот этот пользователь за которого и ведётся сбор информации.

Немного о том как скопировав идентификатор паблика или группы со списка, можно открыть его в браузере что бы посмотреть. Сначало вставляем в адресную строку браузера вот это: https://vk.com/club и дальше идентификатор группы или паблика, то есть цифры только без минуса. И тогда независимо от того группа это или паблик или ещё что-то другое, откроется страница с нужным нам контентом. Только не забываем что это не касается аккаунтов пользователей, для пользователей вместо club прописываем id и дальше цифры.

И в конце давайте коды программ. Для Visual Studio на C Sharp cod6vk_csharp.txt и для Devel Studio на PHP cod6vk_php.txt.

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

Программы
infgo.ru