1 (изменено: Finx, 2019-01-14 16:49:27)

Тема: AHK: Проблемы с кодировкой при HTTP запросе.

Привет.
Собственно, проблема в том, что я не могу получить корректный текст (кириллицу) из HTTP запроса.
Вот сам запрос:

http://185.228.233.140:7777/?method=message.get&login=Randewoo&message_id=1

В браузере (по крайней мере - у меня) все отлично работает, кириллица корректно отображается.
Но когда я делаю этот-же запрос, но через AHK, у меня выводит следующее вот это - http://prntscr.com/m6zg9m
Я указывал разные заголовки, которые указаны в браузере. Но ничего не сработало.
Вот сам код:


execute(array) {
		whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
		whr.Open("GET", this.scheme "://" this.domain this.build_http_array(array), true)
		whr.SetRequestHeader("Content-Type", "application/json;q=0.9,*/*;q=0.8")
		whr.SetRequestHeader("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3")
		whr.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0")
		whr.Send()
		whr.WaitForResponse()
		FileAppend, % whr.ResponseText
		, % A_MyDocuments "\requests_log.txt"
		, UTF-8
		return ParseJson(whr.ResponseText)
}

Буду очень благодарен за помощь!

2

Re: AHK: Проблемы с кодировкой при HTTP запросе.

Возможные варианты:

url := "http://185.228.233.140:7777/?method=message.get&login=Randewoo&message_id=1"
whr := ComObjCreate("Microsoft.XmlHttp")
whr.Open("GET", url, false)
whr.Send()
MsgBox, % whr.ResponseText
url := "http://185.228.233.140:7777/?method=message.get&login=Randewoo&message_id=1"
whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", url, false)
whr.Send()
body := whr.responseBody
pdata := NumGet(ComObjValue(body) + 8 + A_PtrSize)
length := body.MaxIndex() - body.MinIndex() + 1
MsgBox, % text := StrGet(pdata, length, "utf-8")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: wisgest, 2019-01-15 09:38:36)

Re: AHK: Проблемы с кодировкой при HTTP запросе.

Вот ещё на всякий случай способ:

whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", "http://185.228.233.140:7777/?method=message.get&login=Randewoo&message_id=1", false)
whr.Send()

ADODBStream := ComObjCreate("ADODB.Stream")
ADODBStream.Type := 2 ;adTypeText
ADODBStream.Mode  := 3 ;adModeReadWrite
ADODBStream.Open()
;ADODBStream.Charset := "UTF-16"
ADODBStream.WriteText(whr.ResponseBody)
ADODBStream.Position := 0
ADODBStream.Charset := "UTF-8"

MsgBox, % ADODBStream.ReadText()
ADODBStream.Close()

4

Re: AHK: Проблемы с кодировкой при HTTP запросе.

teadrinker, wisgest, большое Вам спасибо. Все работает!

5

Re: AHK: Проблемы с кодировкой при HTTP запросе.

wisgest, ваш почему-то выдаёт два нечитаемых знака в начале текста:

https://i.imgur.com/1GQillS.png

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Проблемы с кодировкой при HTTP запросе.

BOM

7

Re: AHK: Проблемы с кодировкой при HTTP запросе.

Я тоже так предположил, но зачем он в тексте.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Проблемы с кодировкой при HTTP запросе.

teadrinker, а у меня их нет.
Попробовал

MsgBox, % Substr(ADODBStream.ReadText(), 3)

— начинается сразу с «response"{"code":503,…».

9

Re: AHK: Проблемы с кодировкой при HTTP запросе.

wisgest, мне кажется, что ваш вариант неправильный.
Вы получаете массив байтов, а записываете его как текст.
Правильно делать как-то так:

whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", "http://185.228.233.140:7777/?method=message.get&login=Randewoo&message_id=1", false)
whr.Send()

ADODBStream := ComObjCreate("ADODB.Stream")
ADODBStream.Type := 1 ; Binary data
ADODBStream.Mode  := 3 ;adModeReadWrite
ADODBStream.Open()
ADODBStream.Write(whr.ResponseBody)
ADODBStream.Position := 0
ADODBStream.Type := 2 ;adTypeText
ADODBStream.Charset := "UTF-8"

MsgBox, % ADODBStream.ReadText()
ADODBStream.Close()

Хотя зачем использовать вообще ADODBStream, когда можно взять напрямую из памяти?