Привет всем! Как все таки отправить HTTP запрос из Lua(Quik)? Я пытаюсь использовать LuaSocket ,но Quik в упор не видит эту библиотеку куда бы я ему ее не положил. Какие шаманские обряды нужно провести,чтобы сие чудо заработало.https://github.com/diegonehab/luasocket
Когда-то скачал робота, который заходит на сайт Смарт Лаб и считывает с него календарь дивидендов, сигналит в КВИК если завтра ожидается дивидендный гэп. Сейчас скрипт не работает, потому что смарт лаб поменял вёрстку дивидендной страницы, но раньше я этот скрипт запускал и всё работало.
Код
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
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? Спасибо.
Вот даже из этого работающего примера я не пойму - зачем нужно ставить дополнительную программу (ну это еще ладно) - ну если мы ее поставил - зачем еще какие-то 2 папки закидывать в luaindicators?
Что значит зачем. Lua не имеет встроенной поддержки web soсket. Поэтому необходимы библиотеки (а не программы), чтобы сие действие стало доступно. Ссылки на сборки библиотек недавно обсуждались.
Nikolay написал: Что значит зачем. Lua не имеет встроенной поддержки web soсket. Поэтому необходимы библиотеки (а не программы), чтобы сие действие стало доступно. Ссылки на сборки библиотек недавно обсуждались.
И у меня все работает. Но я бы хотел все это закинуть в папку моего скрипта:
Когда я закидываю все это в папку моего скрипта: C:\QUIK\LuaIndicators\QET\EnterTradeLib\lua\ Это перестает работать: Quik при запуске скрипта пишет: Что не находит таких библиотек.
Как их в эту папку засунуть? Скрипты подключаю так:
Код
w32 = require("w32"); -> вот что интересно это лежит в папке C:\QUIK\LuaIndicators\QET\EnterTradeLib\ и квик его находит
http = require("socket.http"); -> а это нет... находит только когда это лежит в папке C:/Quik/Luaindicators/
Сори за множество вопросов - но здесь в луа реально не так как в PHP с его наймспейсами и прочими фишками...
Моя идея положить эти библиотеки в папку моего скрипта, но когда я так делаю они перестают работать, работают только когда все добро размещено в папке: 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"); -> а вот это не находится когда я размещаю в папку моего скрипта
...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
Иван, непонятно, чего вы уцепились за папку 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.
Уже и так даже попробовал и все равно не работает, если поместить это все в папку моего скрипта:
Код
-- 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;
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 папке бибилотеки, которую я специально выделил. Я перенес три вот файла (https://disk.yandex.ru/d/qRNTqf562u3g8Q) 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/ Если я их переношу, они перестают работать. Я бы тоже хотел их перенести в папку моего скрипта.
Иван, а если в вашей добавленной строчке убрать расширения
Код
if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?') == nil then
package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?;'
end;