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

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

Frapsy

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

Oreshka23

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

Frapsy

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

ImPasha

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

ImPasha

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

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

DeMoN3D

Известный
366
77
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,763
5,916
сейчас выяснилось (достаточно болезненным путём), что использование Lanes вместе с LuaJIT 2.1-beta3 вызывает проблемы посерьёзнее описанных ранее.
из-за какой-то несовместимости использование Lanes приводит к нарушению lua state скриптов и это вызывает проблемы всех видов: падения скриптов с невразумительными ошибками, краши и зависания игры, неверные значения результатов вычислений (предположительно) и вплоть до появления болей в нижней части спины. в связи с этим я крайне рекомендую отказаться от использования Lanes совместно с LuaJIT 2.1-beta и, соответственно, с MoonLoader.
альтернативой может стать библиотека Effil. я её сам не проверял, но судя по описанию она даже лучше Lanes. было бы неплохо, если бы кто-нибудь проверил её и отписался о результате.
 
  • Нравится
Реакции: applethecandy и DeMoN3D

cover

Известный
Проверенный
245
268
Попытка №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 · Просмотры: 38,175
Последнее редактирование:

Frapsy

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

FYP

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