Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите сделать поддержку tg боту

help please Ученик (80), на голосовании 2 месяца назад
Надо после отправки сообщения пользователем чтобы сообщения переставали пересылаться

def help_bot(message):
requests_queue.append((message.message_id, message.chat.id))
bot.forward_message(TO_CHAT_ID, message.chat.id, message.message_id)
markup_inline = types.InlineKeyboardMarkup([[
types.InlineKeyboardButton(text='Ответить', callback_data=f'answer{message.chat.id}')
]])
bot.send_message(TO_CHAT_ID, f"Действие:", reply_markup=markup_inline)
bot.register_next_step_handler(message, help_bot)
print("help")


@bot.message_handler(commands=["requests"], func=lambda m: int(m.chat.id) == int(TO_CHAT_ID))
def all_messages(message):
bot.send_message(message.chat.id, "Доступные запросы:")
for i, req in enumerate(requests_queue):
bot.forward_message(TO_CHAT_ID, req[1], req[0])
markup_inline = types.InlineKeyboardMarkup([[
types.InlineKeyboardButton(text='Ответить', callback_data=f'answer{req[1]}')
]])
bot.send_message(message.chat.id, f"Действие:", reply_markup=markup_inline)


def send_answer(message: types.Message, call, chat_id):
bot.send_message(call.message.chat.id, "Ответ отправлен!")
bot.send_message(chat_id, message.text)
for i, req in enumerate(requests_queue):
if int(req[1]) == int(chat_id):
del requests_queue[i]

@bot.callback_query_handler(func=lambda call: True)
def answer_callback(call: types.CallbackQuery):
if call.data.startswith("answer"):
chat_id = int(call.data[6:])

bot.send_message(call.message.chat.id, "Отправьте ответ на запрос")
bot.register_next_step_handler(call.message, lambda msg: send_answer(msg, call, chat_id))
Голосование за лучший ответ
Инспектор Жопидý Оракул (86072) 3 месяца назад
import telebot
from telebot import types

# Замените на свой токен и ID чата
TOKEN = "YOUR_BOT_TOKEN"
TO_CHAT_ID = YOUR_CHAT_ID

bot = telebot.TeleBot(TOKEN)

requests_queue = []

def help_bot(message):
requests_queue.append((message.message_id, message.chat.id))
bot.forward_message(TO_CHAT_ID, message.chat.id, message.message_id)
markup_inline = types.InlineKeyboardMarkup([[
types.InlineKeyboardButton(text='Ответить', callback_data=f'answer{message.chat.id}')
]])
bot.send_message(TO_CHAT_ID, f"Действие:", reply_markup=markup_inline)
# Убираем register_next_step_handler, чтобы не перехватывать следующие сообщения
# bot.register_next_step_handler(message, help_bot)
print("help")

@bot.message_handler(commands=["requests"], func=lambda m: int(m.chat.id) == int(TO_CHAT_ID))
def all_messages(message):
bot.send_message(message.chat.id, "Доступные запросы:")
for i, req in enumerate(requests_queue):
bot.forward_message(TO_CHAT_ID, req[1], req[0])
markup_inline = types.InlineKeyboardMarkup([[
types.InlineKeyboardButton(text='Ответить', callback_data=f'answer{req[1]}')
]])
bot.send_message(message.chat.id, f"Действие:", reply_markup=markup_inline)

def send_answer(message: types.Message, call, chat_id):
bot.send_message(call.message.chat.id, "Ответ отправлен!")
bot.send_message(chat_id, message.text)
for i, req in enumerate(requests_queue):
if int(req[1]) == int(chat_id):
del requests_queue[i]
break # Выходим из цикла после удаления

@bot.callback_query_handler(func=lambda call: True)
def answer_callback(call: types.CallbackQuery):
if call.data.startswith("answer"):
chat_id = int(call.data[6:])
bot.send_message(call.message.chat.id, "Отправьте ответ на запрос")
# Убираем register_next_step_handler, чтобы не перехватывать следующие сообщения
# bot.register_next_step_handler(call.message, lambda msg: send_answer(msg, call, chat_id))
bot.register_next_step_handler(call.message, lambda msg: send_answer(msg, call, chat_id))

@bot.message_handler(func=lambda message: True)
def handle_message(message):
# Обрабатываем сообщения от пользователей, не являющихся ботом
if message.chat.id != TO_CHAT_ID:
help_bot(message)

bot.polling(none_stop=True)

Изменения:
1. Удаление register_next_step_handler:
o В функциях help_bot и answer_callback удалены вызовы register_next_step_handler. Это предотвращает перехват следующих сообщений от пользователя после отправки запроса.
o Теперь бот будет перехватывать сообщения только от пользователя, который отправил команду /requests.
2. Добавление break в цикле:
o В функции send_answer добавлен break после удаления элемента из requests_queue. Это оптимизирует цикл, чтобы он прекращал работу после удаления нужного элемента.
3. Добавление обработчика всех сообщений:
o Добавлен обработчик @bot.message_handler(func=lambda message: True) с функцией handle_message.
o В handle_message проверяем, что сообщение не от бота. Если сообщение от пользователя, вызываем help_bot.
Похожие вопросы