【问题标题】:How to send message from bot to user at a fixed time or at intervals through python telegram bot library?如何通过python电报机器人库在固定时间或间隔时间从机器人向用户发送消息?
【发布时间】:2020-01-06 11:54:31
【问题描述】:

我正在尝试从第二次对话开始每天向机器人发送消息,而无需从用户端(例如 commandhadler)触发。

我已经为机器人与用户交互构建了一个基本菜单

但我也在尝试每天通过 job_queue 发送消息

我参考了使用命令处理程序的代码

dp.add_handler(CommandHandler("set", set_timer,
                              pass_args=True,
                              pass_job_queue=True,
                              pass_chat_data=True))

这是在用户输入 /set 之后设置的。 但我正在尝试找到一种方法,每 30 秒自动发送一次消息,或者设置固定时间每天发送消息 我的代码

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

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger()

def start(bot, update):
    update.message.reply_text("Hello , Thanks for choosing us!!")

def callback_minute(context: telegram.ext.CallbackContext):
    chat_id = ?
    context.bot.send_message(chat_id=chat_id, 
                             text='Hi User, Add Fund to your account to start trading')


def main():
    updater = Updater(token,use_context=True)
    dp = updater.dispatcher
    j = updater.job_queue
    dp.add_handler(CommandHandler("start",start))
    job_minute = j.run_repeating(callback_minute, interval=10, first=0)

    updater.start_polling()

    updater.idle()

如何获取chat_id? 如果我正在使用

def callback_minute(update, context: telegram.ext.CallbackContext):
    chat_id = update.message.chat.id

我收到了这个错误

TypeError: callback_minute() missing 1 required positional argument: 'context'

【问题讨论】:

  • 您无法通过这种方式获取chat_idchat_id 只能从update 对象中获取,而update 对象只有在用户向Bot 发送消息时才会被获取。首先,将 job_queue 行移动到单独的函数中。然后应该使用任何处理程序调用此函数。
  • 您能否提供一些示例代码,因为我已尝试将其启动,但无法正常工作
  • 你想如何开始这个发送消息的工作?这应该是什么触发点?

标签: python python-telegram-bot


【解决方案1】:

下面对其进行了重新设计,以便从/start 命令调用 run_repeating()(如 cmets 中的 Gagan T K 所建议)。在此示例中,first=30 将在 30 秒后启动。

在 GitHub 上的the wiki documentation for JobQueue 底部有一个很好的以这种方式使用作业队列的示例。

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

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger()

bot = telegram.Bot(token=token)

def start(update, context):
    context.bot.send_message(chat_id=update.message.chat_id,
                     text="Hello , Thanks for choosing us!!")

    context.job_queue.run_repeating(callback_minute, interval=10, first=30,
                                    context=update.message.chat_id)

def callback_minute(context):
    chat_id=context.job.context
    context.bot.send_message(chat_id=chat_id, 
                             text="Hi User, Add Fund to your account to start trading")

def main():
    updater = Updater(token,use_context=True)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start",start, pass_job_queue=True))

    updater.start_polling()

    updater.idle()

if __name__ == '__main__':
    main()

【讨论】:

    【解决方案2】:

    您必须使用context.job_queue.run_repeating() 在特定时间间隔后连续重复作业。

    如果您希望作业每天执行一次,您可以使用context.job_queue.run_daily() 并指定时间。

    以下是这两种情况的 python-telegram-bot 文档链接: job_queue.run_repeating(), job_queue.run_daily()

    这些文档有非常好的信息,可以帮助您查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-11
      • 2020-01-20
      • 2021-06-30
      • 2016-05-03
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 2020-08-25
      相关资源
      最近更新 更多