Что нового

Сеть, интернет Скачать файл с Яндекс. Диска

Anarky666

Новичок
Сообщения
7
Репутация
0
Есть файл на Яндекс.Диск, который периодически обновляется. Как средствами AutoIT забирать этот файл на компьютер? Если брать саму ссылку непосредственно на файл, то он качается, но если я подменяю файл на более новую версию, то ссылка на актуальный файл меняется. Вот собственно, как брать эту самую актуальную ссылку на файл?

Код:
Func GetUpdate()
ProgressOn('Качаем обновление', 'необходимых файлов', '0 %', -1, -1, 18)
Local $hDownloadDr = InetGet("Ссылка на файл на яндекс.диске", "C:\test\update.exe", $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
Do
    If InetGetInfo($hDownloadDr, 1) Then
        Local $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
        ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 0)) _
                 & ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 1)) & ')')
        TraySetState(1)
    EndIf
Until InetGetInfo($hDownloadDr, 2)
InetClose($hDownloadDr)
ProgressOff()
EndFunc
 

SealAlbinos

Знающий
Сообщения
50
Репутация
9
суть в том, что нужен способ получения этой саммой ссылки (она же сама по себе из воздуха не пояляется)
тут если есть доступ к папке с постоянной ссылкой в которой уже собственно файл, который вечно обновляется (меняется ссылка), то можно сделать подобие
Код:
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "ссылка на папку")
$oHTTP.Send('')

получить данные страницы
Код:
$oHTTP.ResponseText
и уже при помощи регулярки выдрать ссылку
 

filautdinov

Знающий
Сообщения
96
Репутация
9
а разве если имя файла совпадает ссылка не та же остается? сколько раз заменял файл ссылка не менялась.
 

Oki

Осваивающий
Сообщения
221
Репутация
26
а разве если имя файла совпадает ссылка не та же остается? сколько раз заменял файл ссылка не менялась.
Может быть, зависит от способа обновления? Как раз случайно вчера был у меня подобный опыт с OneDrive. При обновлении сервис запросил метод обновления: вести список версий или обновить на то же место. Было выбрано обновление на то же место, и по старой ссылке стала доступной новая версия. Полагаю, что при ином ответе результат в этом плане не был бы таким же. Что касается других сервисов, например, Яндекс.Диск, устроено может быть ещё как-то иначе.
 
Автор
A

Anarky666

Новичок
Сообщения
7
Репутация
0
а разве если имя файла совпадает ссылка не та же остается? сколько раз заменял файл ссылка не менялась.
Ссылка на саму страницу с файлом не меняется. Меняется ссылка на сам файл. Как я понял, она генерируется автоматом при обновлении файла. Потому и нужно вытянуть ссылку с кнопки.1668065046716.png
Сообщение автоматически объединено:

суть в том, что нужен способ получения этой саммой ссылки (она же сама по себе из воздуха не пояляется)
тут если есть доступ к папке с постоянной ссылкой в которой уже собственно файл, который вечно обновляется (меняется ссылка), то можно сделать подобие
Код:
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "ссылка на папку")
$oHTTP.Send('')

получить данные страницы
Код:
$oHTTP.ResponseText
и уже при помощи регулярки выдрать ссылку
Пробовал этот метод с, примерно, таким же кодом. Он находит ссылку неизменяемой части, а ссылку с кнопки не дергает
 

SealAlbinos

Знающий
Сообщения
50
Репутация
9
Ссылка на саму страницу с файлом не меняется. Меняется ссылка на сам файл. Как я понял, она генерируется автоматом при обновлении файла. Потому и нужно вытянуть ссылку с кнопки.Посмотреть вложение 5573
Сообщение автоматически объединено:


Пробовал этот метод с, примерно, таким же кодом. Он находит ссылку неизменяемой части, а ссылку с кнопки не дергает
Потому что у кнопки изначально никакой ссылки и нету, она генерируется запросом в который нужно указать hash и sk , их то мы уже на самой странице и получаем
пример:
Код:
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "https://disk.yandex.ru/i/Doc1BxXH-qmP9g")
$oHTTP.Send('')

$hash = StringRegExp($oHTTP.ResponseText, '"hash":"(.*?)",', 3)
$sk = StringRegExp($oHTTP.ResponseText, '"sk":"(.*?)","', 3)

if IsArray($hash) and IsArray($sk) then
    $oHTTP.Open("POST", "https://disk.yandex.ru/public/api/download-url")
    $oHTTP.Send('{"hash":"'&$hash[0]&'","sk":"'&$sk[0]&'"}')
    MsgBox(0,"",$oHTTP.ResponseText)
    $Url = StringRegExp($oHTTP.ResponseText, 'url":"(.*?)"', 3)
    MsgBox(0,"",$Url[0])
else
    MsgBox(0,"","Что-то пошло не так")
EndIf


P.s. Так же советую использовать Cookie при GET и POST так как если будет много запросов, яндекс может кинуть в блок (проверка на робота) и самый простой способ избежать такой ситуации, то это использовать куки, которые можно получить из мониторинга сети в браузере (f12)
Код:
$oHTTP.SetRequestHeader("Cookie, "сами куки")
 

Вложения

  • Screenshot_1.png
    Screenshot_1.png
    43.8 КБ · Просмотры: 5
Последнее редактирование:
Автор
A

Anarky666

Новичок
Сообщения
7
Репутация
0
Потому что у кнопки изначально никакой ссылки и нету, она генерируется запросом в который нужно указать hash и sk , их то мы уже на самой странице и получаем
пример:
Код:
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "https://disk.yandex.ru/i/Doc1BxXH-qmP9g")
$oHTTP.Send('')

$hash = StringRegExp($oHTTP.ResponseText, '"hash":"(.*?)",', 3)
$sk = StringRegExp($oHTTP.ResponseText, '"sk":"(.*?)","', 3)

if IsArray($hash) and IsArray($sk) then
    $oHTTP.Open("POST", "https://disk.yandex.ru/public/api/download-url")
    $oHTTP.Send('{"hash":"'&$hash[0]&'","sk":"'&$sk[0]&'"}')
    MsgBox(0,"",$oHTTP.ResponseText)
    $Url = StringRegExp($oHTTP.ResponseText, 'url":"(.*?)"', 3)
    MsgBox(0,"",$Url[0])
else
    MsgBox(0,"","Что-то пошло не так")
EndIf


P.s. Так же советую использовать Cookie при GET и POST так как если будет много запросов, яндекс может кинуть в блок (проверка на робота) и самый простой способ избежать такой ситуации, то это использовать куки, которые можно получить из мониторинга сети в браузере (f12)
Код:
$oHTTP.SetRequestHeader("Cookie, "сами куки")
Спасибо, решение очень помогло, подогнал под себя. Правда, не стал использовать кукисы, т.к. корпоративный доступ у всех имеется и решил, что не стоит, но в любом случае буду иметь ввиду на будущее, если возникнут проблемы. Всем огромное спасибо за помощь.
 
Верх