【问题标题】:(python) Telegram bot- how to send messages periodically?(python) Telegram bot-如何定期发送消息?
【发布时间】:2018-04-20 09:38:12
【问题描述】:

我的电报机器人进退两难。假设我必须创建一个函数,它会询问每个连接到机器人的用户,每周/每月一次,一个问题:

def check_the_week(bot, update):
reply_keyboard = [['YES', 'NO']]
bot.send_message(
    chat_id=update.message.chat_id,
    text=report,

    reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True))  # sends the total nr of hours
update.reply_text("Did you report all you working hour on freshdesk for this week?",
                  ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True))

if update.message.text == "YES":
    update.message.reply_text(text="Are you sure?",
                              reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True))

    # Asks confirmation
    if update.message.text == "YES":
        update.message.reply_text(text="Thank you for reporting your working hours in time!")

    elif update.message.text == "NO":
        update.message.reply_text(text="Please, check you time reports and add missing")

elif update.message.text == "NO":
    update.message.reply_text(text="Please, check you time reports and add missing")

我希望每周触发此功能。我正在考虑使用JobQueue。问题是在这种情况下,函数应该有两个参数——bot 和 job_queue,但没有更新:

def callback_30(bot, job):
    bot.send_message(chat_id='@examplechannel',
    text='A single message with 30s delay')

j.run_once(callback_30, 30)

如何在电报机器人中创建作业计划程序(或任何其他解决方案)以每周触发一次我的功能? p.s.请不要使用“while True”+time.sleep() 解决方案。循环永远卡住了,我试过了。

【问题讨论】:

  • 您可以在使用run_once 时将任何内容(例如update)传递给context 参数。

标签: python telegram telegram-bot python-telegram-bot


【解决方案1】:

在函数中定义作业时需要使用上下文参数。看这个例子:

   from telegram.ext import Updater, CommandHandler, MessageHandler,    Filters, InlineQueryHandler


def sayhi(bot, job):
    job.context.message.reply_text("hi")

def time(bot, update,job_queue):
    job = job_queue.run_repeating(sayhi, 5, context=update)

def main():
    updater = Updater("BOT TOKEN")
    dp = updater.dispatcher
    dp.add_handler(MessageHandler(Filters.text , time,pass_job_queue=True))


    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

现在在您需要update. 的回调函数中输入job.context

【讨论】:

  • 我收到此错误:TypeError: time() missing 1 required positional argument: job_queue
【解决方案2】:

要定期发送消息,您可以使用JobQueue Extention from python-telegram-bot

这是一个例子

from telegram.ext import Updater, CommandHandler

def callback_alarm(bot, job):
    bot.send_message(chat_id=job.context, text='Alarm')

def callback_timer(bot, update, job_queue):
    bot.send_message(chat_id=update.message.chat_id,
                      text='Starting!')
    job_queue.run_repeating(callback_alarm, 5, context=update.message.chat_id)

def stop_timer(bot, update, job_queue):
    bot.send_message(chat_id=update.message.chat_id,
                      text='Stoped!')
    job_queue.stop()

updater = Updater("YOUR_TOKEN")
updater.dispatcher.add_handler(CommandHandler('start', callback_timer, pass_job_queue=True))
updater.dispatcher.add_handler(CommandHandler('stop', stop_timer, pass_job_queue=True))

updater.start_polling()

/start命令会启动JobQueue,每隔5秒发送一条消息,/stop命令可以停止队列。

【讨论】:

    【解决方案3】:

    尝试使用cron。您只需将新的聊天 ID 存储在某处(文件、数据库等)并从您的脚本中读取。 例如每天晚上 9 点(21:00)运行send_messages.py

    0 21 * * * python send_messages.py

    【讨论】:

    • 我确实存储了 chat_ids。问题是我必须以某种方式从电报用户(update.message.text)获取响应/确认,如果没有“更新”对象,我将无法做到这一点。
    • 您不需要使用 cron,因为您使用的库已经有作业。您正在传递更新,但您不能使用更新,因为实际上没有更新运行该函数,而是作业参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多