@Proritsatel

Как отправить данные при нажатии кнопки в телеграм-боте python?

Всем привет!
У меня имеется код который отправляет данные через телеграм-бота в группу телеграм, используя API-ключ
import OpenOPC
import time
import requests
###################################################
react_temp = int(input("Введите температуру слоя реактора (целое число): "))
r_tmp_lim = int(input("Введите допустимое отклонение температур реактора (+- x градусов, целое число): "))
###################################################
def send_telegram(text: str):
    token = "1854430581:AAFupZdsev5kfmwKDLe9OPdwan210gX0p4o"
    url = "https://api.telegram.org/bot"
    channel_id = "@newOilPlant"
    url += token
    method = url + "/sendMessage"

    r = requests.post(method, data={
         "chat_id": channel_id,
         "text": text
          })
    if r.status_code != 200:
        raise Exception("post_text error")
###################################################
opc = OpenOPC.client()
servers = opc.servers()
opc.connect("Owen.OPCNet.DA.1")
print("Удачное подключение к " + servers[0])
#--------------------------------------------------------------------------------------------------------#
tagsValue = [];
# Тр-ра Верх
tagsValue.append(opc.list("COM4.TRM_202(adr=104)T_слой_Ср_р-ра.Оперативные параметры")[3])

while True:
    print("-----------------------------------------------------------------------------------------")
    try:
        ############################################################
        # Проверка температур слоя реактора
        val = opc.read(tagsValue, update=1, include_error=True)
        if int(val[0][1]) > (react_temp + r_tmp_lim) or int(val[1][1]) > (react_temp + r_tmp_lim) or int(val[2][1]) > (react_temp + r_tmp_lim):
            try:
                #print("here")
                send_telegram("Слой реактора перегрет до {0:.2f} {1:.2f} {2:.2f} С".format(val[0][1], val[1][1], val[2][1]))
            except:
                print("Включите VPN (test 1)")
        if int(val[0][1]) < (react_temp - r_tmp_lim) or int(val[1][1]) < (react_temp - r_tmp_lim) or int(val[2][1]) < (react_temp - r_tmp_lim):
    except:
        print("error read item")
    time.sleep(20)
opc.close()
#---------------------------#

Этот код уже использует бота. Я хотел сделать так, чтобы у бота было меню и при вызове из бота например команды /get_data появлялась кнопка и я мог отправить в диалог пользователя с ботом данные из основного скрипта.
Получается так, что у меня либо работает код с кнопкой, либо основная программа.
import telebot
token = "1203397890:AAF3Z53lbtmCWkXlsxJl4fXRj6Dtcv6TEc0"

bot = telebot.TeleBot(token)

@bot.message_handler(commands=['start'])
def start_message(message):
    keyboard = telebot.types.ReplyKeyboardMarkup(True)
    bot.send_message(message.chat.id, 'Привет!', reply_markup=keyboard)

@bot.message_handler(commands=['get_data'])
def get_data(message):
    markup = telebot.types.InlineKeyboardMarkup()
    markup.add(telebot.types.InlineKeyboardButton(text='Получить данные', callback_data=3))
    bot.send_message(message.chat.id, text="Что вы хотите сделать?", reply_markup=markup)

@bot.callback_query_handler(func=lambda call: True)
def query_handler(call):
    #bot.answer_callback_query(callback_query_id=call.id, text='Спасибо за честный ответ!')
    answer = ''
    if call.data == '3':
        answer = '...Тут будут данные...'
    bot.send_message(call.message.chat.id, answer)

bot.polling()

Если я добавляю bot.polling() у меня работает только диалог с ботом, если я убираю bot.polling(), то у меня работает основной код, но не работает бот.
Как решить данную проблему?
  • Вопрос задан
  • 603 просмотра
Решения вопроса 1
@Proritsatel Автор вопроса
Я переделал свой код как посоветовал коллега сверху. Добавил два потока и всё заработало
opc = OpenOPC.client()
servers = opc.servers()
opc.connect("Owen.OPCNet.DA.1")
print("Удачное подключение к " + servers[0])
#--------------------------------------------------------------------------------------------------------#
tagsValue = [];
# Тр-ра Верх
tagsValue.append(opc.list("COM4.TRM_202(adr=104)T_слой_Ср_р-ра.Оперативные параметры")[3])

def send_mess():
    while True:
    print("-----------------------------------------------------------------------------------------")
    try:
        ############################################################
        # Проверка температур слоя реактора
        val = opc.read(tagsValue, update=1, include_error=True)
        if int(val[0][1]) > (react_temp + r_tmp_lim) or int(val[1][1]) > (react_temp + r_tmp_lim) or int(val[2][1]) > (react_temp + r_tmp_lim):
            try:
                #print("here")
                send_telegram("Слой реактора перегрет до {0:.2f} {1:.2f} {2:.2f} С".format(val[0][1], val[1][1], val[2][1]))
            except:
                print("Включите VPN (test 1)")
        if int(val[0][1]) < (react_temp - r_tmp_lim) or int(val[1][1]) < (react_temp - r_tmp_lim) or int(val[2][1]) < (react_temp - r_tmp_lim):
    except:
        print("error read item")
    time.sleep(20)
    opc.close()
#---------------------------#

thrd_send_mess = threading.Thread(target=send_mess)
thrd_send_mess.start()

thrd_run_setting = threading.Thread(target=run_setting)
thrd_run_setting.start()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@del4pp
Потому что у вас в коде есть вечный цыкл (While True).
Если хотите чтобы работало и то и то - вам нужно создать функцию, в нее поместить код
###################################################
opc = OpenOPC.client()
servers = opc.servers()
opc.connect("Owen.OPCNet.DA.1")
print("Удачное подключение к " + servers[0])
#--------------------------------------------------------------------------------------------------------#
tagsValue = [];
# Тр-ра Верх
tagsValue.append(opc.list("COM4.TRM_202(adr=104)T_слой_Ср_р-ра.Оперативные параметры")[3])

while True:
    print("-----------------------------------------------------------------------------------------")
    try:
        ############################################################
        # Проверка температур слоя реактора
        val = opc.read(tagsValue, update=1, include_error=True)
        if int(val[0][1]) > (react_temp + r_tmp_lim) or int(val[1][1]) > (react_temp + r_tmp_lim) or int(val[2][1]) > (react_temp + r_tmp_lim):
            try:
                #print("here")
                send_telegram("Слой реактора перегрет до {0:.2f} {1:.2f} {2:.2f} С".format(val[0][1], val[1][1], val[2][1]))
            except:
                print("Включите VPN (test 1)")
        if int(val[0][1]) < (react_temp - r_tmp_lim) or int(val[1][1]) < (react_temp - r_tmp_lim) or int(val[2][1]) < (react_temp - r_tmp_lim):
    except:
        print("error read item")
    time.sleep(20)
opc.close()
#---------------------------#


и запустить функцию в потоке (Потоки)

Код выполняеться сверху в низ, и без бот.полинга код останавливаеться на вечном цыкле, если используете бот.полинг - программа срабатывает на хендлер
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы