1 (2021-05-27 14:08:33 отредактировано toxa)

Тема: еще один telegram bot

Этот бот - демонстрация возможностей библиотеки lua_share. Кроме нее, весь код бота написан на lua (за исключением сокетов, json и ssl - все это opensource C + lua библиотеки). ipc_telegram_bot.exe - это переименованный 32-х битный lua_share_server.exe из дистрибутива lua_share. Lua5.1.dll - из дистрибутива lua 5.1.5; libeay32.dll ssleay32.dll - из дистрибутива OpenSSL. Все это собрано вместе для удобства.

Бот позволяет пользователям telegram, в частности, хозяину бота, передавать команды нескольким одновременно запущенным терминалам quik версий 7 и 8, программировать в этих терминалах реакцию на команды. При этом сам скрипт, в котором терминал quik передает и получает сообщения предельно прост и занимает несколько строк.

Бот состоит из скрипта-агента quik_telegram_agent.lua, который запускается в терминалах quik и в котором программируется реакция на команды пользователей и "брокера" - отдельного приложения ipc_telegram_bot.exe, которое аутентифицирует пользователей telegram и маршрутизирует сообщения от пользователей терминалам quik и обратно. Поддерживается общение точка-точка и широковещательные сообщения.

Установка:
------------

[s]1. Зарегистрировать telegram bot, получить его token.

2. Token следует прописать в файле ipc_telegram_bot.lua: в первой строке присвоить переменной telegram_bot_token строковое значение, соответствующее токену.
   
3. Запустить ipc_telegram_bot.exe

4. Запустить quik, предварительно положив в него файлы из каталога quik.

5. Запустить в quik агент quik_telegram_agent.lua

Взаимодействие с ботом:
-----------------------------

Если в телеграме подключиться к боту и послать в него "hello", то пользователь становится "залогинен" (для секурности слово "hello" можно заменить на какой-то уникальный пароль). После этого, все сообщения будут транслироваться во все терминалы quik, в которых запущен скрипт quik_telegram_agent.lua.

Каждый из этих терминалов будет отвечать пользователю на его сообщение сообщением "received: <сообщение пользователя>", а так же выводить id пользователя и текст сообщения в таблицу "системные сообщения". Кроме того, терминалы будут рассылать всем "залогиненным" клиентам статус своего соединения.

Это просто демонстрационный пример. Ничего "полезного" кроме рассылки статуса соединения quik_telegram_agent.lua не делает. Пользователь должен сам запрограммировать желаемое поведение бота.

Дистрибутив:
---------------
https://www.dropbox.com/s/852tk2yoif56w … 4.zip?dl=0

2 (2019-12-04 19:25:55 отредактировано toxa)

Re: еще один telegram bot

Поправил немножко кодировки, сделал перекодирование в utf8 в ansi и обратно, так как в quik родная кодировка все же ansi.

можно сделать отправку новостей в телеграм из окна "новости". quik_telegram_agent.lua между функциями sendconnectionstatus() и main() я добавил следующий код:

ml = require "lua_multilist"
last_news_id = nil
function sendnews()
    if news_table_handle == nil then news_table_handle = ml.find_table('\205\238\226\238\241\242\232') end -- "Новости" window caption
    if news_table_handle ~= nil then
        local i = 1
        local id = nil
        repeat
            local row = ml.get_row(news_table_handle, i)
            if row ~= nil then
                if id == nil then id = row[5] end
                if last_news_id ~= row[5] then 
                    tsq["telegram_queue"] = {quik_id = current_quik_id, message = row[2] .. " " .. row[3] .. ": " .. row[4]}
                    if (i >= 15) then row = nil end
                else
                    row = nil                
                end
                i = i + 1
            end 
        until row == nil
        if id ~= nil then last_news_id = id end
    end
end

и в main() я добавил вызов этой функции раз в 5 секунд, в блок условия, где комментарий "-- ping quik connection every 5 seconds..." эта функция проверяет окно "Новости" на появление новых строк сверху, и отправляет 15 новых новостей, или меньше, если появилось меньше. проверка производится по значению поля "Номер", куда quik записывает уникальный номер новости.
в настройках окна "Новости" (ctrl-E) нужно убрать галку "показывать статистику", так как ml.find_table() не умеет искать в заголовках окон по маске.

библиотека lua_multilist тут: https://www.dropbox.com/s/oz29t9wxygryo … s.zip?dl=0

3

Re: еще один telegram bot

toxa пишет:

Поправил немножко кодировки, сделал перекодирование в utf8 в ansi и обратно, так как в quik родная кодировка все же ansi.

можно сделать отправку новостей в телеграм из окна "новости". quik_telegram_agent.lua между функциями sendconnectionstatus() и main() я добавил следующий код:

ml = require "lua_multilist"
last_news_id = nil
function sendnews()
    if news_table_handle == nil then news_table_handle = ml.find_table('\205\238\226\238\241\242\232') end -- "Новости" window caption
    if news_table_handle ~= nil then
        local i = 1
        local id = nil
        repeat
            local row = ml.get_row(news_table_handle, i)
            if row ~= nil then
                if id == nil then id = row[5] end
                if last_news_id ~= row[5] then 
                    tsq["telegram_queue"] = {quik_id = current_quik_id, message = row[2] .. " " .. row[3] .. ": " .. row[4]}
                    if (i >= 15) then row = nil end
                else
                    row = nil                
                end
                i = i + 1
            end 
        until row == nil
        if id ~= nil then last_news_id = id end
    end
end

и в main() я добавил вызов этой функции раз в 5 секунд, в блок условия, где комментарий "-- ping quik connection every 5 seconds..." эта функция проверяет окно "Новости" на появление новых строк сверху, и отправляет 15 новых новостей, или меньше, если появилось меньше. проверка производится по значению поля "Номер", куда quik записывает уникальный номер новости.
в настройках окна "Новости" (ctrl-E) нужно убрать галку "показывать статистику", так как ml.find_table() не умеет искать в заголовках окон по маске.

библиотека lua_multilist тут: https://www.dropbox.com/s/oz29t9wxygryo … s.zip?dl=0


Добрый день. Подскажите, а каким образом можно «обучить» бота высылать мне информацию о факте выставления заявок, стопов и тп ?

4

Re: еще один telegram bot

ну, надо дописать соответствующие обработчики.

5 (2021-04-18 19:35:18 отредактировано iforts)

Re: еще один telegram bot

Вроде все сделал как описано, сообщения из бота приходят в сервер, но при запуске агента в квик выдал ACCESS .. V.. и квик зависает, что не так?
Квик 8.7.1.3 и 8.6

6

Re: еще один telegram bot

Все разобрался заменил на  lua_share/dll в папке quik8 на  lua_share.dll из папки quik8.5 работает! Спасибо toxa!

7

Re: еще один telegram bot

Но что характерно, сообщение отправленное из телеги почвилось в квиковском окне только один раз и все, при дальнейшей отправке больше не появлялось

8 (2021-04-18 22:56:03 отредактировано iforts)

Re: еще один telegram bot

хотя в окне сервера все появляется

9

Re: еще один telegram bot

После первого сообщения сервер пишет error script loading failed: table index is nil
И все после этого в квике сообщения не появляются, в окне сервера появляются

10

Re: еще один telegram bot

нельзя заменять только одну lua_share.dll, нужно апдейтить весь комплект. там в какой-то момент поменялся протокол IPC.

11

Re: еще один telegram bot

Обновленная версия бота на 5.3 х64
https://drive.google.com/file/d/1mN7bdS … sp=sharing

12

Re: еще один telegram bot

Андрей_ пишет:

Обновленная версия бота на 5.3 х64
https://drive.google.com/file/d/1mN7bdS … sp=sharing

Шикарная вещь. Вечером начну тесты ))

А для обывателя, какие действия можно и как программировать?
Спасибо

13

Re: еще один telegram bot

Андрей_ пишет:

Обновленная версия бота на 5.3 х64

ну, наверное, стоило и квиковую часть тоже положить в архив. вот моя версия: https://www.dropbox.com/s/852tk2yoif56w … 4.zip?dl=0

ссылку в первом посте тоже обновлю.

14 (2021-05-27 14:19:48 отредактировано toxa)

Re: еще один telegram bot

Skyspirit пишет:

А для обывателя, какие действия можно и как программировать?

вот тут:

            if data ~= nil then
                -- reply message back to user
                tsq["telegram_queue"] = {quik_id = current_quik_id, quik_alive = true, user_id = data.user_id, message = "received: " .. tostring(data.message)}
                -- dump message to messages table
                message(table.tostring(data), 1)
            end

пишите свои обработчики, типа такого:

            if data ~= nil then
                local command = data.message:lower()
                if command == 'login' then
                    tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = manage_quik_connection(true)}
                elseif command == 'logout' then
                    tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = manage_quik_connection(false)}
                elseif command == 'news start' then
                    news_poll_enabled = true
                    tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = "news polling started"}
                elseif command == 'news stop' then
                    news_poll_enabled = false
                    tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = "news polling stopped"}
                else
                    -- reply message back to telegram user
                    tsq["telegram_queue"] = {quik_id = current_quik_id, quik_alive = true, user_id = data.user_id, message = "received: " .. tostring(data.message)}
                    -- dump message to messages table
                    message("user: " .. tostring(data.user_id) .. " message: " .. tostring(data.message), 1)
                end
            end

таблица data - это то, что к вам прилетело из телеграма: от кого и текст.

чтобы отправить ответ надо послать свою таблицу:

 
tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = "some reply text"}

там нужно заполнить поля кому и текст, а так же уникальный идентификатор. он нужен, потому что брокер ipc_telegram_bot.exe может обслуживать сразу несколько одновременно запущенных квиков.

15 (2021-05-27 14:34:41 отредактировано toxa)

Re: еще один telegram bot

ps: если надо разослать всем, кто подключен в телеграм канале, то user_id не указывается.

16

Re: еще один telegram bot

toxa пишет:
Skyspirit пишет:

А для обывателя, какие действия можно и как программировать?

вот тут:

            if data ~= nil then
                -- reply message back to user
                tsq["telegram_queue"] = {quik_id = current_quik_id, quik_alive = true, user_id = data.user_id, message = "received: " .. tostring(data.message)}
                -- dump message to messages table
                message(table.tostring(data), 1)
            end

пишите свои обработчики, типа такого:

            if data ~= nil then
                local command = data.message:lower()
                if command == 'login' then
                    tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = manage_quik_connection(true)}
                elseif command == 'logout' then
                    tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = manage_quik_connection(false)}
                elseif command == 'news start' then
                    news_poll_enabled = true
                    tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = "news polling started"}
                elseif command == 'news stop' then
                    news_poll_enabled = false
                    tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = "news polling stopped"}
                else
                    -- reply message back to telegram user
                    tsq["telegram_queue"] = {quik_id = current_quik_id, quik_alive = true, user_id = data.user_id, message = "received: " .. tostring(data.message)}
                    -- dump message to messages table
                    message("user: " .. tostring(data.user_id) .. " message: " .. tostring(data.message), 1)
                end
            end

таблица data - это то, что к вам прилетело из телеграма: от кого и текст.

чтобы отправить ответ надо послать свою таблицу:

 
tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = "some reply text"}

там нужно заполнить поля кому и текст, а так же уникальный идентификатор. он нужен, потому что брокер ipc_telegram_bot.exe может обслуживать сразу несколько одновременно запущенных квиков.


Спасибо. Надо покрутить мне.

Затея, вообщем в том, чтобы:
1. При соединении, я бы понимал баланс в разрезе каждого счета, НРП1, НРП2, чтобы МК ко мне не пришёл.
2. Происходит покупка / продажа. Мне надо высчитать профит/ убыток сделки и баланс по счету.
И всё это в Телеграмм.

Реально, как думаете?

17

Re: еще один telegram bot

да, это довольно просто

18 (2021-05-30 19:13:43 отредактировано Skyspirit)

Re: еще один telegram bot

toxa пишет:

да, это довольно просто


Видимо, не судьба мне запустить идею)

Я с установкой не могу разобраться... Вроде, запустил, ошибок нет, на "hello" ни реакции.

Quik 8.8, токен в файле ipc_telegram_bot указал.

https://i.ibb.co/B2yyVnc/2021-05-30-17-46-05.png

19

Re: еще один telegram bot

ну а что пишется в окне ipc_telegram_bot.exe ? сообщения из телеграма сначала приходят в него и только потом в квик

20

Re: еще один telegram bot

toxa пишет:

ну а что пишется в окне ipc_telegram_bot.exe ? сообщения из телеграма сначала приходят в него и только потом в квик

Ничего не пишет. Появляется и сворачивается быстро. Win 10, 64

21

Re: еще один telegram bot

Skyspirit пишет:

Ничего не пишет. Появляется и сворачивается быстро. Win 10, 64

ну, чего-то ему не хватает. нужно запустить в командной строке и посмотреть что пишет.

22

Re: еще один telegram bot

toxa пишет:
Skyspirit пишет:

Ничего не пишет. Появляется и сворачивается быстро. Win 10, 64

ну, чего-то ему не хватает. нужно запустить в командной строке и посмотреть что пишет.

lua_telegram 3\x64_ipc_telegram_bot>ipc_telegram_bot.exe
IPC x64 server started
error: script loading failed: error loading module 'socket.core' from file './scripts/socket\core.dll':
        Не найден указанный модуль.

done!

23 (2021-05-31 16:37:14 отредактировано toxa)

Re: еще один telegram bot

поставьте вот это (vc_redist.x64.exe): https://www.microsoft.com/ru-ru/downloa … x?id=48145

24

Re: еще один telegram bot

toxa пишет:

поставьте вот это (vc_redist.x64.exe): https://www.microsoft.com/ru-ru/downloa … x?id=48145

IPC x64 server started
error: script loading failed: ...lua_telegram 3\x64_ipc_telegram_bot\ipc_telegram_bot.lua:54: bad argument #1 to 'for iterator' (table expected, got nil)

25

Re: еще один telegram bot

похоже токен кривой