1 (изменено: MirchikAhtung, 2018-07-08 10:17:45)

Тема: AHK: WinHttpRequest / URL адрес не поддерживает протокол.

Привет, форумчане! Столкнулся с такой проблемой, что при выполнении следующего скрипта выскакивает ошибка с текстом, что URL адрес не поддерживает протокол. А конкретней сама кнопка.
Сайт стоит на хостинге и служит лишь для моего обучения. Возможно ли исправить проблему в самом коде? Не трогая сам сайт?


global oHttpRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")

;Загружаем документ с нужного нам URL
oHtmlDoc := documentFromURL("http://site.ru/")

;Получаем объектную модель формы
oForm := oHtmlDoc.forms(0)

;Заполняем необходимые поля
oForm["author"].value := "test"
oForm["message"].value := "test"

;Эмулируем отправку формы
emulateFormSubmit(oForm)

;Строим документ из полученных данных
oHtmlDoc := documentFromHTML(oHttpRequest.responseText)



;Функция эмулирующая отправку формы
emulateFormSubmit(form) {
    ;Если форма отправляется методом POST
    if (form.method = "post"){
        ;Проверяем метод кодирования. У нас реализован только - application/x-www-form-urlencoded
        if (form.enctype != "application/x-www-form-urlencoded") {
            throw "Unsupported enctype !"
        }
        ;Собираем в строку имена и значения полей
        varBody := buildVarBody(form.elements)
        ;Отправляем запроса
        oHttpRequest.open(form.method, form.action, false)   ;------------------Ошибка ссылается на эту строку.
        ;Указываем заголовок типа данных, чтобы принимающая сторона поняла, что мы отправляем форму
        oHttpRequest.setRequestHeader("Content-Type", form.enctype)
        ;Передаём данные
        oHttpRequest.send(varBody)
    } 
    ;Если форма передаётся методом GET
    else if (form.method = "get")
    {
        ;Получаем URL куда должны передаться данные формы
        url := form.action
        ;Если в URL присутствует символ "?" значит там уже идут параметры. Их мы ликвидируем.
        i := InStr(url,"?")
        if (i > 0 ) { 
            StringLeft url, url, i-1 
        }
        ;Собираем поля и цепляем к URL формы
        varBody := buildVarBody(form.elements)
        if (varBody <> "") {
            url := url . "?" . varBody
        }
        ;Отправляем запрос
        oHttpRequest.open("GET",url,false)
        oHttpRequest.send()
    }
    else {
        throw "Unsupported request method !"
    }
}

;Функция сбора полей формы
buildVarBody(form) {
    ;Создаём пустой документ
    oHtmlDoc := documentFromHTML("")
    ;Включаем в нём возможность исполнения скриптов
    oHtmlDoc.designMode := "off"
    ;Получаем ссылку на основной объект скрипта
    oScript := oHtmlDoc.script
    ;Инициализируем JavaScript интерпретатор
    oScript.execScript("eval()")
    i := 0
    while (i < form.elements.length) {
        ;Получаем элемент формы
        element := form.elements(i)
        ;Собираем строку из закодированных имён полей и их значений 
        varBody := varBody . oScript.encodeURIComponent(element.name) . "=" . oScript.encodeURIComponent(element.value) . "&"
        i++
    }
    ;Отрезаем последний амперсанд на хвосте
    StringLeft varBody, varBody, StrLen(varBody)-1
    return varBody    
}

;Функция загрузки документа с указанного URL
documentFromURL(url){
    ;Формируем и отправляем HTTP запрос
    oHttpRequest.open("GET",url,false)
    oHttpRequest.send()
    ;Строим документ из полученных данных
    oHtmlDoc := documentFromHTML(oHttpRequest.responseText)
    ;Добавляем в документ тэг BASE, чтобы относительные пути преобразовать к абсолютным
    oBaseTag := oHtmlDoc.createElement("base")
    oBaseTag.href := url
    oHtmlDoc.all.tags("head")(0).appendChild(oBaseTag)
    return oHtmlDoc
}

;Функция построения документа из HTML кода
documentFromHTML(htmlCode){
    ;Создание документа
    oHtmlDoc := ComObjCreate("htmlfile")
    ;Отключаем скрипты
    oHtmlDoc.designMode := "on"
    ;Открытие документа
    oHtmlDoc.open("text/html")
    oHtmlDoc.write(htmlCode)
    oHtmlDoc.close()
    ;Отключение подгрузки доп. содержимого
    oHtmlDoc.execCommand("stop")
    return oHtmlDoc
}

;Функция для вывода текста в консоль
print(text){
    FileAppend, %text% `r, *
}

Код брал тут: http://forum.script-coding.com/viewtopic.php?id=9381&p=3

Post's attachments

Screenshot_9.png
Screenshot_9.png 14.55 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: WinHttpRequest / URL адрес не поддерживает протокол.

Не используйте эти функции.
Посмотрите, что вы отправляете в броузере и повторите в скрипте.

3

Re: AHK: WinHttpRequest / URL адрес не поддерживает протокол.

oForm["author"].value := "test"
oForm["message"].value := "test"

Они вводят test в оба поля для ввода. ;Это и есть то, что я "отправляю в браузер"
Какую команду для кнопки использовать? Т.е oForm уже говорит само за себя, а что с кнопкой можно сделать?

4 (изменено: Malcev, 2018-07-08 14:59:25)

Re: AHK: WinHttpRequest / URL адрес не поддерживает протокол.

author := "test"
message := "mess"

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("POST", "http://blah-blah.myarena.ru/sendMessage.php", 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("author=" author "&message=" message)
HTTP.WaitForResponse()
msgbox % HTTP.ResponseText

5

Re: AHK: WinHttpRequest / URL адрес не поддерживает протокол.

Malcev Отлично работает, большое спасибо!
В msgbox должен всегда 0 появляться? 

msgbox % HTTP.ResponseText

И маленькая просьба, не могли бы вы с вашего ответа убрать адрес моего сайта?

6

Re: AHK: WinHttpRequest / URL адрес не поддерживает протокол.

Зависит от сервера.