我需要一个电报机器人,让我在选择一个名字之后选择两个日期。这是我的新代码,希望您能对我有所帮助,我正在使用它 python-telegram-bot
代码的问题在于,它只允许我选择第一个日期,然后日历消失。
我的代码基于https://github.com/grcanosa/telegram-calendar-keyboard
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler,ConversationHandler
from telegram.ext import CallbackQueryHandler
from telegram import ReplyKeyboardRemove
import telegramcalendar
FIRST, SECOND = range(2)
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logger = logging.getLogger(__name__)
def calendar_handler(bot,update):
query = update.callback_query
reply_markup=telegramcalendar.create_calendar()
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=u"Choose First date"
)
bot.edit_message_reply_markup(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
reply_markup=reply_markup
)
selected,date = telegramcalendar.process_calendar_selection(bot, update)
if selected:
bot.send_message(chat_id=update.callback_query.from_user.id,
text="Date: %s" % (date.strftime("%Y-%m-%d")))
return SECOND
def calendar_handler1(bot,update):
query = update.callback_query
reply_markup=telegramcalendar.create_calendar()
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=u"Choose second date"
)
bot.edit_message_reply_markup(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
reply_markup=reply_markup
)
selected1,date = telegramcalendar.process_calendar_selection(bot, update)
if selected1:
bot.send_message(chat_id=update.callback_query.from_user.id,
text="Other date: %s" % (date.strftime("%Y-%m-%d")))
def start(bot, update):
keyboard = [[InlineKeyboardButton("Name1", callback_data='1'),
InlineKeyboardButton("Name2", callback_data='2')]]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text('Choose:', reply_markup=reply_markup)
return FIRST
def main():
updater = Updater("TOKEN")
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
FIRST: [CallbackQueryHandler(calendar_handler)],
SECOND: [CallbackQueryHandler(calendar_handler1)]
},
fallbacks=[CommandHandler('start', start)]
)
updater.dispatcher.add_handler(conv_handler)
# Start the Bot
updater.start_polling()
# Run the bot until the user presses Ctrl-C or the process receives SIGINT,
# SIGTERM or SIGABRT
updater.idle()
if __name__ == '__main__':
main()
答案 0 :(得分:0)
这不是最佳答案,但对我有用。
import logging
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler,ConversationHandler
from telegram.ext import CallbackQueryHandler
from telegram import ReplyKeyboardRemove
import telegramcalendar
CANTIDAD,FECHA1,FECHA2 = range(3)
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logger = logging.getLogger(__name__)
def calendar_handler(bot,update):
query = update.callback_query
reply_markup=telegramcalendar.create_calendar()
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=u"Escoja una fecha inicial para reporte: "
)
bot.edit_message_reply_markup(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
reply_markup=reply_markup
)
selected=0
try:
selected,date = telegramcalendar.process_calendar_selection(bot, update)
except:
pass
if selected:
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text="Fecha Inicial de reporte: %s \nPor favor escoja la fecha final de reporte: " % (date.strftime("%Y-%m-%d"))
)
bot.edit_message_reply_markup(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
reply_markup=reply_markup
)
return FECHA2
def calendar_handler1(bot,update):
query = update.callback_query
reply_markup=telegramcalendar.create_calendar()
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=u"Escoja una fecha final para el analisis"
)
bot.edit_message_reply_markup(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
reply_markup=reply_markup
)
selected,date = telegramcalendar.process_calendar_selection(bot, update)
if selected:
bot.send_message(chat_id=update.callback_query.from_user.id,
text="Fecha Final de analisis: %s\n Espere mientras le entregamos su reporte..." % (date.strftime("%Y-%m-%d")),
reply_markup=ReplyKeyboardRemove())
def cantidad(bot, update):
query = update.callback_query
keyboard = [[InlineKeyboardButton("5", callback_data='5'),
InlineKeyboardButton("10", callback_data='10'),
InlineKeyboardButton("15", callback_data='15'),
InlineKeyboardButton("20", callback_data='20'),
InlineKeyboardButton("25", callback_data='25'),
InlineKeyboardButton("30", callback_data='30'),]]
reply_markup = InlineKeyboardMarkup(keyboard)
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=u"Escoja la cantidad de datos que desea reflejados en el reporte"
)
bot.edit_message_reply_markup(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
reply_markup=reply_markup
)
return FECHA1
def fecha_final_func(bot, update):
query = update.callback_query
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=u"Escoger fecha final"
)
def start(bot, update):
keyboard = [[InlineKeyboardButton("Name1", callback_data='1'),
InlineKeyboardButton("Name2", callback_data='2')]]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text('Escoja:', reply_markup=reply_markup)
return CANTIDAD
def help(bot, update):
update.message.reply_text("Use /start to test this bot.")
def error(bot, update, error):
"""Log Errors caused by Updates."""
logger.warning('Update "%s" caused error "%s"', update, error)
def main():
# Create the Updater and pass it your bot's token.
updater = Updater("TOKEN")
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
CANTIDAD: [CallbackQueryHandler(cantidad)],
FECHA1: [CallbackQueryHandler(calendar_handler)],
FECHA2: [CallbackQueryHandler(calendar_handler1)]
},
fallbacks=[CommandHandler('start', start)]
)
updater.dispatcher.add_handler(conv_handler)
# Start the Bot
updater.start_polling()
# Run the bot until the user presses Ctrl-C or the process receives SIGINT,
# SIGTERM or SIGABRT
updater.idle()
if __name__ == '__main__':
main()