• Как настроить webhook для Telegram-бота (python3 + pyTelegramBotAPI) на хостинге Heroku?

    @keshamin Автор вопроса
    johny2308, @gavrilka
    В общем в итоге еще весной 2017-го, когда был создан этот тикет, я все-таки справился с этой проблемой путем долгих проб и постоянных нерабочих пушей на Хероку...
    Уже не помню весь свой путь к этому решению, но в итоге вот как в итоге у меня это работает:
    import telebot
    import os
    from flask import Flask, request
    import logging
    
    bot = telebot.TeleBot(token)
    
    # Здесь пишем наши хэндлеры
    
    # Проверим, есть ли переменная окружения Хероку (как ее добавить смотрите ниже)
    if "HEROKU" in list(os.environ.keys()):
        logger = telebot.logger
        telebot.logger.setLevel(logging.INFO)
    
        server = Flask(__name__)
        @server.route("/bot", methods=['POST'])
        def getMessage():
            bot.process_new_updates([telebot.types.Update.de_json(request.stream.read().decode("utf-8"))])
            return "!", 200
        @server.route("/")
        def webhook():
            bot.remove_webhook()
            bot.set_webhook(url="https://min-gallows.herokuapp.com/bot") # этот url нужно заменить на url вашего Хероку приложения
            return "?", 200
        server.run(host="0.0.0.0", port=os.environ.get('PORT', 80))
    else:
        # если переменной окружения HEROKU нету, значит это запуск с машины разработчика.  
        # Удаляем вебхук на всякий случай, и запускаем с обычным поллингом.
        bot.remove_webhook()
        bot.polling(none_stop=True)


    Насчет настройки переменной окружения в Хероку - заходим в настройки приложения в Хероку и видим пункт "Config Variables". И добавляем туда переменную HEROKU, чтобы наш бот отличал - запущен он на сервере или на локальной машине. Но это уже не обязательно, это вкусовщна. Просто для меня это удобно.

    Надеюсь, у вас все получится!
    Ответ написан
    3 комментария