Информация за фотографии ВКонтакте

В этой статье сразу выложим коды программ, что бы было легче их потом разбирать. С Visual Studio на C Sharp cod8vk_csharp.txt и с Devel Studio на PHP cod8vk_php.txt. И в Devel Studio на компоненты, там идёт добавление на timerPause cod_vk_php_Components.txt.

В Visual Studio в коде немного подправлены функции array_chunk и actives_sort.
Про array_chunk, в этой функции в самом начале добавлена всего лишь одна строчка:

if (arr.Length < chunk) { chunk = arr.Length; }
Без этой строчки, если нашей функции array_chunk подать массив в котором элементов меньше чем число на которое этот массив надо делить, то тогда фунция в результате выдаст массив, в котором единственный массив второго уровня будет заполнен элементами в которых первыми будут идти элементы подаваемого массива, а те элементы которых не будет хватать, будут пустыми. И это конечно получилось не правильно.
Что делает вот эта дописанная строка? Она в самом начале функции указывает, что если количество элементов массива меньше чем число на которое надо делить, то тогда переназначаем это число на которое надо делить и приравниваем его к количеству элементов массива. Когда эта функция писалась, такая вероятность развития событий просто была упущена.
И про функцию actives_sort, в ней тоже немного похожая ситуация. То есть сама функция и до исправлений работала правильно, но при определённых обстоятельствах, а именно: если в подаваемом массиве не было ни одного элемента активность которого больше единицы, то тогда массив arr_ не заполнялся вообще, так как он заполняется только элементами активность которых больше одного раза.
И в результате, в том списке который выдавался функцией, первая строка была пустой. Так как пользователи активность которых была больше одного раза, отсутствовали.
Теперь же это подправлено и должно быть всё правильно.

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

Ну и конечно же уже дежурная фраза через какое-то время:)
Как оказалось наша функция actives_sort тоже совсем не оправдала наших ожиданий. В ситуации когда была сортировка по активности пользователей прокоментировавших фотографии Павла Дурова, наша функция actives_sort слишком долго переваривала не уникальный список пользователей состоящий из 885359 строк. А строки были идентификаторами этих пользователей.
Под словосочетанием слишком долго, имеется ввиду ну очень долго, даже до конца не дождался и снёс программу через диспетчер задач.
Потом этот список из 885359 неуникальных строк, был отсортирован по активности через программу написанную на Devel Studio функцией actives, которая написана на PHP. И примерно где-то через шесть секунд, был получен уже отсортированный список состоящий из 222525 уникальных строк, которые по активности уже были расположены по убыванию.
По цифрам это значит, что каждый пользователь который прокоментировал фотографии Павла Дурова, написал примерно в среднем по четыре комментария.
А с функцией actives на C Sharp, где-то сорок минут было ожидания и то, это не до конца. А на PHP 5-6 секунд.
Это конечно не значит что на C Sharp нету возможности написать функцию actives, которая по своим параметрам подходила бы под функцию actives написанную на PHP. Но на сегодняшний день такой возможности на C Sharp пока что я не знаю. Со временем конечно что-то придумается, ну а пока что, вот что есть то есть.

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

Начнём с того, что пишем очередную:) функцию actives в Visual Studio на C Sharp. В этот раз назовём её actives_php, наверное ясно почему такое название. Вот как она будет выглядеть:
public string actives_php(string[] arr)
{
 Process[] ps = System.Diagnostics.Process.GetProcessesByName("php");
 foreach (Process p in ps) { p.Kill(); }
 file_put_contents(@"build\actives.txt", String.Join("\r\n", arr));
 ProcessStartInfo infStartProcess = new ProcessStartInfo();
 infStartProcess.WorkingDirectory = @"build\";
 infStartProcess.FileName = "php.exe";
 Process.Start(infStartProcess);
 result:
 if (File.Exists(@"build\actives.txt")) { System.Threading.Thread.Sleep(200); goto result; }
 string res = file_get_contents(@"build\result.txt");
 File.Delete(@"build\result.txt");
 ps = System.Diagnostics.Process.GetProcessesByName("php");
 foreach (Process p in ps) { p.Kill(); }
 return res;
}
Из представленного примера мы видим, что небольшая программка будет находится в корне по адресу build/php.exe. Подаём ей файл build/actives.txt с неуникальным списком, запускаем её, ждём когда появится файл build/result.txt, берём из него данные, удаляем файл build/result.txt и используем данные в любом месте кода, где будет использована функция actives_php. Конечно же всё это в автоматическом режиме.
Вот как бы и всё, ничего сложного. Осталось только написать программу php.exe. Файл с подаваемыми данными build/actives.txt будет удалять программа php.exe, после того как она уже сохранит файл с результатом работы build/result.txt. Кстати удаление файла build/actives.txt, для программы Visual Studio на C Sharp будет служить знаком, что файл build/result.txt уже присутствует.

Теперь давайте про написание вот этой вот небольшой программки, которую мы в дальнейшем будем называть php.exe. Создаём проект на Devel Studio под названием php. Это будет выглядеть точно так же как мы создавали проект test в предыдущих статьях, только сейчас мы назовём его не test, а php.
В новом проекте php, в свойствах формы делаем форму небольшого размера, примерно: ширина 368 и высота 344. Заголовок пишем php.
Дальше, в самом низу свойств формы стоят настройки, кликаем по кнопке с тремя точками и у нас открываются Настройки окна. Настраиваем их вот таким образом:

Настройка Стиль Формы: fsMDIChild, позволит запускать программу в фоновом режиме. А это значит, что на рабочем столе, программа php.exe нам не будет мешать ни коим образом. Нажимаем OK и с настройками свойств формы мы закончили.
В Form1 переходим во вкладку События и добавляем событие: Создание, кликаем по нему два раза, открываем его и в открывшемся окне вставляем вот этот код: cod_vk_php_exe.txt. Здесь всё просто, первой строчкой прописываем титлы php. Дальше в коде идёт функция actives, которая взята с проекта test, просто скопирована оттуда и вставлена сюда.
Сохраняем этот код в окне Создание и добавляем на форму компонент timer1. В свойствах таймера:
Установлен - Да
Интервал - 1000 мс
Повторять - Да
Название оставляем тем же.
Переходим во вкладку события и добавляем событие Таймер, открываем его и вставляем туда вот этот код:cod_vk_php_exe_timer.txt. Здесь тоже всё просто. Как только появится файл actives.txt, а он будет подброшен программой с Visual Studio на C Sharp функцией actives_php ещё до запуска программы php.exe. Это значит, что как только программа php.exe запустится, сразу же в таймере через одну секунду, срабатывает зависимось if: если присутствует файл actives.txt, то тогда берём из него данные, пропускаем их через функцию actives и полученный результат сохраняем в файл result.txt.
После этого программа php.exe удаляет файл actives.txt, что послужит знаком для программы с Visual Studio на C Sharp, а именно функции actives_php, что файл result.txt уже присутствует и содержание этого файла можно будет использовать в любом месте кода программы, куда будет вставлена функция actives_php.

Теперь компилируем программу php.exe на Devel Studio. Нажимаем клавишу F5 или во вкладке Проект, выбираем Собрать программу и в открывшемся окне Сборка программы обязательно! снимаем галочку с чекбокса Компилировать с BCompilerom. То есть этот чекбокс не должен быть отмечен. Нажимаем кнопку собрать и после сборки в корне появится папка build. Она будет содержать два файла: php.exe и php5ts.dll. Вот это и есть наша небольшая программка. Перетягиваем папку build вместе с её содержимым в корень программы Visual Studio на C Sharp. Всё.

Вот такое себе взаимодействие между двумя совершенно разными программами:) И ещё можно повторить, что самое интересное здесь это то, что результат работы совершенно другой программы выдаётся именно функцией actives_php в любом месте кода. То есть функция actives_php, работает как полноценная функция.
И допустим мы можем подкинуть программе php.exe файл с любым другим названием и в таймере прописать вторую зависимость if, что допустим если есть файл с каким-то другим названием, то тогда делаем какой-то сценарий, который будет прописан в этой второй зависимости if и в файл result.txt сохранится результат работы какого-то действия которое мы пропишем.
Это значит что таким образом мы сможем использовать полный функционал языка PHP в программе с Visual Studio на языке C Sharp.

Но опять же повторимся, что всё это топорная работа и повода для радости здесь не так уж и много, так как функция actives с программы на Visual Studio должна быть написана именно на языке C Sharp и только так будет правильно.
Хотя конечно было интересно написать такой код между двумя программами и сделать это так, что бы не сомневаться в правильности выданного результата.

На этом оставим обсуждение функции actives и продолжим по теме этой статьи, а именно по сбору всей информации с фотографий аккаунта сайта ВКонтакте.
Для этого в коде написана функция photos. Эта функция скачивает информацию с сайта ВКонтакте в json формате и сохраняет всё это в файл photos.txt в папке wjsoncontents. В файле photos.txt содержатся прямые ссылки на фотографии и так же отсюда берём информацию о том сколько каждое фото лайкнули.
Если в аккаунте есть комментарии в фото, то тогда комментарии сохраняются в файл photos_comments.txt, тоже в папке wjsoncontents. И уже при скачивании комментариев, мы собираем информацию за лайки, то есть сколько лайкнули каждый комментарий.
Если в аккаунте есть доступ к сохранённым фотографиям и в альбоме с названием сохранёнки есть фото, то есть он не пустой, то тогда они тоже скачиваются в json формате и сохраняются в файл photos_saved.txt, тоже в папке wjsoncontents. Точно так же собираем информацию сколько каждое сохранённое фото лайкнули и по комментариям в сохранёнках точно так же, если они есть то тогда они сохраняются в файл wjsoncontents/photos_saved_comments.txt

Вот подробный список файлов, которые сохраняются функцией photos в папке wjsoncontents, которая находится во временной папке аккаунта по которому собирается информация:

photos.txt
photos_comments.txt
photos_saved.txt
photos_saved_comments.txt
Теперь файловая структура папки photos, которая тоже находится во временной папке аккаунта по которому собирается информация:
comments/uscomments.txt
saved/comments/uscomments.txt
Как видно из этого списка по окончании работы функции photos, можно уже получить какой-то конечный результат в каком-то отдельном скажем так секторе. А именно в файле uscomments.txt сохранятся списки юзеров или пользователей, которые прокомментировали фотографии. Эти списки естественно обработаны функцией actives и самыми первыми в этих списках будут идти пользователи которые больше всего прокомментировали фотографии.

И для примера можно посмотреть на список пользователей прокоментировавших фотографии Павла Дурова на момент 2019 года 8 декабря. Конечно это не весь список, так как он слишком длинный, а только первые десять пользователей, которые являются самыми активными в написании комментариев в фотографиях Павла Дурова.

17520 : 182180474
11881 : 263390571
11594 : 9920218
9775 : 188824843
7499 : 383243596
6339 : 315044464
6266 : 386532954
6150 : 407607827
5995 : 208070456
5688 : 38343913
Это первые десять строчек из файла comments/uscomments.txt. И на самом первом месте у нас идёт пользователь с идентификатором 182180474, который написал 17520 комментариев в фотографиях Павла Дурова.

И так же для интереса можно вывести список из первых десяти групп или пабликов, которые самые активные в комментировании фотографий Павла Дурова:

392 : -112811416
291 : -43528411
270 : -149860455
51 : -160381596
44 : -138916957
39 : -159784406
32 : -107936813
28 : -149799875
23 : -102411176
22 : -111366842
Смотрим на скрин программы с Visual Studio на C Sharp, а именно в поле aLOG на отработку функции photos:
скачать с сайта ВКонтакте
В поле aLOG функция photos нам показывает, что у Павла Дурова 254 фотографии, 885735 комментариев в фотографиях, 222733 пользователя которые написали эти комментарии в фотографиях и последняя строчка говорит о том, что сохранёнки закрыты.
И так же цифра 222733 показывает нам что в файле comments/uscomments.txt 222733 строчки.

Ещё надо сказать, что функция photos может сохранять файлы по пути temp/log в корне самой программы. Это та папка log, которая находится в том месте где сохранены списки проксей для программы, списки токенов, настройки для программы и так далее. Вот полный список этих файлов:

photos_getAllikes.txt
photos_getAllCommentsLikes.txt
photos_savedLikes.txt
photos_savedCommentsLikes.txt
- photos_getAllikes здесь будет список идентификаторов фото в которых есть хоть один лайк.
- photos_getAllCommentsLikes здесь будет список идентификаторов комментариев с фото, которые хоть один раз лайкнули.
- photos_savedLikes здесь будет список идентификаторов сохранённых фото в которых есть хоть один лайк.
- photos_savedCommentsLikes здесь будет список идентификаторов комментариев с сохранённых фото, которые хоть один раз лайкнули.
Эти четыре файла можно назвать рабочими файлами, содержание которых будет использоваться программой для дальнейшего сбора информации, а именно лайков. В дальнейшем когда эти файлы уже будут не нужны, программа их удалит.
infgo.ru