如何在自定义 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() 函数,这样您就可以开始了
我们正在尝试制作一个电报价格机器人,但 运行 遇到了一个可以使用第三方代码解决的问题,但是我们无法将机器人设置为每 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() 函数,这样您就可以开始了