(python)Telegram bot-如何定期发送消息?

时间:2017-11-07 20:50:50

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

我的电报机器人陷入困境。假设我必须创建一个函数,每周/每月一次,每个用户连接到机器人的问题都会提出一个问题:

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 AND 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)

如何在电报机器人中创建一个Job Scheduler(或任何其他解决方案),以便每周触发一次我的功能? 附:请不要“while True”+ time.sleep()解决方案。循环刚刚停止,我试了一下。

3 个答案:

答案 0 :(得分:3)

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

   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

答案 1 :(得分:3)

要定期发送消息,可以使用JobQueue Extention中的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命令停止该队列。

答案 2 :(得分:1)

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

0 21 * * * python send_messages.py