Что нового

Сеть, интернет Ошибка при выполнении функции

Anarky666

Новичок
Сообщения
7
Репутация
0
Есть код, который до вчера выполнялся отлично. Но сегодня, по какой-то загадочной причине стал выдавать ошибку

Код:
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "https://ссылка_на_ресурс") ;ссылка на файл
$oHTTP.Send('')

$hash = StringRegExp($oHTTP.ResponseText, '"hash":"(.*?)",', 3)  ;получаем hash
$sk = StringRegExp($oHTTP.ResponseText, '"sk":"(.*?)","', 3) ;получаем sk

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]&'"}')
    $Url = StringRegExp($oHTTP.ResponseText, 'url":"(.*?)"', 3) ;выдираем только url
EndIf


GetUpdate()

Func GetUpdate()
ProgressOn('Качаем обновление', 'программы ', '0 %', -1, -1, 18)
Local $hDownloadDr = InetGet($Url [0], "C:\distr\update.exe", $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
Do
    If InetGetInfo($hDownloadDr, 1) Then
         Local $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
         $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
        ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 0)) _
        & ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 1)) & ')')
        TraySetState(1)
        ;TraySetToolTip('Файл загружен ' & $iPersent & ' %')
    EndIf
Until InetGetInfo($hDownloadDr, 2)
InetClose($hDownloadDr)
ProgressOff()
EndFunc


Выдает теперь, что Subscript used on non-accessible variable. Но ведь все переменные объявляются выше и собственно в самой функции только локальные переменные. Прошу помощи, уважаемые господа и дамы.
Сообщение автоматически объединено:

Ругается на следующий кусок кода
Код:
Local $hDownloadDr = InetGet($Url [0], "C:\distr\update.exe", $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
 
Последнее редактирование:

lettterssino

Знающий
Сообщения
109
Репутация
10
Есть код, который до вчера выполнялся отлично. Но сегодня, по какой-то загадочной причине стал выдавать ошибку

Код:
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "https://ссылка_на_ресурс") ;ссылка на файл
$oHTTP.Send('')

$hash = StringRegExp($oHTTP.ResponseText, '"hash":"(.*?)",', 3)  ;получаем hash
$sk = StringRegExp($oHTTP.ResponseText, '"sk":"(.*?)","', 3) ;получаем sk

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]&'"}')
    $Url = StringRegExp($oHTTP.ResponseText, 'url":"(.*?)"', 3) ;выдираем только url
EndIf


GetUpdate()

Func GetUpdate()
ProgressOn('Качаем обновление', 'программы ', '0 %', -1, -1, 18)
Local $hDownloadDr = InetGet($Url [0], "C:\distr\update.exe", $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
Do
    If InetGetInfo($hDownloadDr, 1) Then
         Local $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
         $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
        ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 0)) _
        & ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 1)) & ')')
        TraySetState(1)
        ;TraySetToolTip('Файл загружен ' & $iPersent & ' %')
    EndIf
Until InetGetInfo($hDownloadDr, 2)
InetClose($hDownloadDr)
ProgressOff()
EndFunc


Выдает теперь, что Subscript used on non-accessible variable. Но ведь все переменные объявляются выше и собственно в самой функции только локальные переменные. Прошу помощи, уважаемые господа и дамы.
Сообщение автоматически объединено:

Ругается на следующий кусок кода
Код:
Local $hDownloadDr = InetGet($Url [0], "C:\distr\update.exe", $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
Подскажи, а где в годе объявляются следующие переменные, потому что он только на них и ругается ?
Код:
$INET_FORCERELOAD
$INET_DOWNLOADBACKGROUND
 
Автор
A

Anarky666

Новичок
Сообщения
7
Репутация
0
Подскажи, а где в годе объявляются следующие переменные, потому что он только на них и ругается ?
Код:
$INET_FORCERELOAD
$INET_DOWNLOADBACKGROUND
Не только на них, если даже убрать эти переменные, то код все равно выдает ту же самую ошибку
 

lettterssino

Знающий
Сообщения
109
Репутация
10
Ну не знаю , ещё библиотеку не подключил. А вот в такой форме у меня не выдаёт ошибок. на версии 4.4.6
Код:
#include <WinAPIConv.au3>

$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "https://ссылка_на_ресурс") ;ссылка на файл
$oHTTP.Send('')

$INET_FORCERELOAD = '' ; потерянные переменные
$INET_DOWNLOADBACKGROUND = '' ; потерянные переменные
$hash = StringRegExp($oHTTP.ResponseText, '"hash":"(.*?)",', 3)  ;получаем hash
$sk = StringRegExp($oHTTP.ResponseText, '"sk":"(.*?)","', 3) ;получаем sk

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]&'"}')
    $Url = StringRegExp($oHTTP.ResponseText, 'url":"(.*?)"', 3) ;выдираем только url
EndIf


GetUpdate()

Func GetUpdate()
ProgressOn('Качаем обновление', 'программы ', '0 %', -1, -1, 18)
Local $hDownloadDr = InetGet($Url [0], "C:\distr\update.exe", $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
Do
    If InetGetInfo($hDownloadDr, 1) Then
         Local $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
         $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
        ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 0)) _
        & ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 1)) & ')')
        TraySetState(1)
        ;TraySetToolTip('Файл загружен ' & $iPersent & ' %')
    EndIf
Until InetGetInfo($hDownloadDr, 2)
InetClose($hDownloadDr)
ProgressOff()
EndFunc
 

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
а точно ли дело в них, а не в "$Url[0]", проверь чему он равен, и жалетально делай проверки, чтоб исключить такой косяк, а то у тебя функция вызывается, когда до этого ты мог никаких данных по ссылки не получить или вовсе не получить данные страницы
Код:
#include <WinAPIConv.au3>

$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "https://disk.yandex.ru/i/Doc1BxXH-qmP9g") ;ссылка на файл
$oHTTP.Send('')

$hash = StringRegExp($oHTTP.ResponseText, '"hash":"(.*?)",', 3)  ;получаем hash
$sk = StringRegExp($oHTTP.ResponseText, '"sk":"(.*?)","', 3) ;получаем sk

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]&'"}')
    $Url = StringRegExp($oHTTP.ResponseText, 'url":"(.*?)"', 3) ;выдираем только url
    If IsArray($Url) Then
        GetUpdate($Url[0])
    Else
        MsgBox(0,"","Не удалось получить ссылку")
    EndIf
Else
    MsgBox(0,"","Не удалось полуить hash или sk")
EndIf

Func GetUpdate($UrlDownload)
    ProgressOn('Качаем обновление', 'программы ', '0 %', -1, -1, 18)
    Local $hDownloadDr = InetGet($UrlDownload, "C:\distr\update.exe", 1, 1)
    Do
        If InetGetInfo($hDownloadDr, 1) Then
            Local $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
            $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
            ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 0)) _
            & ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 1)) & ')')
            TraySetState(1)
            ;TraySetToolTip('Файл загружен ' & $iPersent & ' %')
        EndIf
    Until InetGetInfo($hDownloadDr, 2)
    InetClose($hDownloadDr)
    ProgressOff()
EndFunc
 
Автор
A

Anarky666

Новичок
Сообщения
7
Репутация
0
а точно ли дело в них, а не в "$Url[0]", проверь чему он равен, и жалетально делай проверки, чтоб исключить такой косяк, а то у тебя функция вызывается, когда до этого ты мог никаких данных по ссылки не получить или вовсе не получить данные страницы
Код:
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "https://ссылка_на_ресурс") ;ссылка на файл
$oHTTP.Send('')

$hash = StringRegExp($oHTTP.ResponseText, '"hash":"(.*?)",', 3)  ;получаем hash
$sk = StringRegExp($oHTTP.ResponseText, '"sk":"(.*?)","', 3) ;получаем sk

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]&'"}')
    $Url = StringRegExp($oHTTP.ResponseText, 'url":"(.*?)"', 3) ;выдираем только url
    If IsArray($Url) Then
        GetUpdate()
    Else
        MsgBox(0,"","Не удалось получить ссылку")
    EndIf
Else
    MsgBox(0,"","Не удалось полуить hash или sk")
EndIf

Func GetUpdate()
    ProgressOn('Качаем обновление', 'программы ', '0 %', -1, -1, 18)
    Local $hDownloadDr = InetGet($Url[0], "C:\distr\update.exe", $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
    Do
        If InetGetInfo($hDownloadDr, 1) Then
            Local $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
            $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
            ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 0)) _
            & ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 1)) & ')')
            TraySetState(1)
            ;TraySetToolTip('Файл загружен ' & $iPersent & ' %')
        EndIf
    Until InetGetInfo($hDownloadDr, 2)
    InetClose($hDownloadDr)
    ProgressOff()
EndFunc
Изначально он и ругался на эту переменную. Благодарю Вас, Ваш вариант работает отлично. Но теперь столкнулся с другой проблемой, что яндекс блокирует сам файл на скачивание. Поэтому буду смотреть в сторону другого файлообменника
1668766118225.png
 
Последнее редактирование:

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
Изначально он и ругался на эту переменную
Посмотреть вложение 5582
Ну так он и говорит, что не знает что такое "$Url[0]", так как попросту не знает что это за переменная, не говоря уже о массиве (не получил до этого данные)

как я говорил в прошлом посте, яндекс любит кидать в блок, если не будешь указывать куки при запросах. Укажи куки и должно быть все гуд

Код:
#include <WinAPIConv.au3>
$Cookie = "2319316901660217002" ;в целом можно оставить так, у яндекс насколько помню проверка только на длинну, т.е если вдруг слетит, то меняешь последние пару цифр.
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "https://disk.yandex.ru/i/Doc1BxXH-qmP9g") ;ссылка на файл
$oHTTP.SetRequestHeader("Cookie", "yandexuid=" & $Cookie)
$oHTTP.Send('')

$hash = StringRegExp($oHTTP.ResponseText, '"hash":"(.*?)",', 3)  ;получаем hash
$sk = StringRegExp($oHTTP.ResponseText, '"sk":"(.*?)","', 3) ;получаем sk

if IsArray($hash) and IsArray($sk) then ;небольшая проверка на ответ сайта
    $oHTTP.Open("POST", "https://disk.yandex.ru/public/api/download-url")
    $oHTTP.SetRequestHeader("Cookie", "yandexuid=" & $Cookie)
    $oHTTP.Send('{"hash":"'&$hash[0]&'","sk":"'&$sk[0]&'"}')
    $Url = StringRegExp($oHTTP.ResponseText, 'url":"(.*?)"', 3) ;выдираем только url
    If IsArray($Url) Then
        GetUpdate($Url[0])
    Else
        MsgBox(0,"","Не удалось получить ссылку")
    EndIf
Else
    MsgBox(0,"","Не удалось полуить hash или sk")
EndIf

Func GetUpdate($UrlDownload)
    ProgressOn('Качаем обновление', 'программы ', '0 %', -1, -1, 18)
    Local $hDownloadDr = InetGet($UrlDownload, "C:\distr\update.exe", 1, 1)
    Do
        If InetGetInfo($hDownloadDr, 1) Then
            Local $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
            $iPersent = Round((InetGetInfo($hDownloadDr, 0) / InetGetInfo($hDownloadDr, 1)) * 100)
            ProgressSet($iPersent, $iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 0)) _
            & ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownloadDr, 1)) & ')')
            TraySetState(1)
            ;TraySetToolTip('Файл загружен ' & $iPersent & ' %')
        EndIf
    Until InetGetInfo($hDownloadDr, 2)
    InetClose($hDownloadDr)
    ProgressOff()
EndFunc


Если поиграться, то можно попросту гененировать куки до тех пор пока он их не съест, т.е если выдаст ошибки при получении данных, то рандомим последние пару чисел и так до тех пор, пока не скачает. Вариант конечно так себе, но прокатит

А если использовать другие хостинги, то google drive и dropbox не блокируют, но там уже свои нюансы касаемо получение ссылки на скачивание
 
Последнее редактирование:
Верх