使用 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))
我在构建机器人方面还很陌生,所以我创建了一个非常简单的 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))