我正在尝试使用telebot创建一个Telegram机器人,该机器人还可以发出生日提醒

时间:2020-04-05 16:25:53

标签: python telegram-bot

嗨,我正在尝试使用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)

1 个答案:

答案 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