json+http

roodaka

Новичок
Автор темы
8
0
Версия MoonLoader
Другое
всем привет. бьюсь над проблемой уже часа 2, никак не могу понять. может, что-то важное упускаю.
в общем, хотел сделать скрипт, автоматом переводящий на англ отправленный в чат текст.
всё как нужно, подключил, перехватываю сообщение в onSendChat.
Lua:
if message ~= "" then
          message = trim(message)
          sampAddChatMessage("trim", -1)
        local url_text = urlencode(message) -- Кодирование параметра в URL формат
        local url = string.format("https://translate.yandex.net/api/v1.5/tr.json/translate?key=%s&text=%s&lang=ru-en", api, url_text)
        print(url)
        async_http_request("GET", url, nil,
        function(response)
          local words = decodeJson(response.text)
            for k, v in pairs(words) do
              sampAddChatMessage(v, -1)
              sampAddChatMessage(k, -1)
              end
        end,
        function(err)
          sampAddChatMessage("-", -1)
        end)
      
end

cуть в следующем. в чат приходит.
""
"text"
"200"
"code"
"en-ru"
"language"

то есть, значение в json "text" - пустое. но. если перейти по ссылке, которая приходит в мунлоадер лог (print(url) в коде), там текст корректный.
{"code":200,"lang":"ru-en","text":["check"]}

не могу понять, в чем может быть проблема. игрался с кодировкой-декодировкой utf-8 (сам текст документа 1251) - либо становилось еще хуже, либо вообще ничего не менялось.

ни у кого нет мыслей, с чем может быть связана "пропажа" содержания "text" при получении ответа от API?
 
Решение
точно.
да, теперь в чат выводится, но это что-то супер кривое.
"пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ"
пробовал перевести строку в кодировку utf-8 - символы сменились. "РїС—Р…РїС—Р…РїС—Р…"
смешно уже.
я опять что-то упускаю. что можно попробовать сделать с этим?
при отправке шифруй - u8:encode(message)
при получении дешифруй - u8:decode(response.text) либо u8:decode(words.text[1])

Lua:
-- ко всем require
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

-- использование
if #message ~= 0 then
    message = u8:encode(trim(message))
    local url = string.format("https://translate.yandex.net/api/v1.5/tr.json/translate?key=%s&text=%s&lang=ru-en", api, urlencode(message))
    --...

roodaka

Новичок
Автор темы
8
0
у тебя в words.text таблица, а ты пытаешься вывести её в чат
бери первый или нулевой элемент (не знаю точно как работает decodeJson)

Lua:
local words = decodeJson(response.text)
sampAddChatMessage(words.text[1], -1) -- либо words.text[0] если [1] не сработает
точно.
да, теперь в чат выводится, но это что-то супер кривое.
"пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ"
пробовал перевести строку в кодировку utf-8 - символы сменились. "РїС—Р…РїС—Р…РїС—Р…"
смешно уже.
я опять что-то упускаю. что можно попробовать сделать с этим?
 

asdzxcjqwe

¯\_(ツ)_/¯
Друг
621
709
точно.
да, теперь в чат выводится, но это что-то супер кривое.
"пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ"
пробовал перевести строку в кодировку utf-8 - символы сменились. "РїС—Р…РїС—Р…РїС—Р…"
смешно уже.
я опять что-то упускаю. что можно попробовать сделать с этим?
при отправке шифруй - u8:encode(message)
при получении дешифруй - u8:decode(response.text) либо u8:decode(words.text[1])

Lua:
-- ко всем require
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

-- использование
if #message ~= 0 then
    message = u8:encode(trim(message))
    local url = string.format("https://translate.yandex.net/api/v1.5/tr.json/translate?key=%s&text=%s&lang=ru-en", api, urlencode(message))
    -- print(url)
    async_http_request("GET", url, nil, function(response)
        sampAddChatMessage("response = " .. u8:decode(response.text), -1)
        -- print("response = " .. u8:decode(response.text))
    end, function(err)
        sampAddChatMessage("ошибка", -1)
    end)
end


убедись также, что ты сохраняешь файл в правильной кодировке - windows-1251 (cp1251 / ansi)

1586670563149.png
 
Последнее редактирование:

roodaka

Новичок
Автор темы
8
0
пробуй подключить библиотеку encoding

Lua:
-- ко всем require и locals
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

-- использование
sampAddChatMessage(u8:decode(response.text[1]), -1)

убедись также, что ты сохраняешь файл в правильной кодировке - windows-1251 (cp1251 / ansi)
она уже была подключена.
попробовал твой код. не знаю, правильно ли указывать "response.text[1]", попробовал и этот вариант, и "words.text[1]"


в случае, если ставить "words.text[1]" - пустая строка прилетает.
если ставить "response.text[1]" - скрипт умирает с причиной
Код:
Script: D:\GTA San Andreas\moonloader\lib\encoding.lua:77: bad argument #1 to 'iconv' (string expected, got nil)
stack traceback:
    [C]: in function 'iconv'
    D:\GTA San Andreas\moonloader\lib\encoding.lua:77: in function 'decode'
    D:\GTA San Andreas\moonloader\script.lua:153: in function 'resolve'
    D:\GTA San Andreas\moonloader\script.lua:104: in function <D:\GTA San Andreas\moonloader\script.lua:98>
[07:46:49.204030] (error)    Script: Script died due to an error. (0C0FD2D4)
получается, строка там тоже пустая. но если убрать эту кодировку, то строка будет, хоть и с крокозябрами. вот и че делать, хер знает.
не заметил редактирования, сейчас скину



upd.
не заметил изменений в твоем сообщении, сейчас попробую.