1

Тема: VBS: Изменение условия скачивания

Привет. Для скачивания файлов иногда использую скрипт-CMD, запускающий wget и работающий в связке с scriptsplit.vbs. Программа скачивает список ссылок из файла lst.txt — в новый файл со случайным именем, по достижении квоты в 399мб — создавая и наполняя новый файл.

Файл "start.cmd"


"G:\_wget\wget.exe" --user-agent="Mozilla/5.0 (Windows NT 5.1; rv:26.0) Gecko/20100101 Firefox/26.0 SeaMonkey/2.23" --header="Accept-Language: ru-RU,ru;q=0.9,en;q=0.8" --wait=1 --rejected-log=_ERROR.LOG -i lst.txt -O- | cscript scriptsplit.vbs 

Файл "scriptsplit.vbs"


SplitSize = 399 * 1024 * 1024  
 Set FSO = CreateObject("Scripting.FileSystemObject")  
 Set stdin = fso.GetStandardStream(0)  
 Count = 0  
 Set CurrFile = FSO.CreateTextFile("lst" & CStr(Year(Date())) & "-" & Right("0" & CStr(Month(Date())), 2) & "-" & Right("0" & CStr(Day(Date())), 2) & "_" & Replace(Time,":","-") & Count & ".htm",1)  
 Do Until stdin.AtEndOfStream  
   CurrFile.Write stdin.Read(1024)  
   Size = Size + 1024  
   If (Size => SplitSize) Then   
     Count = Count + 1  
     CurrFile.Close  
     Set CurrFile = FSO.CreateTextFile("lst" & CStr(Year(Date())) & "-" & Right("0" & CStr(Month(Date())), 2) & "-" & Right("0" & CStr(Day(Date())), 2) & "_" & Replace(Time,":","-") & Count & ".htm",1)  
     Size = 0 : Data = ""  
   End If  
 Loop  
 CurrFile.Close 

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

2

Re: VBS: Изменение условия скачивания

DD, доброго дня. Скажите, пожалуйста, а почему выбран такой хитрый способ скачивания ? Вроде альтернатив для wsh довольно много ? И задача пока не совсем понятна. Можно посмотреть на каком ресурсе это делается, чтоб была возможность потестировать ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3

Re: VBS: Изменение условия скачивания

Здравствуйте, Xameleon. Если под ресурсом имеется в виду набор для запуска скрипта — то нужен WGET и три файла рядом: "start.cmd", "scriptsplit.vbs" и "lst.txt" со списком ссылок. Сливание в один файл использую, потому что для некоторых задач это более удобно: к примеру, скачать 100 тысяч файлов с мусором на страницах, а потом извлечь из них с PowerGrep только нужные фрагменты, формируя файлы на лету и т.п. Также при скачивании с VK API это широко использую.

Есть ещё такой вариант скрипта с подсчётом ссылок, но он почему-то кроме создания первого файла — ничего не скачивает:


Const ReferencesCount = 10 ' ссылок на файл '
Dim Buffer ' буфер приёма и парсинга ссылок '
Dim NextRef ' буфер под выделение ссылки '
Dim RefCount ' количество ссылок, записанных в файл '
Dim FSO,stdin,Count,CurrFile ' переменные из исходного кода '

Set FSO = CreateObject("Scripting.FileSystemObject") 
Set stdin = FSO.GetStandardStream(0) 
Count = 0 
Set CurrFile = FSO.CreateTextFile("lst" & CStr(Year(Date())) & "-" & Right("0" & CStr(Month(Date())), 2) & "-" & Right("0" & CStr(Day(Date())), 2) & "_" & Replace(Time,":","-") & Count & ".htm",1) 
Do Until stdin.AtEndOfStream 
    Buffer = Buffer & stdin.Read(1024)
    NextRef = ExtractRef(Buffer)
    Do Until NextRef = ""
        CurrFile.Write NextRef & vbNewLine ' по одной ссылке на строку '
        RefCount = RefCount + 1
        If RefCount>= ReferencesCount Then
            CurrFile.Close
            Count = Count + 1
            Set CurrFile = FSO.CreateTextFile("lst" & CStr(Year(Date())) & "-" & Right("0" & CStr(Month(Date())), 2) & "-" & Right("0" & CStr(Day(Date())), 2) & "_" & Replace(Time,":","-") & Count & ".htm",1) 
            RefCount = 0
        End If
        NextRef = ExtractRef(Buffer)
    Loop
Loop 
CurrFile.Close

Function ExtractRef(ByRef Buffer)
Dim Border ' Граница первой ссылки в буфере '

Buffer = Trim(Buffer)
Border = Instr(Buffer, " ") ' если разделитель ссылок - пробел '
If Border = 0 Then 
    ExtractRef = ""
Else
    ExtractRef = Trim(Left(Buffer, Border))
    Buffer = Mid(Buffer, Border)
End If
End Function

4

Re: VBS: Изменение условия скачивания

DD, так в большинстве случаев нет нужды скачивать весь мусор, если можно сразу разбирать DOM дерево и решать, что качать дальше. (т.е может быть и файлы то делать не придётся) Давно делал ресурс скачки музыки с VK API без wget, используя только объекты WinHttpRequest и htmlfile. Возможно и Вам больше подойдёт такой вариант. Можете пояснить конечную цель скрипта - что именно нужно качать ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5 (изменено: DD, 2018-04-06 14:52:18)

Re: VBS: Изменение условия скачивания

Xameleon, обычно качать нужно для последующего извлечения каких-то данных:
— это могут быть айди постов, которые беру по вызовам из процедуры execute (несколько пакетов идут в один файл);
— либо если это данные, которые не нужны в разрозненном виде;
— или когда у файлов длинные случайные имена (было такое) и проще всё слить вместе, а потом извлекать нужное;
— или когда скачать нужно, составив ссылки в определенной последовательности, — например, когда сначала скачивается пост, потом список его лайкеров и комменты (есть пара групп, которые мне нужны в таком виде), чтобы затем из кучи отправлять это по отдельным файлам. При этом, при скачивании самих постов, API не использую из-за ограничений по вызовам — вместо API такие ссылки:

Пост: https://vk.com/wkview.php?act=show& … set=999999
Лайки 1: https://vk.com/wkview.php?act=show& … fset=false
Лайки 2: https://vk.com/wkview.php?act=show& … ;offset=60
Коммы 1: https://vk.com/al_wall.php?act=get_repl … p;offset=0
Коммы 2: https://vk.com/al_wall.php?act=get_repl … offset=100

— или же просто надо получить ссылки со ста+ страниц, скачав их в одно место, чтобы затем извлечь из них ссылки или что другое...

В этом смысле, как будет действовать метод DOM дерева? Ведь вроде, чтобы получить нечто со страниц — их всё равно надо предварительно скачать?

6

Re: VBS: Изменение условия скачивания

DD,
1) Понял. К сожалению, таким способом не пробовал, поэтому сразу ответить и чем-то помочь затрудняюсь. Надо подумать.
2)

В этом смысле, как будет действовать метод DOM дерева? Ведь вроде, чтобы получить нечто со страниц — их всё равно надо предварительно скачать?

Да, Вы конечно же правы - скачивать в любом случае придётся. Я имел в виду, что нет нужды сохранять всё это на диск, а можно работать с загруженными данными сразу в памяти и возможно в некоторых случаях ветвления кода можно принять решение о необходимости загрузки только части ресурсов.

API не использую из-за ограничений по вызовам

Т.е работаете с обычными страницами vk ? А какую тогда роль играет api ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

7

Re: VBS: Изменение условия скачивания

Xameleon пишет:

Т.е работаете с обычными страницами vk ? А какую тогда роль играет api ?

API — для получения инфы о постах, количестве лайков и т.п., а эти страницы не совсем обычные, так как в них минимум лишнего кода, в отличие от стандартных — с тегами BODY и т.п.

Xameleon пишет:

можно работать с загруженными данными сразу в памяти.

Интересно, спасибо. Взглянул бы на ресурс)).

8

Re: VBS: Изменение условия скачивания

Xameleon, а можно было бы DOM использовать в таком формате: качать пост (как по ссылке выше), лайкеров — а потом комменты по отдельности и последовательно лайки к ним? Чтобы шли по очереди: коммент — список лайкеров, коммент — список лайкеров?

9

Re: VBS: Изменение условия скачивания

DD,

а можно было бы DOM использовать в таком формате: качать пост (как по ссылке выше), лайкеров — а потом комменты по отдельности и последовательно лайки к ним? Чтобы шли по очереди: коммент — список лайкеров, коммент — список лайкеров?

Думаю да. Надо попробовать. Давно с этим ковырялся. Попробую найти свой код.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !
+ DD

10

Re: VBS: Изменение условия скачивания

DD, доброго дня. К сожалению, пока порадовать не смогу. Код нашёл, попробовал запустить, не отрабатывает. Я так понял, что с тех пор сменилась авторизация в API и добивалась двухфакторная авторизация. Так что, как руки дойдут, попробую довести до ума.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: VBS: Изменение условия скачивания

Xameleon, здравствуйте.
Ясно, спасибо. Случаем, о коде не из этой ли темы речь? — http://forum.script-coding.com/viewtopi … 032#p81032.

12

Re: VBS: Изменение условия скачивания

DD, не не. Это для авторизации на обычный сайт. А я отдельно собирал код на js для vk.api. Допилил обработку редиректов, которые происходят при подтверждении всяческих разрешений для приложения. Приходилось автоматизировать отправку данных форм, который VK высовывал в GUI. Но теперь стало ещё сложнее. Так как требуется вводить код из смс.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !
+ DD

13 (изменено: DD, 2018-04-10 03:09:16)

Re: VBS: Изменение условия скачивания

Xameleon

Кстати, а возможно то же самое для приводившихся мной ссылок, которые не требуют регистрации и не имеют ограничений по вызовам? Когда берется ссылка с комментариями вида —

https://vk.com/al_wall.php?act=get_replies&al=1&post=-20629724_1061727&offset=0

и к каждому комментарию формируется ссылка с лайками вида —

https://vk.com/wkview.php?act=show&al=1&w=likes/wall_reply-20629724_1061730&offset=0

Соответственно, это комментарий https://vk.com/wall-20629724_1061727?reply=1061730 и список его лайкеров.

Применим ли код по такому сценарию?

14

Re: VBS: Изменение условия скачивания

DD, а почему вы не хотите логиниться в vk и скачивать оттуда нужные страницы через GET/POST запросы?
А потом парсить их через регулярные выражения либо htmlfile?

15 (изменено: DD, 2018-04-10 18:05:07)

Re: VBS: Изменение условия скачивания

Malcev, можно пример таких ссылок? Так как пользуюсь общедоступными страницами, регистрация не особо нужна.

16 (изменено: Malcev, 2018-04-10 18:06:20)

Re: VBS: Изменение условия скачивания

Каких ссылок?
Алгоритм по которому действую я, написал тут:
http://forum.script-coding.com/viewtopi … 30#p124530
В vk на автохотки авторизироваться можно так:

email := "email"
password := "password"

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", "https://vk.com/", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
RegexMatch(HTTP.ResponseText, "s)name=""ip_h"" value=""(.+?)"".+?name=""lg_h"" value=""(.+?)""", match)
PostData := "act=login&role=al_frame&expire=&recaptcha=&captcha_sid=&captcha_key=&_origin=https`%3A`%2F`%2Fvk.com&ip_h=" match1 "&lg_h=" match2 "&email=" email "&pass=" password

HTTP.Open("POST", "https://login.vk.com/?act=login", true)
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send(PostData)
HTTP.WaitForResponse()
msgbox % clipboard := HTTP.ResponseText
+ DD

17 (изменено: DD, 2018-04-10 18:36:36)

Re: VBS: Изменение условия скачивания

Malcev, а как скачивать и докачивать (лайкеров к комментариям), — если ссылки на скачивание уже известны (посты, их лайкеры и комменты)?

18 (изменено: Malcev, 2018-04-10 19:06:18)

Re: VBS: Изменение условия скачивания

Смотрите, что отправляется в запросах и повторяете тоже самое в своем скрипте.
Чтобы получить данные по этой ссылке
https://vk.com/topic-47923094_28662818?offset=0&w=likes%2Ftopic_comment-47923094_195
нужно отправить POST запрос на
https://vk.com/wkview.php
с данными
act=show&al=1&is_znav=1&loc=topic-47923094_28662818&w=likes%2Ftopic_comment-47923094_195
Потом проходитесь регуляркой и получаете список лайкеров.

19 (изменено: DD, 2018-04-10 22:50:18)

Re: VBS: Изменение условия скачивания

Malcev
Начал было писать это дело, но потом застрял на необходимости подпрограмм, формирующих цифровые шаги для под-страниц к комментариям, а также к лайкам к постам/комментариям, и тут же со скачиванием их... То есть, трудность не в парсинге отдельной страницы или в определении ссылок (так как эти запросы я изначально использовал и их можно формировать, исходя из ссылки к посту/комментарию), а в отсутствии шаблона загрузки — с подзагрузкой (как выразился Xameleon: "ветвлений кода"), с учётом под-страниц. Когда, например, из файла берется ссылка на пост — по ней выясняется количество коментов и лайков, пост сохраняется в HTML-файл — с чем проблем нет. Но непонятно, как на месте разворачивать ссылки с шагами подстраниц на ЛайкиКПосту и к комментариям, а потом ещё и к лайкам к комментариям, которые тоже могут быть с пагинацией. Вообщем, тяжко без шаблончика, аль чертежа)).

20 (изменено: Malcev, 2018-04-11 01:21:47)

Re: VBS: Изменение условия скачивания

Не понимаю про какие подпрограммы вы пишите.
Я пристально этой темой не занимался, но в принципе все данные о "шагах" и их количестве должны выдаваться в ответе пост-запроса.
Например разберем эту ссылку:
https://vk.com/team?w=wall-22822305_377885
При отправлении постзапроса на https://vk.com/al_wall.php с данными act=get_replies&al=1&count=20&from=wkview&offset=0&post=-22822305_377885&rev=0
Выдаётся ответ в котором написано:
!json>{"num":20,"count":260,"offset":"0"}
Из чего можно сделать вывод о количестве текущих сообщений, об общем количестве сообщений и текущем отступе.
Кстати максимум текущих сообщений можно получить 100, то есть отправлять в пост-запросе:
act=get_replies&al=1&count=100&from=wkview&offset=0&post=-22822305_377885&rev=0
Когда получили все сообщения - проходите их регуляркой для определения количества лайков каждого сообщения.
И если лайки у сообщения есть, то определяете его ссылку и отправляете ее в пост-запросе.
После чего вы получаете информацию о лайкнувших.
И дальше используете такую же схему.