Я разрабатываю бота для телеграмм, который работает с сообщениями чата, встроенными кнопками и встроенным запросом
Я сталкиваюсь с некоторыми проблемами, связанными с тем, чтобы сообщения чата работали хорошо, при одновременной реализации встроенного запроса.
На данный момент все работает хорошо, кроме сообщений чата, если пользователь отправит сообщение чата, бот получит его, но если пользователь отправит другое сообщение чата до истечения времени ожидания (10 секунд), бот может не перехватывайте его.
Возможно, в DelegatorBot
я установил некоторые неправильные параметры. Или, может быть, аргументы класса MsgWriten
неверны.
Я прикреплю «скелетный» код бота с моей конфигурацией ниже, это довольно просто c, если вы отправите /start
это ответит сообщением и кнопкой, если вы нажмете на кнопку, она покажет вам уведомление, и если вы вызовете запрос в строке, он ответит вам.
Настоящая проблема заключается в том, что вы отправляете случайный чат сообщение, оно должно отвечать вам на каждое сообщение чата, но, как я уже говорил, оно ответит вам, просто если вы подождете 10 секунд.
Вот код:
import time
import telepot
from telepot.loop import MessageLoop
from telepot.delegate import pave_event_space, per_chat_id, create_open, \
include_callback_query_chat_id, per_inline_from_id
from telepot.namedtuple import InlineKeyboardMarkup, InlineKeyboardButton
from telepot.namedtuple import InlineQueryResultArticle, InputTextMessageContent
import settings
class MsgWriten(telepot.helper.InlineUserHandler, telepot.helper.AnswererMixin):
def __init__(self, *args, **kwargs):
super(MsgWriten, self).__init__(*args, **kwargs)
print(self)
self._count = 0
def on_chat_message(self, msg):
global messages_ids
content_type, chat_type, chat_id = telepot.glance(msg)
print('Chat message: ', content_type, chat_type, chat_id)
if content_type == 'text':
txt = msg['text']
keyboard = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text='Query data text 1',
parse_mode='Markdown',
callback_data='test1')]
])
if txt.startswith('/start'):
bot.sendMessage(chat_id, 'Start command', reply_markup=keyboard)
else:
bot.sendMessage(chat_id, text=txt)
def on_callback_query(self, msg):
global messages_ids
query_id, chat_id, query_data = telepot.glance(msg, flavor='callback_query')
print('Callback query:', query_id, chat_id, query_data)
if query_data == 'test1':
bot.answerCallbackQuery(query_id, text='Query data text 1')
def on_inline_query(self, msg):
def compute():
query_id, from_id, query_string = telepot.glance(msg, flavor='inline_query')
print('Computing for: %s' % query_string)
articles = [InlineQueryResultArticle(
id='abcde', title='Telegram',
input_message_content=InputTextMessageContent(message_text='Telegram is a messaging app')),
dict(type='article',
id='fghij', title='Google', input_message_content=dict(message_text='Google is a search engine'))]
return articles
self.answerer.answer(msg, compute)
def on_chosen_inline_result(self, msg):
result_id, from_id, query_string = telepot.glance(msg, flavor='chosen_inline_result')
print('Chosen Inline Result:', result_id, from_id, query_string)
TOKEN = sys.argv[1] # get token from command-line
bot = telepot.DelegatorBot(TOKEN, [
include_callback_query_chat_id(
pave_event_space())(
per_chat_id(), create_open, MsgWriten, timeout=10),
pave_event_space()(
per_inline_from_id(), create_open, MsgWriten, timeout=10)
])
MessageLoop(bot).run_as_thread()
while 1:
time.sleep(10)
Как я сказал это не мой настоящий бот, это просто скелет для некоторых тестов. Цель состоит в том, чтобы иметь возможность перехватывать сообщения чата, даже если пользователь отправлял их очень быстро, а также обеспечивать возможность выполнения обратных вызовов и встроенных запросов.
Спасибо