Ответ в Telegram по времени

В настоящее время я работаю над Telegram Bot, используя python api. Я использую здесь этот пример https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/conversationbot.py. В этом примере я хочу, чтобы у бота был ответ по времени.

Например, если пользователь не отвечает в течение 30 секунд, отправьте сообщение «Вы все еще там» или что-то еще и через 1 минуту завершите разговор. Причина, по которой я хочу реализовать что-то подобное, заключается в том, что беседа не закрывается, если нет ответа. Он находится в таком состоянии до тех пор, пока я не закончу сценарий. Поэтому пользователь не может отправить / запустить команду, чтобы начать все сначала. Мне удалось найти этот https://github.com/python-telegram-bot/python-telegram-bot/blob/master/telegram/ext/conversationhandler.py, где говорится, что я могу включить allow_reentry. Я сделал это, и это вроде как решает эту проблему, когда пользователь может запускать новую конвенцию снова и снова, используя команду / start. Но я бы все равно хотел, чтобы разговор закончился через определенное время. Чтобы завершить разговор, мне нужно вернуть ConversationHandler.END

Я пробовал цикл while, отсчитывающий от 9 до time.sleep 2 каждый раз. с ним читается ответ update.message.text, но он читает только команду / start, что означает, что я никогда не смогу продвинуться в скрипте, если я не верну его с помощью return GENDER, но я не могу найти метод, в котором я могу сказать, когда пользователь выбрал пол, чтобы затем вернуть GENDER.

Итак, как мне реализовать ответ на основе таймера? Спасибо

from telegram import (ReplyKeyboardMarkup) from telegram.ext import (Updater, CommandHandler, MessageHandler, Filters, RegexHandler, ConversationHandler) import logging # Enable logging logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO) logger = logging.getLogger(__name__) GENDER, PHOTO, LOCATION, BIO = range(4) def start(bot, update): reply_keyboard = [['Boy', 'Girl', 'Other']] bot.sendMessage(update.message.chat_id, text='Hi! My name is Professor Bot. I will hold a conversation with you. ' 'Send /cancel to stop talking to me.\n\n' 'Are you a boy or a girl?', reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)) return GENDER def gender(bot, update): user = update.message.from_user logger.info("Gender of %s: %s" % (user.first_name, update.message.text)) bot.sendMessage(update.message.chat_id, text='I see! Please send me a photo of yourself, ' 'so I know what you look like, or send /skip if you don\'t want to.') return PHOTO def photo(bot, update): user = update.message.from_user photo_file = bot.getFile(update.message.photo[-1].file_id) photo_file.download('user_photo.jpg') logger.info("Photo of %s: %s" % (user.first_name, 'user_photo.jpg')) bot.sendMessage(update.message.chat_id, text='Gorgeous! Now, send me your location please, ' 'or send /skip if you don\'t want to.') return LOCATION def skip_photo(bot, update): user = update.message.from_user logger.info("User %s did not send a photo." % user.first_name) bot.sendMessage(update.message.chat_id, text='I bet you look great! Now, send me your ' 'location please, or send /skip.') return LOCATION def location(bot, update): user = update.message.from_user user_location = update.message.location logger.info("Location of %s: %f / %f" % (user.first_name, user_location.latitude, user_location.longitude)) bot.sendMessage(update.message.chat_id, text='Maybe I can visit you sometime! ' 'At last, tell me something about yourself.') return BIO def skip_location(bot, update): user = update.message.from_user logger.info("User %s did not send a location." % user.first_name) bot.sendMessage(update.message.chat_id, text='You seem a bit paranoid! ' 'At last, tell me something about yourself.') return BIO def bio(bot, update): user = update.message.from_user logger.info("Bio of %s: %s" % (user.first_name, update.message.text)) bot.sendMessage(update.message.chat_id, text='Thank you! I hope we can talk again some day.') return ConversationHandler.END def cancel(bot, update): user = update.message.from_user logger.info("User %s canceled the conversation." % user.first_name) bot.sendMessage(update.message.chat_id, text='Bye! I hope we can talk again some day.') return ConversationHandler.END def error(bot, update, error): logger.warn('Update "%s" caused error "%s"' % (update, error)) def main(): # Create the EventHandler and pass it your bot's token. updater = Updater("TOKEN") # Get the dispatcher to register handlers dp = updater.dispatcher # Add conversation handler with the states GENDER, PHOTO, LOCATION and BIO conv_handler = ConversationHandler( entry_points=[CommandHandler('start', start)], states={ GENDER: [RegexHandler('^(Boy|Girl|Other)$', gender)], PHOTO: [MessageHandler([Filters.photo], photo), CommandHandler('skip', skip_photo)], LOCATION: [MessageHandler([Filters.location], location), CommandHandler('skip', skip_location)], BIO: [MessageHandler([Filters.text], bio)] }, fallbacks=[CommandHandler('cancel', cancel)], allow_reentry=True ) dp.add_handler(conv_handler) # log all errors dp.add_error_handler(error) # Start the Bot updater.start_polling() # Run the bot until the you presses Ctrl-C or the process receives SIGINT, # SIGTERM or SIGABRT. This should be used most of the time, since # start_polling() is non-blocking and will stop the bot gracefully. updater.idle()

person techyguy90    schedule 19.07.2016    source источник


Ответы (1)


Для этого вы можете использовать JobQueue.

Вы можете увидеть пример здесь: https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/timerbot.py

Обязательно инициализируйте обработчик с помощью pass_job_queue=True (как показано в приведенном выше примере).

person Noam Meltzer    schedule 21.07.2016