Исходник Гайд Асинхронные HTTP запросы в MoonLoader

Статус
В этой теме нельзя размещать новые ответы.

Frapsy

Известный
Проверенный
393
226
А можно поинтересоваться почему это самоубийство?
Потому что если ты планируешь скрипт делать не только для себя то сообщаю, компилятор у луашника такой себе, особо не обезопасит, по этому правильней будет отсылать данные на обработчик, который уже точно безопасно все сделает, если конечно, он будет написан нормально(в плане фильтрации).
 

Oreshka23

Известный
338
164
Потому что если ты планируешь скрипт делать не только для себя то сообщаю, компилятор у луашника такой себе, особо не обезопасит, по этому правильней будет отсылать данные на обработчик, который уже точно безопасно все сделает, если конечно, он будет написан нормально(в плане фильтрации).
Хорошо, в таком случае как через обработчик выполнить запрос «SELECT * FROM table». Какой ответ отсылать с обработчика?
 

Frapsy

Известный
Проверенный
393
226
Хорошо, в таком случае как через обработчик выполнить запрос «SELECT * FROM table». Какой ответ отсылать с обработчика?
Делаешь в скрипте асинхронный GET/POST запрос на адрес обработчика(php файл на хосте) с передаваемыми(если они необходимы) параметрами и на их основе(опять же, если они заданы) проводишь те или иные операции. Как вывести все данные из таблицы посредством PHP - гайдов в сети много, ищи, а там, когда вывод инфы будет готов, то в запросе, в function(response) просто соберешь нужную инфу и готово.
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,130
Хорошо, в таком случае как через обработчик выполнить запрос «SELECT * FROM table». Какой ответ отсылать с обработчика?
Ты так не сделаешь, создавай PHP скрипт, подключай к БД и делай запрос из него, а через асинхронные делай запрос с PHP.
 
  • Нравится
Реакции: Di3

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,130
При попытке сделать запрос через https выдаёт 302-ю ошибку.
Можно как-нибудь исправить?

UPD: Направил через www, помогло.
 

DeMoN3D

Известный
366
76
Lua:
local lanes = require("lanes").configure()

function async_http_request(method, url, args, resolve, reject)
    if not _G["lanes.async_http"] then
        local linda = lanes.linda()
        local lane_gen = lanes.gen("*", {package = {path = package.path, cpath = package.cpath}}, function()
            local requests = require("requests")
            while true do
                local key, val = linda:receive(50 / 1000, "request")
                if key == "request" then
                    local ok, result = pcall(requests.request, val.method, val.url, val.args)
                    if ok then
                        result.json, result.xml = nil, nil
                        linda:send("response", result)
                    else linda:send("error", result) end
                end
            end
        end)
        _G["lanes.async_http"] = {lane = lane_gen(), linda = linda}
    end
    local lanes_http = _G["lanes.async_http"]
    lanes_http.linda:send("request", {method = method, url = url, args = args})
    lua_thread.create(function(linda)
        while true do
            local key, val = linda:receive(0, "response", "error")
            if key == "response" then return resolve(val)
            elseif key == "error" then return reject(val) end
            wait(0)
        end
    end, lanes_http.linda)
end

async_http_request("POST", "https://test.police-assistant.ru", {params = {name = "test"}}, function(response) print(response.text) end, function(err) print(err) end)

RESULT: error in POST request: host or service not provided, or not known
В чём проблема?

UPD: Решил
как решил проблему?
 

FYP

Известный
Автор темы
Администратор
1,758
5,718
сейчас выяснилось (достаточно болезненным путём), что использование Lanes вместе с LuaJIT 2.1-beta3 вызывает проблемы посерьёзнее описанных ранее.
из-за какой-то несовместимости использование Lanes приводит к нарушению lua state скриптов и это вызывает проблемы всех видов: падения скриптов с невразумительными ошибками, краши и зависания игры, неверные значения результатов вычислений (предположительно) и вплоть до появления болей в нижней части спины. в связи с этим я крайне рекомендую отказаться от использования Lanes совместно с LuaJIT 2.1-beta и, соответственно, с MoonLoader.
альтернативой может стать библиотека Effil. я её сам не проверял, но судя по описанию она даже лучше Lanes. было бы неплохо, если бы кто-нибудь проверил её и отписался о результате.
 
  • Нравится
Реакции: applethecandy и DeMoN3D

cover

Известный
Проверенный
245
273
Попытка №2. Спасибо FYP за компиляцию библиотеки.

Собственно, протестировал effil. Вроде как, все работает, но на "длинных расстояниях" тесты не проводились.

Пример вызова:

Lua:
-- С функциями обработки ответа и ошибок.
asyncHttpRequest('GET', 'https://www.google.com/robots.txt', nil --[[Аргументы запроса]],
         function(response)
            --
         end,
         function(err)
            --
         end)

-- Без функций обработки ответа и ошибок. Можно добавить как функцию обработки ответа так и функцию обработки ошибок, но можно обойтись и без них, как показано в примере ниже.
asyncHttpRequest('GET', 'https://www.google.com/robots.txt', nil --[[Аргументы запроса]], nil --[[Функция обработки ответа]], nil --[[Функция обработки ошибок]])

Lua:
local effil = require 'effil' -- В начало скрипта

function asyncHttpRequest(method, url, args, resolve, reject)
   local request_thread = effil.thread(function (method, url, args)
      local requests = require 'requests'
      local result, response = pcall(requests.request, method, url, args)
      if result then
         response.json, response.xml = nil, nil
         return true, response
      else
         return false, response
      end
   end)(method, url, args)
   -- Если запрос без функций обработки ответа и ошибок.
   if not resolve then resolve = function() end end
   if not reject then reject = function() end end
   -- Проверка выполнения потока
   lua_thread.create(function()
      local runner = request_thread
      while true do
         local status, err = runner:status()
         if not err then
            if status == 'completed' then
               local result, response = runner:get()
               if result then
                  resolve(response)
               else
                  reject(response)
               end
               return
            elseif status == 'canceled' then
               return reject(status)
            end
         else
            return reject(err)
         end
         wait(0)
      end
   end)
end

Установка: содержимое архива разархивировать в папку lib
 

Вложения

  • lib-effil.7z
    202.3 KB · Просмотры: 34,187
Последнее редактирование:

Frapsy

Известный
Проверенный
393
226
Вроде как, все работает
Работать - работает, а если у меня глаза не кривые, то, кажется как то плавнее игра стала с effil по запросам, может самовнушение, не уверен. Мне только интересно, у обеих этих функций(что фиповская, что твоя) чтоль одна болезнь? Крашит скрипт, в случае, если один запрос будет идти постоянно(в цикле раз в секунду) и одновременно с ним будет в рандом время отправляется другой запрос(это я решил проверить отправку и получение сообщений с ВК под данной функцией) ;D
Lua:
[ML] (error) script: cannot resume non-suspended coroutine
stack traceback:
[C]: in function 'status'
 

FYP

Известный
Автор темы
Администратор
1,758
5,718
@Frapsy если я правильно понимаю работу Effil из документации по ней, я не стал бы рекомендовать реализацию cover-а для частого выполнения запросов, т.к. тут библиотека requests (и другие загружаемые ею) загружается при каждом вызове и выгружается при завершении запроса - это плохо сказывается на производительности и может вызвать проблемы, как, например, описанную тобой
 
Статус
В этой теме нельзя размещать новые ответы.