Собираем информацию с новостей

В самом начале статьи, немного рассмотрим новые настройки программы. По крайней мере одна из них, является скажем так серьёзной настройкой и на ней мы остановимся поподробнее.
Запускаем программу, нажимаем кнопку SET (Настройки) и смотрим на фотографию:
Имеется ввиду чекбокс: Запись zero_response в файл errors.txt
Немного предыстории. Когда программа собирает лайки, которых на объектах не очень много, допустим до десяти штук или до двадцати, получается слишком большая скорость запросов, от десяти в секунду и выше. И при такой скорости сайт ВКонтакте, может выдать пустой ответ. Что подразумевается под пустым ответом, смотрим пример:
{"response":{"count":0,"items":[]}}
Здесь так же ещё нужно добавить, что наша программа написана так, что лайки она собирает только с тех объектов, в которых лайки есть. Так как программа скачивая информацию допустим за новости, проверяет каждую новость на присутствие лайков и если новость имеет лайки, то тогда идентификатор этой новости добавляется в список и сохраняется в определённый файл news_with_likes в папке log, что бы потом в последствии эти лайки собирать.
Так же это касается и всех остальных объектов: фотографий, видео, комментариев и так далее. То есть при написании кода, делался упор на то, что бы по возможности в пустую запросов не делалось, а запросы делались только тогда, когда действительно известно, что там есть что взять.

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

Значит проблема ясная, теперь немного о решении.
В программу добавлена глобальная переменная zero_response, которая по умолчанию равна ноль. И как только сайт ВКонтакте присылает пустой ответ, переменная zero_response становится больше на единицу. После этого возвращаемся в начало функции resHtml, делаем тот же самый запрос, с тем же самым URL. И так до тех пор, пока или не прийдёт нужный нам ответ или переменная zero_response не будет равна одинадцати.
Если нужный нам ответ не приходит, а zero_response уже равна 11 (одинадцать), то тогда программа пропускает этот URL и берёт следующий, с другими заданными параметрами. То есть цифра 11 (одинадцать), является своеобразной подушкой безопасности для этой проблемы с пустыми ответами.
И естественно всё это будет записываться в логи, а именно в файл ERRORS.TXT который будет находится в корне программы. Туда будут скидываться запросы и пустые ответы, которых будет или 11 (одинадцать) штук или меньше и тогда в конце будет ответ с сайта ВКонтакте с нужной нам информацией.
Туда дальше этот код скорей всего немного усовершенствуем, посмотрим как его можно сделать лучше. Ну а пока что цифры 11 (одинадцать) достаточно для того что бы получить нужный нам ответ. Её можно увеличить в самих исходниках и наверное в следующий раз пропишем её в настройках, что бы при надобности можно было её изменить в файле Settings. Уменьшать лучше не надо, а вот увеличить, как говорится на всякий случай.
Чекбокс: Запись zero_response в файл errors.txt просто отключает или включает ведение логов. Сам же код, который решает эту проблему никак не отключишь, он будет действовать постоянно, потому что без него программа может выдавать нам не точную информацию.

Практически всё это касается программы написанной на Visual Studio на языке C Sharp, потому что у неё частота запросов слишком большая. В программе же которая написана на Devel Studio на языке PHP эта проблема практически отсутствует. По крайне мере не было замечено, хотя может быть и пропустили. Но опять же как говорится на всякий случай, в ней тоже прописан точно такой же механизм решения этой проблемы.

Теперь рассмотрим настройку: Активность пользователей. Здесь ничего сложного нету, если этот чекбокс будет отмечен, то тогда все пользователи будут распределены по активности нашей небольшой программой phpvs, которая находится в папке build в корне программы. Если же этот чекбокс выключен, то тогда списки пользователей перед сохранением в файлы будут просто уникализированны.
Уникализацию пользователей делает тоже программа phpvs.
В статье Информация за фотографии ВКонтакте уже говорилось о том, что мы можем использовать практически полный функционал языка PHP в языке C Sharp. Вот как раз для чекбокса: Активность пользователей, в программу phpvs была дописана ещё одна зависимость, которая при запуске программы phpvs, проверяет наличие файла unique.txt и если такой файл существует, то тогда программа берёт из него не уникальный список пользователей, уникализирует его с помощью вот такой связки PHP функций:
$funique = array_values(array_filter(array_unique($funique)));
И сохраняет результат в файл result.txt, который в свою очередь подхватывает наша функция actives_php и использует содержимое этого файла в любом месте кода программы, написанной на языке C Sharp.

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

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

Первое. Как и говорилось выше, в файл Settings, который находится в папке temp, добавлена строчка:
zero_response=21
Цифра 21 (двадцать один) это та цифра 11 (одинадцать) о которой тоже говорилось выше, просто немного увеличенная.
Так же что ещё хотелось бы добавить. Если прийдёт пустой ответ, то в коде сработает прописанная команда Sleep, которая выставлена на одну секунду. После добавления этой команды, практически стало достаточно одного раза сделать один перезапрос с тем же самым URL, для того что бы получить нужный нам ответ. До добавления команды Sleep, в основном надо было сделать от двух, трёх, четырёх, а иногда даже и выше запросов с тем же самым URL, что бы всё таки получить нужный нам ответ. Так что цифры 21 (двадцать один) вполне достаточно для решения этой проблемы.

Второе. Следующее изменение, это записывание логов в файл ERRORS.TXT, теперь программа не будет записывать все перезапросы с одним и тем же URL, а будет производится запись только последнего результата, независимо от того каким он будет, пустым или с нужной нам информацией. Так же в логи будет добавлена запись, в которой будет указано значение переменной zero_response, которая с каждым перезапросом становится больше на единицу и по этому значению, можно будет определять сколько было сделано повторных запросов.
И на следующий раз сделаем так, что если мы всё таки не получаем нужную нам информацию и в конечном результате остаётся пустой ответ, то запись в файл ERRORS.TXT будет происходить даже тогда, когда чекбокс: Запись zero_response в файл errors.txt выключен.

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

Теперь переходим к теме самой статьи.
В программу добавлена возможность скачивания новостей и так же возможность сбора с новостей всей возможной информации. А так как Павел Дуров скрыл комментарии в своём аккаунте, у нас не получится как обычно предоставить для примера сбор всей информации с его аккаунта. Поэтому мы взяли другой аккаунт, выбрали любой из каталога в котором есть новости, комментарии к ним и так же лайки на новостях и комментариях. Смотрим пример:
В поле aLOG отображается количество новостей (NEWS), которые скачиваются и сохраняются в папку wjsoncontents, в файл news.txt
USERS NEWS - показывает количество пользователей, которые добавили новости в аккаунт. Списки сохраняются в файл uspost.txt
REPOST NEWS - количество пользователей у которых были сделаны репосты новостей. Списки сохраняются в файл repost.txt
COMMENTS - количество комментариев к новостям. Комментарии сохраняются в папку wjsoncontents, в файл news_comments.txt
USERS COMMENTS - количество пользователей которые добавили комментарии к новостям. Списки сохраняются в файл uscomments.txt
LIKES NEWS - количество пользователей которые лайкнули новости. Списки сохраняются в файл uslikes.txt
LIKES COMMENTS - количество пользователей которые лайкнули уже сами комментарии к новостям. Списки сохраняются в файл uslikes.txt

Так же может быть ещё один пункт, это COPY NEWS. Он показывает количество пользователей у которых новости были скопированы. И списки этих пользователей сохраняются в файл copy.txt

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

Теперь можно посмотреть на аккаунт Павла Дурова, как у него прошёл сбор информации.
С фотографии видно что комментарии в аккаунте Павла Дурова полностью обнулились, а вот информация по лайкам с новостей собрана, так как новости Павел Дуров пока что ещё не скрыл.

В файле Settings который отвечает за сохранённые настройки программы, прописаны ещё две новых строчки, которые по умолчанию будут выглядеть вот так:
API=5.102
API_news_comm=5.54
Эти настройки указывают версии API сайта ВКонтакте с которыми работает программа. Первая строка указывает основную версию API, а вторая строка указывает версию API, с которой программа собирает комментарии с новостей. Не будем сильно вдаваться в подробности, просто есть два способа собирать комментарии с новостей с сайта ВКонтакте. Первый способ, это тогда когда комментарии собираются все подряд, по порядку. И второй способ, это тогда когда комментарии собираются ветками. Если кто-то кому-то ответил в комментариях, то это пошла ветка. Сейчас в программе реализован первый способ сбора комментариев, который работает с версией API 5.54 и ниже. В будущем наверное напишем в программе код который будет собирать комментарии вторым способом, а пока что работает только первый. Кстати если сбор комментариев происходит первым способом, то там тоже указывается на какой комментарий был ответ, если он был. То есть вся необходимая информация есть и в первом способе. Ну а пока второй способ не написан, лучше эти настройки не менять.

Дальше рассмотрим в программе настройки по сбору данных.
Здесь думаю всё ясно и не надо описывать каждый чекбокс, единственное на что хотелось бы обратить внимание, так это на текстовое поле с названием: Максимальная величина файлов в мегабайтах. Пока что эта настройка касается только двух файлов. Это файл news.txt, в который сохраняются новости с сайта ВКонтакте и файл news_comments.txt, в который сохраняются комментарии с новостей.
Когда в аккаунте по которому собирается информация, новостей слишком много то файл news.txt может достигать очень больших размеров, поэтому сделано это ограничение. Если при скачивании новостей файл достигнет указанной величины, то тогда программа будет скачивать новости в следующий файл с названием news1.txt. Если и этот файл достигнет указанной величины, то следующий файл будет уже с названием news2.txt и так далее.

На этом всё. В следующей статье в программу будет добавлена возможность сбора информации за видео, которое добавил пользователь в свой аккаунт.

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