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

Написал элементарного телеграм бота на Python 3 с использованием библиотеки pyTelegramBotAPI. Бот на long polling, без вебхука, и если запустить его локально, он исправно опрашивает сервера Телеграмма на наличие обновлений, но когда я запустил его на бесплатном тарифе Heroku (18 часов работы + 6 часов сна сервера в сутки), очевидно он отказывается постоянно стучать в телеграмм за обновлениями и делает это раз в несколько часов, что конечно неприемлемо для комфортной работы бота-помощника. Поэтому возникла необходимость научить бота получать апдейты более умным способом - вебхук.
Из того, что вычитал в сети понял, что с Хероку это сделать несложно, так как все приложения, хостящиеся на нем размещаются на суб-домене и автоматически получают SLL-сертификат, необходимый для настройки webhook.
К сожалению, я пока что очень начинающий программист и не представляю непосредственно шаги настройки вебхука. Помогите, пожалуйста, разобраться!
По возможности прошу отвечать максимально просто и подробно. Заранее спасибо! :)
  • Вопрос задан
  • 29176 просмотров
Решения вопроса 1
@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, чтобы наш бот отличал - запущен он на сервере или на локальной машине. Но это уже не обязательно, это вкусовщна. Просто для меня это удобно.

Надеюсь, у вас все получится!
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@MrCute
Студент
В папках с примерами использования pyTelegramBot есть примеры как его настроить на работу з WebHook даже с Heroku. Смотрите сюда
Ответ написан
@johny2308
уже запарились искать - столкнулись с такой же проблемой вот нашел решение - не помогло
https://stackoverflow.com/questions/41681632/how-t...

даже свой webhook создавали через хероку
https://devcenter.heroku.com/articles/app-webhooks...

бестолку )

Давайте объединим усилия!
Ответ написан
Комментировать
Djaler
@Djaler
Сеньор-помидор
Я использую другую библиотеку - python-telegram-bot, но суть, думаю, одна.
https://github.com/Djaler/CoinBot
Ответ написан
gavrilka
@gavrilka
Начинающий программист
У меня точно такой же вопрос. К сожалению, никак не получается.
Написал своего бота, он у меня работает через pycharm, и даже без вебхука, при методе longPolling я смог запустить на Хероку, но со временем он там падает. Очень бы хотелось научиться деплоить с помощью webhook, кто может помочь??
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы