Как все таки сделать http запрос из Lua?

Страницы: 1
RSS
Как все таки сделать http запрос из Lua?
 
Привет всем!
Как все таки отправить 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

Вот пост где автор опубликовал этого робота с описанием что он делает
https://smart-lab.ru/blog/401675.php
 
Цитата
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

Вот пост где автор опубликовал этого робота с описанием что он делает
https://smart-lab.ru/blog/401675.php

Очень актуален вопрос 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: https://github.com/iv-litovchenko/Quik-Enter-Trade
 
Вот даже из этого работающего примера я не пойму
- зачем нужно ставить дополнительную программу (ну это еще ладно)
- ну если мы ее поставил - зачем еще какие-то 2 папки закидывать в luaindicators?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
 
Что значит зачем. Lua не имеет встроенной поддержки web soсket. Поэтому необходимы библиотеки (а не программы), чтобы сие действие стало доступно.
Ссылки на сборки библиотек недавно обсуждались.
 
Цитата
Nikolay написал:
Что значит зачем. Lua не имеет встроенной поддержки web soсket. Поэтому необходимы библиотеки (а не программы), чтобы сие действие стало доступно.
Ссылки на сборки библиотек недавно обсуждались.
Не могу понять что нужно скачать и что закинуть в папку моего скрипта?
Мне помогла эта тема: https://coderoad.ru/48035241/%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B­%D0%B9-%D1%81%D0%BE%D0%...

Я закинул по списку данные файлы в папку C:/Quik/Luaindicators/
Код
Release
├── socket
│   ├── ftp.lua
│   ├── http.lua
│   ├── smtp.lua
│   ├── tp.lua
│   └── url.lua
├── mime
│   └── core.dll
├── ltn12.lua
├── mime.lua
├── socket.dll    <--- renamed from $(LUA_PATH)\clibs\socket\core.dll
├── socket.lua
├── lua5.1.dll
├── sample.exe
└── sample.lua
И у меня все работает.
Но я бы хотел все это закинуть в папку моего скрипта:

Когда я закидываю все это в папку моего скрипта: C:\QUIK\LuaIndicators\QET\EnterTradeLib\lua\
Это перестает работать: Quik при запуске скрипта пишет:
Что не находит таких библиотек.

Как их в эту папку засунуть?
Скрипты подключаю так:
Код
w32 = require("w32"); -> вот что интересно это лежит в папке C:\QUIK\LuaIndicators\QET\EnterTradeLib\ и квик его находит
http = require("socket.http"); -> а это нет... находит только когда это лежит в папке C:/Quik/Luaindicators/
Сори за множество вопросов - но здесь в луа реально не так как в PHP с его наймспейсами и прочими фишками...
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
 
Чтобы скрипт нашел библиотеку в каталогах отличных от предопределенных, необходимо дополнить путь искателя

Можно напрямую указать:

package.path=package.path..';C:\QUIK\LuaIndicators\QET\EnterTradeLib\\\?.lua;'

require же должен знать где искать файлы.
 
Цитата
Nikolay написал:
Чтобы скрипт нашел библиотеку в каталогах отличных от предопределенных, необходимо дополнить путь искателя

Можно напрямую указать:

package.path=package.path..';C:\QUIK\LuaIndicators\QET\EnterTradeLib\\\?.lua;'

require же должен знать где искать файлы.
Моя идея положить эти библиотеки в папку моего скрипта, но когда я так делаю они перестают работать, работают только когда все добро размещено в папке: 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 папки и несколько файлов. https://disk.yandex.ru/d/qRNTqf562u3g8Q
Не пойму что я не правильно делаю.
Квик пишет
Код
...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: https://github.com/iv-litovchenko/Quik-Enter-Trade
 
Иван, непонятно, чего вы уцепились за папку 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;
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
 
Цитата
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/
Если я их переношу, они перестают работать.
Я бы тоже хотел их перенести в папку моего скрипта.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
 
Иван,  а если в вашей добавленной строчке убрать расширения
Код
if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?') == nil then
   package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?;'
end;
 
В папке mime находится dll. За поиск динамических библиотек отвечает путь package.cpath

Его тоже необходимо указать.

Чтобы искать во вложенных папках можно использовать такую маску

для package.path:      path .."\\?.lua;"..path.."\\?\\?.lua;"

для package.cpath:    path .."\\?.dll;"..path.."\\?\\?.dll;"
 
Цитата
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");
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Страницы: 1
Читают тему
Наверх