Как получить ответ при отображении изображений / текста в боте telegram сразу после команды / start - PullRequest
0 голосов
/ 24 апреля 2020

Я использую 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())

...