使用 python-telegram-bot 每 n 小时发送一次自动消息的电报机器人

Telegram bot to send auto message every n hours with python-telegram-bot

我在构建机器人方面还很陌生,所以我创建了一个非常简单的 Telegram 机器人,它运行良好,但无法弄清楚如何让机器人在 /start_auto 时每 n 分钟或 n 小时发送一次消息命令已启动。

我用 while 循环做了一个解决方法,但它看起来很愚蠢,在循环期间用户将无法与机器人就其他主题进行交互。

我希望用户能够通过 /start_auto 和 /stop_auto 等命令启动和停止此计划任务。

我知道还有许多其他与此主题相关的已回答问题,但其中 none 似乎适用于我的代码。

import logging
import os
import time

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

logger = logging.getLogger(__name__)

PORT = int(os.environ.get('PORT', '8443'))


def start(update, context):
    """Sends a message when the command /start is issued."""
    update.message.reply_text('Hi!')


def help(update, context):
    """Sends a message when the command /help is issued."""
    update.message.reply_text('Help!')


def start_auto(update, context):
    """Sends a message when the command /start_auto is issued."""
    n = 0
    while n < 12:
        time.sleep(3600)
        update.message.reply_text('Auto message!')
        n += 1


def error(update, context):
    """Logs Errors caused by Updates."""
    logger.warning('Update "%s" caused error "%s"', update, context.error)


def main():
    TOKEN = 'TOKEN_GOES_HERE'
    APP_NAME = 'https://my-tele-test.herokuapp.com/' 

    updater = Updater(TOKEN, use_context=True)

    # Get the dispatcher to register handlers
    dp = updater.dispatcher

    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help))
    dp.add_handler(CommandHandler("start_auto", start_auto))

    # log all errors
    dp.add_error_handler(error)
    updater.start_webhook(listen="0.0.0.0", port=PORT, url_path=TOKEN, webhook_url=APP_NAME + TOKEN)
    updater.idle()


if __name__ == '__main__':
    main()

你为什么不使用热解图。它让一切变得更简单。

from pyrogram import Client, filters 
import time

app = Client('my_account',          #Update this line with
               api_id=API_ID,       #your API_ID
               api_hash=API_HASH,   #your API_HASH
               bot_token=BOT_TOKEN) #your BOT_TOKEN

def main():
    while(True):
        app.send_message(chat_id=123456789, text="This message is sent every 5 mins")
        time.sleep(5000) app.run()

如果此回答对您有用,请帮助我找到 #72158677 问题的解决方案

python-telegram-bot 有一个 built-in 调度任务的功能,称为 JobQueue。请查看 this wiki page 了解更多信息。


免责声明:我目前是 python-telegram-bot.

的维护者

将post一个我找到的解决方案:

def callback_auto_message(context):
    context.bot.send_message(chat_id='12345678', text='Automatic message!')


def start_auto_messaging(update, context):
    chat_id = update.message.chat_id
    context.job_queue.run_repeating(callback_auto_message, 10, context=chat_id, name=str(chat_id))
    # context.job_queue.run_once(callback_auto_message, 3600, context=chat_id)
    # context.job_queue.run_daily(callback_auto_message, time=datetime.time(hour=9, minute=22), days=(0, 1, 2, 3, 4, 5, 6), context=chat_id)


def stop_notify(update, context):
    chat_id = update.message.chat_id
    context.bot.send_message(chat_id=chat_id, text='Stopping automatic messages!')
    job = context.job_queue.get_jobs_by_name(str(chat_id))
    job[0].schedule_removal()

并且在主函数中我创建了一个命令:

dp.add_handler(CommandHandler("auto", start_auto_messaging))
dp.add_handler(CommandHandler("stop", stop_notify))