嗨,我正在尝试使用Telebot通过python创建一个Teleragm机器人,该机器人能够向我发送生日提醒。我似乎无法使代码正常工作。我意识到,如果我不包含bot.polling(),则该机器人会正确发出生日提示,但发生这种情况时,该机器人不会接受任何命令。如果我包含bot.polling,则该bot会正常运行,但不会发出生日提醒。为什么会这样呢?以及我该如何解决这个问题?
免责声明:我对编程非常陌生,直到最近才刚刚开始通过网络使用python。因此,如果我的问题非常基础或代码混乱,请原谅我。
import telebot
import time
import random
bot_token = 'some value'
bot = telebot.TeleBot(token = bot_token)
#I have some more commands function in the bot but i have just listed 1 here for example purpose
@bot.message_handler(commands=["random"])
def send_number(message):
number = random.sample(range(1, 50), 6)
bot.reply_to(message, "random number is..." + "\n" + str(number) )
def check_birthday():
today = time.strftime('%d%m')
bdaefile = open('birthday.txt', 'r')
for date in bdaefile:
if today in date:
line = date.split(' ')
bot.send_message('chat ID', "Happy Birthday " + line[1] + ' ' + line[2] + '!')
schedule.every().day.at("00:00").do(check_birthday)
while True:
try:
bot.polling()
schedule.run_pending()
except Exception:
time.sleep(15)
答案 0 :(得分:0)
您问了一个很好的问题,对于刚接触Python的人来说,这的确令人困惑。让我将答案分为几个。
首先让我们看一下Telebot部分:
https://github.com/eternnoir/pyTelegramBotAPI/blob/master/telebot/init.py#L387-L403
这是telebot.polling()方法。该文档指出,不应多次调用此方法。因此,将其放入while循环是不好的,因为它将被多次调用。从实现的角度来看,它创建了一个单独的线程,该线程随后可以处理机器人的请求。
...
bot.polling() # this creates another Thread.
while True: # this loop is never exited
try:
schedule.run_pending()
except Exception:
time.sleep(15)
现在的计划模块:
仅在try.exception中抑制异常是不明智的,因为这样您就不知道发生了什么。因此,至少打印异常(尽管您应该使用日志记录)
bot.polling() # this creates another Thread.
while True: # this loop is never exited
try:
schedule.run_pending()
except Exception as ex:
print(ex)
time.sleep(15)
现在,您应该对正在发生的事情有更多的了解。 主线程应处理调度程序,而bot线程应由.polling()方法创建,并应处理电报调用。
有关此主题的更多内容可供阅读/观看:
我建议您阅读更多有关线程的知识,以了解如何并行运行多个阻塞调用(阅读:while True
循环)。
例如此处:https://realpython.com/intro-to-python-threading/
尽管由于GIL,Python在线程处理方面存在弊端。 https://realpython.com/python-gil/
对于“对编程非常新的人”来说,这两个都是有点高级的话题。但是,如果您想了解BOT vs SCHEDULE程序中发生的情况,建议您阅读它们。
或观看视频。我个人喜欢从PyCon谈论GIL:https://kolodziejj.info/talks/gil/ https://www.youtube.com/watch?v=ZvWmAIODi-s&list=PLyde45Tox-NfsQYj0AuToQNQehYIItZg6&index=22&t=0s