如何在自定义 Telegram 机器人中循环?

How to loop inside a custom Telegram bot?

我们正在尝试制作一个电报价格机器人,但 运行 遇到了一个可以使用第三方代码解决的问题,但是我们无法将机器人设置为每 5 分钟向我们发送一次更新价格(或更多)出于安全原因不使用第三方解决方案。

如何在不使用其他第三方 Telegram 机器人的情况下从此代码内部循环?

这是代码

import telegram
from telegram.ext import Updater
from telegram.ext import CommandHandler
from tracker import get_prices

telegram_bot_token = "mybot"

updater = Updater(token=telegram_bot_token, use_context=True)
dispatcher = updater.dispatcher


def start(update, context):
    chat_id = update.effective_chat.id
    message = ""

    crypto_data = get_prices()
    for i in crypto_data:
        coin = crypto_data[i]["coin"]
        price = crypto_data[i]["price"]
        change_day = crypto_data[i]["change_day"]
        change_hour = crypto_data[i]["change_hour"]
        message += f" {coin}={price:,.5f}$ \nHour Change: {change_hour:.3f}%\nDay Change: {change_day:.3f}%\n\n"

    context.bot.send_message(chat_id=chat_id, text=message)


dispatcher.add_handler(CommandHandler("start", start))
updater.start_polling()

任何一次正确发送一条消息而不附加到前一条消息的解决方案?谢谢!

有多种方法可以做到这一点。

第一个是 while 循环中的简单 time.sleep()

import time

def start(update, context):
    chat_id = update.effective_chat.id
    while True:
        message = ""
        crypto_data = get_prices()
        for i in crypto_data:
            coin = crypto_data[i]["coin"]
            price = crypto_data[i]["price"]
            change_day = crypto_data[i]["change_day"]
            change_hour = crypto_data[i]["change_hour"]
            message += f" {coin}={price:,.5f}$ \nHour Change:{change_hour:.3f}%\nDay Change: {change_day:.3f}%\n\n"


        context.bot.send_message(chat_id=chat_id, text=message)
        time.sleep(300)

另一种方法可能是使用后台进程调度程序,但您可能会重构 start 函数并仅调度 creates/sends 消息的部分。 (while循环里面的部分)

Advanced Python Scheduler (pip install apscheduler) 是一个很棒的库,但它是第三方库,所以可能不适合你。不过,我已经在很多项目中使用过它。

编辑:

这是一个使用 apscheduler 进行调度的示例:

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()

def message_loop(chat_id, bot):
    message = ""
    crypto_data = get_prices()
    for i in crypto_data:
        coin = crypto_data[i]["coin"]
        price = crypto_data[i]["price"]
        change_day = crypto_data[i]["change_day"]
        change_hour = crypto_data[i]["change_hour"]
        message += f" {coin}={price:,.5f}$ \nHour Change: {change_hour:.3f}%\nDay Change: {change_day:.3f}%\n\n"
    bot.send_message(chat_id=chat_id, text=message)


def start(update, context):
    chat_id = update.effective_chat.id
    bot = context.bot
    scheduler.add_job(message_loop, 'interval', minutes=5, args=(chat_id, bot))
    scheduler.start()

# You might want to also add a stop function to your bot:

def stop():
    scheduler.shutdown()

dispatcher.add_handler(CommandHandler("start", start))
dispatcher.add_handler(CommandHandler("stop", stop))
updater.start_polling()

您应该尝试添加 setinterval 或纯 millis() 函数,这样您就可以开始了