Тема: 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