Привет всем! Как все таки отправить HTTP запрос из Lua(Quik)? Я пытаюсь использовать LuaSocket ,но Quik в упор не видит эту библиотеку куда бы я ему ее не положил. Какие шаманские обряды нужно провести,чтобы сие чудо заработало.
Пользователь
Сообщений: Регистрация: 29.03.2017
08.02.2019 07:58:55
Когда-то скачал робота, который заходит на сайт Смарт Лаб и считывает с него календарь дивидендов, сигналит в КВИК если завтра ожидается дивидендный гэп. Сейчас скрипт не работает, потому что смарт лаб поменял вёрстку дивидендной страницы, но раньше я этот скрипт запускал и всё работало.
Код
if string.find(package.path,'C:\\Program Files (x86)\\Lua\\5.1\\lua\\?.lua')==nil then
package.path=package.path..';C:\\Program Files (x86)\\Lua\\5.1\\lua\\?.lua;'
end
if string.find(package.path,'C:\\Program Files\\Lua\\5.1\\lua\\?.lua')==nil then
package.path=package.path..';C:\\Program Files\\Lua\\5.1\\lua\\?.lua;'
end
require "socket"
is_run=true
http = require 'socket.http'
local address = 'http://smart-lab.ru/dividends/index/order_by_t2_date/desc/'
local ts={"tr","strong","span"}
local lMax=91 --число строк в таблице
function do_smart ()
local body = http.request(address)
----------------------
for i=1,#ts do
body = string.gsub (body,"(<%s*"..ts[i].."[^>]*>)","")
body = string.gsub (body,"(<%s*/"..ts[i].."[^>]*>)","")
end
body = string.gsub (body," "," ")
local t={} -- результат
local j=0; local k=0; local text=0;
local m=1;
local n=string.find(body,"td>",m,#body,true);
local x=string.byte(body,n-1);
m=m+3;
-----------------
while #body>m do
n=string.find(body, "td>",m,#body,true);
if n then local n1=n;
if x~=47 then
x=string.byte(body,n-1); if x==47 then n=n-1; end
text = string.sub(body, m,n-2); text = nkdelspace(text);
local len=string.len(text);
if len<20 then
j=j+1; if j==1 then k=k+1; t[k]={} end
local tt=t[k]; tt[#tt+1]=text;
if j==8 then if k==lMax then break end
j=0 end
end
else
x=string.byte(body,n-1);
end
m=n1+3;
else break;
end
end
trade_date=getParamEx("TQBR","GAZP","TRADE_DATE_CODE").param_image
prev_date=getParamEx("TQBR","GAZP","PREVDATE").param_image
for k,v in ipairs (t) do
local td=trade_date.." "
local pd=prev_date.." "
if td==t[k][2] then
message ("Zavtra GAP "..t[k][1].." div="..t[k][6].." | "..t[k][8],1)
end
if pd==t[k][2] then
message ("Segodnya GAP "..t[k][1].." div="..t[k][6].." | "..t[k][8],1)
end
end
end
function OnCleanUp ()
sleep (700000)
do_smart ()
end
function OnConnected ()
do_smart ()
end
function OnStop ()
return 100
end
--------------------
function nkdelspace(s)
local len=string.len(s); local z=""; local x1=32;
for i=1,len do local x=string.byte(s,i); if x<32 then x=32 end
if (x~=32 or x1~=32) then
if z=="" then z=string.char(x) else z=z..string.char(x) end
x1=x; end
end --убираем проблелы
return z;
end
do_smart ()
function main ()
while is_run do
sleep (1000)
end
end
в комплекте скрипта в архиве были библиотеки Socket и mime Вот пост где автор опубликовал этого робота с описанием что он делает
Пользователь
Сообщений: Регистрация: 08.05.2020
17.12.2021 15:51:50
Цитата
Let_it_go написал: Когда-то скачал робота, который заходит на сайт Смарт Лаб и считывает с него календарь дивидендов, сигналит в КВИК если завтра ожидается дивидендный гэп. Сейчас скрипт не работает, потому что смарт лаб поменял вёрстку дивидендной страницы, но раньше я этот скрипт запускал и всё работало.
Код
if string.find (package.path,'C:\\Program Files (x86)\\Lua\\ 5.1 \\lua\\?.lua') = = nil then
package.path = package.path .. ';C:\\Program Files (x86)\\Lua\\ 5.1 \\lua\\?.lua;'
end
if string.find (package.path,'C:\\Program Files\\Lua\\ 5.1 \\lua\\?.lua') = = nil then
package.path = package.path .. ';C:\\Program Files\\Lua\\ 5.1 \\lua\\?.lua;'
end
require "socket"
is_run = true
http = require 'socket.http'
local address = 'http://smart-lab.ru/dividends/index/order_by_t2_date/desc/'
local ts = {"tr","strong","span"}
local lMax = 91 --число строк в таблице
function do_smart ()
local body = http.request (address)
----------------------
for i = 1 , # ts do
body = string.gsub (body,"( < %s * " .. ts[i] .. "[^ > ] * > )","")
body = string.gsub (body,"( < %s * /" .. ts[i] .. "[^ > ] * > )","")
end
body = string.gsub (body," "," ")
local t={} -- результат
local j=0; local k=0; local text=0;
local m=1;
local n=string.find(body," td > ",m, # body, true );
local x = string.byte (body,n - 1 );
m = m + 3 ;
-----------------
while # body > m do
n = string.find (body, "td>" ,m, # body, true );
if n then local n1 = n;
if x~ = 47 then
x = string.byte (body,n - 1 ); if x = = 47 then n = n - 1 ; end
text = string.sub (body, m,n - 2 ); text = nkdelspace(text);
local len = string.len (text);
if len < 20 then
j = j + 1 ; if j = = 1 then k = k + 1 ; t[k] = {} end
local tt = t[k]; tt[ # tt + 1 ] = text;
if j = = 8 then if k = = lMax then break end
j = 0 end
end
else
x = string.byte (body,n - 1 );
end
m = n1 + 3 ;
else break ;
end
end
trade_date = getParamEx ( "TQBR" ,"GAZP","TRADE_DATE_CODE").param_image
prev_date = getParamEx ( "TQBR" ,"GAZP","PREVDATE").param_image
for k,v in ipairs (t) do
local td = trade_date .. " "
local pd=prev_date.." "
if td==t[k][2] then
message (" Zavtra GAP "..t[k][1].." div = "..t[k][6].." | "..t[k][8],1)
end
if pd==t[k][2] then
message (" Segodnya GAP "..t[k][1].." div = "..t[k][6].." | "..t[k][8],1)
end
end
end
function OnCleanUp ()
sleep (700000)
do_smart ()
end
function OnConnected ()
do_smart ()
end
function OnStop ()
return 100
end
--------------------
function nkdelspace(s)
local len=string.len(s); local z=" "; local x1 = 32 ;
for i = 1 ,len do local x = string.byte (s,i); if x < 32 then x = 32 end
if (x~ = 32 or x1~ = 32 ) then
if z = = "" then z = string.char (x) else z = z .. string.char (x) end
x1 = x; end
end --убираем проблелы
return z;
end
do_smart ()
function main ()
while is_run do
sleep ( 1000 )
end
end
в комплекте скрипта в архиве были библиотеки Socket и mime
Вот пост где автор опубликовал этого робота с описанием что он делает
Очень актуален вопрос HTTP-запроса для Lua Quik (отказался от идеи читать почту). Что бы запустить этот вариант пришлось:
1) Установить программу Lua 2) Прописать пути вверху скрипта string.find (package.path,'C:\\Program Files... 3) Закинуть в папку luaIndicators/ папки mime & socket
Для меня этот код запуска для решения задачи + установки дополнительной программы = мягко говоря вынос мозга (в сравнении с PHP - где библиотеки подключаются через композер, по нормальному работают require (inclue), где понимаешь что подключаешь...
А здесь совсем не понимаю как устроен луа в плане подключения библиотек. Может кто-нибудь объяснить как работает подключение библиотек в луа.
И есть ли что-то попроще без установки программ что бы запустить простую функцию file_get_contents (http) в lua? Спасибо.
Торговый привод на Lua:
Пользователь
Сообщений: Регистрация: 08.05.2020
17.12.2021 16:01:55
Вот даже из этого работающего примера я не пойму - зачем нужно ставить дополнительную программу (ну это еще ладно) - ну если мы ее поставил - зачем еще какие-то 2 папки закидывать в luaindicators?
Торговый привод на Lua:
Пользователь
Сообщений: Регистрация: 27.01.2017
17.12.2021 16:20:29
Что значит зачем. Lua не имеет встроенной поддержки web soсket. Поэтому необходимы библиотеки (а не программы), чтобы сие действие стало доступно. Ссылки на сборки библиотек недавно обсуждались.
Пользователь
Сообщений: Регистрация: 08.05.2020
17.12.2021 16:57:43
Цитата
Nikolay написал: Что значит зачем. Lua не имеет встроенной поддержки web soсket. Поэтому необходимы библиотеки (а не программы), чтобы сие действие стало доступно. Ссылки на сборки библиотек недавно обсуждались.
Не могу понять что нужно скачать и что закинуть в папку моего скрипта? Мне помогла эта тема:
Я закинул по списку данные файлы в папку C:/Quik/Luaindicators/
И у меня все работает. Но я бы хотел все это закинуть в папку моего скрипта:
Когда я закидываю все это в папку моего скрипта: C:\QUIK\LuaIndicators\QET\EnterTradeLib\lua\ Это перестает работать: Quik при запуске скрипта пишет: Что не находит таких библиотек.
Как их в эту папку засунуть? Скрипты подключаю так:
Код
w32 = require("w32"); -> вот что интересно это лежит в папке C:\QUIK\LuaIndicators\QET\EnterTradeLib\ и квик его находит
http = require("socket.http"); -> а это нет... находит только когда это лежит в папке C:/Quik/Luaindicators/
Сори за множество вопросов - но здесь в луа реально не так как в PHP с его наймспейсами и прочими фишками...
Торговый привод на Lua:
Пользователь
Сообщений: Регистрация: 27.01.2017
17.12.2021 17:05:35
Чтобы скрипт нашел библиотеку в каталогах отличных от предопределенных, необходимо дополнить путь искателя
Моя идея положить эти библиотеки в папку моего скрипта, но когда я так делаю они перестают работать, работают только когда все добро размещено в папке: C:\QUIK\LuaIndicators Вверху моего скрипта я дополнил путь, библиотеки (скрипты) разместил в соответствующую папке моего скрипта:
Код
if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.lua') == nil then
package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.lua;'
end;
w32 = require("w32"); -> это звуки (они и так находятся)...
http = require("socket.http"); -> а вот это не находится когда я размещаю в папку моего скрипта
Вот исходные файлы библиотек - здесь 2 папки и несколько файлов. Не пойму что я не правильно делаю. Квик пишет
Код
...UIK\LuaIndicators\Git\EnterTradeLib\Lua\socket.lua:13: module 'socket.core' not found:
no field package.preload['socket.core']
no file '.\socket\core.lua'
no file 'C:\QUIK\lua\socket\core.lua'
no file 'C:\QUIK\lua\socket\core\init.lua'
no file 'C:\QUIK\socket\core.lua'
no file 'C:\QUIK\socket\core\init.lua'
no file 'C:\QUIK\Include\socket\core.lua'
no file 'C:\QUIK\Include\socket\core.luac'
no file 'C:\QUIK\LuaIndicators\socket\core.lua'
no file 'C:\QUIK\LuaIndicators\socket\core.luac'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\core.luac'
no file 'C:\QUIK\LuaIndicators\Git\EnterTradeLib\Lua\socket\core.lua'
no file '.\socket\core.dll'
no file 'C:\QUIK\socket\core.dll'
no file 'C:\QUIK\loadall.dll'
no file
Торговый привод на Lua:
Пользователь
Сообщений: Регистрация: 21.08.2015
17.12.2021 17:38:10
Иван, непонятно, чего вы уцепились за папку LuaIndicators. В этой папке квик ищет именно индикаторы, то есть которые на график. Для скриптов создайте другую папку, "lua", и в нее кладите все либы. Квик сам вам говорит, где он искал, особенно обратите внимание на строки
Цитата
no file 'C:\QUIK\lua\socket\core.lua' no file 'C:\QUIK\lua\socket\core\init.lua'
Здесь квик хочет загрузить библиотеку с именем "socket.core". Для этого он в папке lua ищет подпапку socket, а в ней либо файл core.lua, либо подпапку core, в которой есть скрипт с именем init.lua. Это для всех библиотек так работает, библиотека это либо один файл, либо папка с файлом init.lua.
Пользователь
Сообщений: Регистрация: 08.05.2020
17.12.2021 17:38:36
Уже и так даже попробовал и все равно не работает, если поместить это все в папку моего скрипта:
Код
-- if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.?') == nil then
-- package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.?;'
-- end;
-- if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\mime\\?.?') == nil then
-- package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\mime\\?.?;'
-- end;
-- if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\socket\\?.?') == nil then
-- package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\socket\\?.?;'
-- end;
Торговый привод на Lua:
Пользователь
Сообщений: Регистрация: 08.05.2020
17.12.2021 17:44:25
Цитата
Anton написал: , непонятно, чего вы уцепились за папку LuaIndicators. В этой папке квик ищет именно индикаторы, то есть которые на график. Для скриптов создайте другую папку, "lua", и в нее кладите все либы. Квик сам вам говорит, где он искал, особенно обратите внимание на строки
Цитата
no file 'C:\QUIK\lua\socket\core.lua' no file 'C:\QUIK\lua\socket\core\init.lua'
Здесь квик хочет загрузить библиотеку с именем "socket.core". Для этого он в папке lua ищет подпапку socket, а в ней либо файл core.lua, либо подпапку core, в которой есть скрипт с именем init.lua. Это для всех библиотек так работает, библиотека это либо один файл, либо папка с файлом init.lua.
Я бы хотел что бы у моего скрипта было все в 1 папке и было в 1 папке бибилотеки, которую я специально выделил. Я перенес три вот файла () mime.lua, socket.lua, ltn12.lua, и добавил вот эту строчку в мой скрипта
Код
if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.lua') == nil then
package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.lua;'
end;
И скрипт начал работать. Но как мне быть с папками mime/, и soket/ Если я их переношу, они перестают работать. Я бы тоже хотел их перенести в папку моего скрипта.
Торговый привод на Lua:
Пользователь
Сообщений: Регистрация: 21.08.2015
17.12.2021 17:57:35
Иван, а если в вашей добавленной строчке убрать расширения
Код
if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?') == nil then
package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?;'
end;
Пользователь
Сообщений: Регистрация: 27.01.2017
17.12.2021 18:21:32
В папке mime находится dll. За поиск динамических библиотек отвечает путь package.cpath
Его тоже необходимо указать.
Чтобы искать во вложенных папках можно использовать такую маску
для package.path: path .."\\?.lua;"..path.."\\?\\?.lua;"
для package.cpath: path .."\\?.dll;"..path.."\\?\\?.dll;"
Пользователь
Сообщений: Регистрация: 08.05.2020
17.12.2021 18:44:25
Цитата
Nikolay написал: В папке mime находится dll. За поиск динамических библиотек отвечает путь package.cpath
Его тоже необходимо указать.
Чтобы искать во вложенных папках можно использовать такую маску
для package.path: path .."\\?.lua;"..path.."\\?\\?.lua;"
для package.cpath: path .."\\?.dll;"..path.."\\?\\?.dll;"
Ооо! Спасибо большое Вам. Заработало наконец-то после добавления пути "package.cpath"
Код
if string.find(package.path, getScriptPath()..'\\EnterTradeLib\\socket\\?.lua') == nil then
package.path=package.path..';'..getScriptPath()..'\\EnterTradeLib\\socket\\?.lua;'
package.cpath=package.cpath..';'..getScriptPath()..'\\EnterTradeLib\\socket\\?.dll;'
end;
w32 = require("w32");
http = require("socket.http");