Я использую telegram bot api, и мой бот показывает изображение пользователю, и пользователь должен ответить с ответом.
Я заметил ошибку из-за команды /start
. Каждый раз, когда запускается команда /start
, я отправляю изображение и текст, который запускает новую игру.
Но мне нужно получить ответ для этого изображения и сохранить его в списке (или в каком-то другом виде). структуры данных). Но я не могу получить ответ до тех пор, пока пользователь не отправит ответ, который будет следующим обновлением, в котором все сдвигается, поэтому для первого и второго изображений я получаю что-то вроде этого ниже:
>>> [['first-image', '/start']]
>>> [['first-image', '/start', ['second-image', 'this results is for first-image']] # can be seen here that the second image result is actually meant for the first.
Я в настоящее время сделал способ сдвига, чтобы получить правильные ответы соответствия. Получив сообщение, когда это /start
, чтобы установить first-image
для первого ключа словаря на None
, а затем, когда пользователь отвечает, чтобы получить, установите значение этого ключа для ответа, а затем отобразите другое изображение. и снова продолжайте устанавливать значение словаря в None
. Затем, наконец, когда l oop закончился, подождите некоторое время, получите последнее обновленное сообщение о значении и установите значение последнего ключа в словаре. Но вы хотите знать, есть ли способ получить значение одновременно с изображением.
from bot import telegram_chatbot
from random import randint
import requests
import json
import time
bot = telegram_chatbot("config.cfg")
def check_message_contents(msg):
if msg == "y" or msg == "n":
return 'ok'
else:
return 'Response needs to be either "y" or "n"'
def generate_img():
frame_rand = randint(10000, 61695)
url = 'https://some_url/' + str(frame_rand)
return url, frame_rand
def make_reply(msg, frame):
reply = None
if msg is not None:
reply = str(frame) + ' - has the rocket launched yet? (y/n)'
return reply
def get_updates_check(offset=None):
url = "https://api.telegram.org/bot<some_token>/getUpdates?timeout=100"
if offset:
url = url + "&offset={}".format(offset - 1)
r = requests.get(url)
return json.loads(r.content)
update_id = None
frame_ids = {}
while len(frame_ids) < 16:
updates = bot.get_updates(offset=update_id)
updates = updates["result"]
if updates:
for item in updates:
update_id = item["update_id"]
try:
message = str(item["message"]["text"])
except:
message = None
from_ = item["message"]["from"]["id"]
check_message = check_message_contents(message)
if '/start' in message:
frame_ids = {}
photo_url, frame = generate_img()
bot.send_photo(from_, photo_url)
reply = make_reply(message, frame)
bot.send_message(reply, from_)
frame_ids[frame] = ''
elif 'ok' in check_message:
if len(frame_ids) > 0:
last_elem_frame_ids = list(frame_ids.keys())[-1]
frame_ids[last_elem_frame_ids] = message
photo_url, frame = generate_img()
bot.send_photo(from_, photo_url)
reply = make_reply(message, frame)
bot.send_message(reply, from_)
frame_ids[frame] = None
else:
photo_url, frame = generate_img()
bot.send_photo(from_, photo_url)
bot.send_message(check_message, from_)
reply = make_reply(message, frame)
bot.send_message(reply, from_)
time.sleep(4)
print(frame_ids)
# here I can see the message value for the last key in frame_ids
print(get_updates_check())