Я пытаюсь создать бота Telegram с помощью telebot, который также может напоминать о дне рождения - PullRequest
0 голосов
/ 05 апреля 2020

Привет! Я пытаюсь создать бота для Teleragm через python, используя telebot, который может отправить мне напоминание о дне рождения. Я не мог заставить код работать. Я понимаю, что бот правильно назвал бы день рождения, если бы я не включил bot.polling (), но когда это происходит, бот не принимает никаких команд. если я включаю bot.polling, бот работает как обычно, но не вызывает напоминание о дне рождения. почему это так? и как я могу решить эту проблему?

Отказ от ответственности: я очень плохо знаком с программированием и только недавно начал набирать python через net. прошу прощения, если мои вопросы очень простые или код кажется грязным.

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 голосов
/ 06 апреля 2020

вы задали очень хороший вопрос, и новичок может запутаться в Python. Позвольте мне разделить ответ на несколько.

Сначала давайте посмотрим на часть телебота:

https://github.com/eternnoir/pyTelegramBotAPI/blob/master/telebot/ init .py # L387-L403

Это метод telebot.polling (). Do c заявляет, что этот метод нельзя вызывать более одного раза. Так что не стоит помещать это в цикл 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)

Теперь у вас должно быть больше подсказок о том, что происходит. Основной поток должен иметь дело с расписанием, а поток бота, созданный методом .polling (), должен иметь дело с вызовами телеграммы.


Дополнительные материалы для чтения / просмотра этой топи c:

Я предлагаю прочитать больше о многопоточности для выполнения нескольких вызовов блокировки (читай: while True loop) параллельно друг другу. Например, здесь: https://realpython.com/intro-to-python-threading/

Хотя Python имеет свои недостатки в многопоточности из-за GIL. https://realpython.com/python-gil/

Обе эти темы являются немного более сложными для человека, "очень нового для программирования". Но я предлагаю прочитать их, если вы хотите понять, что происходит в вашей программе BOT vs SCHEDULE.

Или посмотрите видео. Лично мне нравится говорить о GIL от PyCon: https://kolodziejj.info/talks/gil/ https://www.youtube.com/watch?v=ZvWmAIODi-s&list=PLyde45Tox-NfsQYj0AuToQNQehYIItZg6&index=22&t=0s

...