|
Telegram lua api for pilot, управление пилотом через телеграм |
|
|
Madeus |
8.8.2022, 20:54
|

    
Journeyman
Сообщений: 317
Регистрация: 19.11.2019 Группа: Пользователи Наличность: 10857
Пользователь №: 19.451
Возраст: 32

|
За основу взят telegram-bot-lua и внесены фиксы для реалий пилота. Исправлены ошибки появившиеся в связи с даунгрейдом lua, оригинал написан под lua 5.3, в пилоте lua 5.1. Добавлена поддержка кириллицы в кодировке win1251 для пилота. Добавлена поддержка lua-cjson, в оригинале используется dkjson, делал для себя желающие могут откатиться, исходник есть в архиве. Так же прилагаются все необходимые библиотеки для работы включая ssl 32 bit. Для использования вам понадобятся: - телеграм
- token бота зарегистрированный через @BotFather
- ваш chat id узнать его можно через множество ботов например тут @getmyid_bot
Распаковать в корень папки пилота. Примеры использования. Отправить боту сообщение / фото / файл. Можно использовать как информационные сообщения о состоянии вашего скрипта Пример 1
Код --lua local api = require('telegram.core').configure(TOKEN) -- вместо TOKEN указываем свой полученный в @BotFather local chat_id = CHAT_ID -- вместо CHAT_ID указываем свой, узнать можно с помощью ботов коих немало в сети
api.send_message(chat_id, 'Hello bot') -- отправить сообщение api.send_photo(chat_id, [[c:\photo.jpg]]) -- отправить фото api.send_document(chat_id, [[c:\file.txt]]) -- отправить файл В следующем примере полноценный бот по задумке открывается в нулевой "0" вкладке (можно запускать пилот с флагом /r0 для автоматического запуска бота. "с:\uopilot\uopilot.exe" /r0). Умеет: - Запускать, останавливать скрипты, так же показывать их текущий статус
- Присылать лог в виде сообщения или текстового файла (для файла необходимо раскоментировать строку)
- Делать скриншот экрана и присылать его в виде фото
- Закрывать окна программ по заголовку(имени) окна. Необходимо отправить боту сообщение вида Terminate #имя окна#, например Terminate Блокнот
Пример бот
Код --lua local api = require('telegram.core').configure(TOKEN) -- вместо TOKEN указываем свой полученный в @BotFather local chat_id = CHAT_ID -- вместо CHAT_ID указываем свой, узнать можно с помощью ботов коих немало в сети
local function start_keyboard() local keyboard = {['inline_keyboard'] = {{}}} local count_scipts = scripts() local row = 1 local count = 0 for i = 2, #count_scipts do count = count + 1 if count == 8 then row = row + 1 table.insert(keyboard.inline_keyboard, {}) count = 0 end table.insert(keyboard.inline_keyboard[row], {['text'] = count_scipts[i][1], ['callback_data'] = 'Start ' .. count_scipts[i][1]}) end return keyboard end
local function stop_keyboard() local keyboard = {['inline_keyboard'] = {{}}} local count_scipts = scripts() local row = 1 local count = 0 for i = 2, #count_scipts do count = count + 1 if count == 8 then row = row + 1 table.insert(keyboard.inline_keyboard, {}) count = 0 end table.insert(keyboard.inline_keyboard[row], {['text'] = count_scipts[i][1], ['callback_data'] = 'Stop ' .. count_scipts[i][1]}) end return keyboard end
local function status_keyboard() local keyboard = {['inline_keyboard'] = {{}}} local count_scipts = scripts() local row = 1 local count = 0 for i = 2, #count_scipts do count = count + 1 if count == 8 then row = row + 1 table.insert(keyboard.inline_keyboard, {}) count = 0 end table.insert(keyboard.inline_keyboard[row], {['text'] = count_scipts[i][1], ['callback_data'] = 'Script ' .. count_scipts[i][1] .. ' Status ' .. count_scipts[i][3]}) end return keyboard end
api.send_message(chat_id, 'Pilot online', nil, true, false, nil, api.keyboard():row(api.row():button('Start script'):button('Stop script')):row(api.row():button('Status script'):button('Log')):row(api.row():button('Screenshot')))
local subs = {runing = 'сейчас запущен', stoped = 'сейчас остановлен'}
function api.on_callback_query(callback_query) local script_num, status local message = callback_query.message if callback_query.data:match('Start') then script_num = callback_query.data:match('Start (%d+)') if script_num then api.edit_message_text(message.chat.id, message.message_id, 'Запустил срипт ' .. script_num) start_script(script_num) end elseif callback_query.data:match('Stop') then script_num = callback_query.data:match('Stop (%d+)') if script_num then api.edit_message_text(message.chat.id, message.message_id, 'Остановил скрипт ' .. script_num) stop_script(script_num) end elseif callback_query.data:match('Status') then script_num, status = callback_query.data:match('Script (%d+) Status (%S+)') if script_num and status then api.edit_message_text(message.chat.id, message.message_id, 'Скрипт ' .. script_num .. ' ' .. string.gsub(status, '(%w+)', subs)) end end end
function api.on_message(message) if message.chat.id == chat_id then if message.text and message.text:match('Screenshot') then printscreen (0, 0, 0, 0, 0, 'screen.jpg') api.send_photo(chat_id, 'screen.jpg') elseif message.text and message.text:match('Start script') then api.send_message(message.chat.id, 'Выбери какой скрипт запустить:', nil, true, false, nil, start_keyboard()) elseif message.text and message.text:match('Stop script') then api.send_message(message.chat.id, 'Выбери какой скрипт остановить:', nil, true, false, nil, stop_keyboard()) elseif message.text and message.text:match('Status script') then api.send_message(message.chat.id, 'Выбери какой скрипт проверить:', nil, true, false, nil, status_keyboard()) elseif message.text and message.text:match('Log') then local log_path = 'pilot_log.txt' log('save', log_path) local log_file = io.open(log_path) local log_text = log_file:read('*a') log_file:close() if #log_text > 0 then -- api.send_document(message.chat.id, log_path) -- если нужно отправить файл лога раскоментируй строку api.send_message(message.chat.id, log_text) else api.send_message(message.chat.id, 'Log пустой') end elseif message.text and message.text:match('Terminate') then -- что бы закрыть окно любой программы отправь боту сообщение вида 'Terminate #заголовок окна#' например 'Terminate Блокнот' local terminate_window = message.text:match('Terminate%s+(.+)') if terminate_window then local handle = findwindow(terminate_window) if handle then terminate(terminate_window) api.send_message(message.chat.id, 'Окно ' .. terminate_window .. ' закрыто') else api.send_message(message.chat.id, 'Окно ' .. terminate_window .. ' не найдено') end end end end end
api.run(1, 100)
Прикрепленные файлы
telegram.zip ( 2,83 мегабайт )
Кол-во скачиваний: 321
|
|
|
|
|
  |
Ответов
apaul |
17.11.2022, 0:23
|
 
Neophyte
Сообщений: 36
Регистрация: 19.8.2021 Группа: Пользователи Наличность: 0
Пользователь №: 20.051

|
Цитата(DarkMaster @ 16.11.2022, 20:45)  а обычные сообщения он видит?
Обычные сообщения видит прекрасно, работает стабильно и замечательно (IMG: style_emoticons/default/biggrin.gif) Цитата(Madeus @ 16.11.2022, 22:06)  Вы отправляете файл боту? А цель какая и какой размер файла?
Да, есть желание отправить файл боту. Про ограничение размера в 20Мб я в курсе, мои задачи это покрывает с огромным запасом. Хочу сделать с его помощью возможность удаленной корректировки рабочих файлов проекта пилота, т.е. будет пересылаться архив в 20-30кБ.
|
|
|
|
Сообщений в этой теме
Madeus Telegram lua api for pilot 8.8.2022, 20:54 apaul Добрый день. Подскажите как отправить боту файл, а... 16.11.2022, 18:17 DarkMaster а обычные сообщения он видит? 16.11.2022, 20:45 DarkMaster телеги нет - тестить не могу, но при таких объемах... 17.11.2022, 0:40 Madeus Все стандартно только нужно подключить 2 библы, он... 17.11.2022, 1:57 apaul
Все стандартно только нужно подключить 2 библы,
... 17.11.2022, 18:55 Madeus Обновил архив, заменил cjson.dll по ошибке положил... 24.11.2022, 17:41 TheQQmaster how to config this to capture only 2nd monitor for... 6.1.2023, 3:09 DarkMaster Desktop area have shared coordinates. As example i... 6.1.2023, 12:51 TheQQmaster
Desktop area have shared coordinates. As example ... 6.1.2023, 20:29 Madeus Для мониторов с большим разрешением скрин экрана с... 18.2.2023, 22:15
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|