VBScript: Работа с сайтом VK.com [Часть 03. Разбор содержимого файла].
Не советую сразу, как настоящие герои, бросаться открывать файл и что-то искать в нём. Это не полезно и imho даже вредно. :-)
Фильм "Айболит 66" нас учит: "Нормальные герои всегда идут в обход!"
В качестве инструмента возьмем браузер Google Chrome, а точнее откроем нашу ссылку в этом браузере, нажмём клавишу F12 ("Инструменты разработчика").
Не важно, когда мы открыли этот "Инструменты разработчика", до просмотра или во время просмотра видео, нам надо открыть вкладку "NetWork", запустить фильм на просмотр, можно перейти на просмотр скажем с 55-ой минуты. Начнет заполняться окно строками по отрывающимся с сайта файлами. Легко увидеть файлики с именами наподобие "00157******.ts", колонка "Type"="xhr". Мышкой становимся на такой файл и открываются его свойства.
Нам интересна вкладка свойств "Headers". Самый первый абзац "General" содержит строку "Request URL". Допустим это что-то типа такого: "https://pvv4.vkuservideo.net/c545712/video/hls_raw/14/eb9ODk_Mzs-NjI2/videos/701efdd507/000000000436935/001572967940304_000000000000000_source_d0_NZXWIZLTMM_r6436909567741049221.ts ".
Ого, сколько "мусора" в, а что с этим делать дальше? Я это дело копирую и сохраняю в файл. Но на самом-то деле не надо это всё сохранять, не пригодится, а достаточно только адрес сайта сохранить и протокол. То есть запишем для работы, дальше надо будет только это - "https://pvv4.vkuservideo.net " (а вот на самом деле будет достаточно и лучше ещё с кусочком/кусочком -> "https://pvv4.vkuservideo.net/c545712/video/hls_raw/ "). Но это я уже начал спойлеры публиковать из следующей публикации, интерес к чтению занижать. :-)
Дело в том, что эта строка содержит адрес, откуда на самом деле идёт вещание. Всё что осталось, то надо в коде страницы найти "правильный" адрес (адрес плейлиста) и вставить его плеер. (Вероятно даже надо будет скачать и переделать плейлист)
Не согласен с названием "проигрыватель" видео, поэтому пишу "плеер", а вот в данном случае мы хотим и сделаем "выигрыватель" видео. :-)
Но если Вы попробуете поискать такую строку в сохранённом ранее коде страницы, то будете немного удивлены отрицательным результатом поиска.
Кстати, я что-то говорил про utf8 кодировку, а тут вдруг оказалось, что наш файл в кодировке 1251. Ну простите, я ведь ещё не раз ошибусь, а потом всё-таки постараюсь исправиться.
Так что же делать дальше? Давайте опять пойдём в обход, начнём разбор и поиск другой, возможно даже не нужной информации. Что можно "вытянуть" из файла? Название, картинки-превьюшки, а может ещё что-то.
Допустим, можно взять название фильма и использовать уже его для создания каталога (папки), куда можно что-то скачать и сохранить. Ну, например, захотим мы скачать этот фильм, а кто сказал, что это не получится? Просто это будет огромное количество файлов *.ts, с которыми сразу и не понятно что можно сделать будет.
Для понимания что можно взять из файла и использовать далее недостаточно одного файла, надо получить и изучить несколько разных источников.
Поэтому надо всё-таки заняться накопительством, а поэтому предлагаю переделать скрипт. Именно сейчас мы будем делать сохранение страниц с уникальным именем.
Замечаем, что любая ссылка на видео может быть как бы "короткая" и "длинная". Отличие в том, что у "длинной" добавлен знак вопроса и что-то дальше написано. Получается, что надо выделить строку из переменной url.
Первая манипуляция:
- url = Split(url,"?")(0) 'Если есть в адресе, то удаляем знак вопроса и все символы далее
Вторая манипуляция:
- u = Split(u,"/")(3) 'В нашем случае из адреса останется только "video-146954363_456239568"
Ура, вот на самом деле лучшее название каталога для хранения. Забываем, если получится, нашу идею сохранять в каталог по названию видео.
Можно при желании эти две строки слить/объединить в одну:
u = Split( Split(url,"?")(0) ,"/")(3) 'получаем имя видео
Не забываем переделать строку сохранения в файл, например можно так:
.savetofile u&".htm", 2
Но вот же странно, а почему бы не сделать сразу возможность ввода строки, не держать.менять в коде скрипта? Давайте ещё немного поработаем и добавим строку после "url=..."
- url = InputBox("Введите адрес закачки","Enter URL",url)
При этом если просто на запрос нажать клавишу "Ввод", то останется ссылка из скрипта. Но мне кажется, что лучше сразу укорачивать ссылку при этом вводе и получим такие две строки подряд к нашему коду:
- url = Split(InputBox("Введите адрес закачки","Enter URL",url),"?")(0)
- u = Split(url,"/")(3) 'получаем имя видео
Получилось вероятно много текста, поэтому пока остановимся, а продолжение следует.
Удачи!
Код прилагаю ниже:
On Error Resume Next 'маскируем ошибки, если есть, то скрипт продолжит работу
w = vbCrLf
url = "https://vk.com/video-146954363_456239568?list=e28287d47241c04b6b" 'Начнём с такого видео, называется "Коллекция Коллекция Джунджи Ито ...". Получаем ссылку нажав на видео правой кнопкой мышки, заметим, что это сериал, так как есть в ссылке слово "?list", и это ссылка на какой-то сезон.
url = Split(InputBox("Введите адрес закачки","Enter URL",url),"?")(0)
u = Split(url,"/")(3) 'получаем имя видео
Set r = CreateObject("Msxml2.XMLHttp.6.0") 'готовимся к скачиванию
r.open "GET", url&"?", False 'подготавливаем заголовок запроса к сайту
r.setRequestHeader "Host", "vk.com" 'сайт, ой, нет, домен нашего сайта
r.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" 'а это мы говорим сайту, что мы как бы браузер Опера, иначе прилетит очень вероятный ответ, что браузер устарел
r.send 'запрос ушел
If r.Status = 200 Then 'на самом деле тут пауза до получения ответа
q = r.getAllResponseHeaders 'по идее мы получаем ответ с необходимой информацией о страничке и о сайте
End If 'да, нет обработки ошибок, считаем что сеть работает и сайт доступен, но надо всё-таки доделать, верно? :-)
r.open "GET", url&"?", False 'вот очень важный момент, надо обязательно добавить к url вопросительный знак
r.setRequestHeader "Host", "vk.com" 'сайт, ой, нет, домен нашего сайта
r.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" 'а это мы говорим сайту, что мы как бы браузер Опера, иначе прилетит очень вероятный ответ, что браузер устарел
r.send 'отсылаем новый запрос, должна прилететь страничка "правильная"
'Вот тут на самом деле скажу самое интересное, а если Вы зарегистрированы в VK и имеете доступ в сообщество (закрытое даже), то получите то, что надо для парсинга.
If r.Status = 200 Then
CreateObject("Scripting.FileSystemObject").CreateTextFile(u&"_h.htm").Write(r.getAllResponseHeaders).Close() 'пример того, как можно перед получением файла узнать о нём что-то
q = r.responseBody
End If
Set r = Nothing
Set bStrm = createobject("Adodb.Stream")
with bStrm
.type = 1
.open
.write q
.savetofile u&".htm", 2
end with
MsgBox ": The End. :":Wscript.Quit 'Для отладки прерываем работу