Найти - Пользователи
Полная версия: Бот для Телеграма на Heroku не запускает Webhook, хотя на GetUpdates работал без ошибок
Начало » Python для новичков » Бот для Телеграма на Heroku не запускает Webhook, хотя на GetUpdates работал без ошибок
1
GeorgeSU
День добрый.
Написал бота для Телеграма на Python, оттестировал с локального компа на GetUpdates, а дальше при выкладывании на Heroku заткнулся с переключением на Webhook. Сложность в том, что не выдает конкретной ошибки, а просто без детализации его прекращает (см лог ниже).

Впечатление, что ошибка где-то в этом блоке, по крайней мере к нему подходит без ошибок, но вроде все сделал по инструкциям из Интернета:
 if __name__ == '__main__':
    if Run_On_Heroku:
        print('....004')
        def main():
            print('....005')
            executor.start_webhook(dispatcher=dp, webhook_path=WEBHOOK_PATH, on_startup=on_startup, skip_updates=True, host=WEBAPP_HOST, port=WEBAPP_PORT)
    else:
        executor.start_polling(dp, on_shutdown=shutdown)

Можете посоветовать, что не так, и куда копать?

Исходники на Гитхабе

Лог:
2021-09-17T16:35:57.046541+00:00 heroku: Starting process with command `python Bot_forKadry.py`
2021-09-17T16:35:58.603655+00:00 app: ..====== начали =====
2021-09-17T16:35:58.610152+00:00 app: ….вводную часть завершили
2021-09-17T16:35:58.768911+00:00 app: ….007
2021-09-17T16:35:58.768934+00:00 app: ….004
2021-09-17T16:35:59.019267+00:00 heroku: Process exited with status 0
2021-09-17T16:35:59.179898+00:00 heroku: State changed from starting to crashed
py.user.next
На Heroku переменные среды установил?
GeorgeSU
py.user.next
На Heroku переменные среды установил?
Да, конечно.
На всякий случай специально в основной код (стр.18) вывел перечень фактически установленных переменных окружения
py.user.next
Сделай просто Webhook без всего. Убедись, что ты его можешь сделать вообще. Имеется в виду на Heroku. Ты ему должен посылать сообщение, на которое он должен отвечать.

В коде в этом копаться вряд ли есть смысл, так как видно, что он никакущий. Ошибок может быть миллион. Выглядит как такая бочка говна, в которой где-то в глубине плавает сосиска в упаковке, которую нужно достать. Ты давай ныряй туда сам, а мы тебе будем советовать, как с чистого начинать, чтобы покушать нормально.
GeorgeSU
py.user.next
В коде в этом копаться вряд ли есть смысл, так как видно, что он никакущий. Ошибок может быть миллион. Выглядит как такая бочка говна, в которой где-то в глубине плавает сосиска в упаковке, которую нужно достать. Ты давай ныряй туда сам, а мы тебе будем советовать, как с чистого начинать, чтобы покушать нормально.
Спасибо за образную характеристику ))) Учитывая что я вообще не программист, но вижу в чем есть потребность у коллег по отрасли, и для этого и полез в бото-писание чтобы запустить профильный канал в телеграме.

Убрал из кода всю содержательную часть, оставил только запуск Webhook и один хандлер (для проверки работоспособности кода). Получилось вот так:
на гитхабе

Можешь посоветовать как эти вэбхуки запустить?
(идея в том, что бот ждет когда к нему пользователь обратится, а как именно потом будет с ним взаимодействовать - я пока поубирал)

Лог:
2021-09-18T08:39:34.691426+00:00 heroku: State changed from crashed to starting
2021-09-18T08:39:42.013028+00:00 heroku: Starting process with command `python Bot_test.py`
2021-09-18T08:39:43.710210+00:00 app: ..====== начали =====
2021-09-18T08:39:43.719582+00:00 app: ….контроль прохода к строке 007
2021-09-18T08:39:43.719586+00:00 app: ….контроль прохода к строке 004
2021-09-18T08:39:43.873993+00:00 heroku: Process exited with status 0
2021-09-18T08:39:43.958005+00:00 heroku: State changed from starting to crashed

P.S. Лучше давать ссылку на Гитхаб с кодом, или выкладывать оттуда код сюда? Как удобнее/корректнее?
py.user.next
GeorgeSU
Убрал из кода всю содержательную часть
Не, сделай новый питон-файл вообще пустой. И потом начинай его заполнять по минимуму. Там у тебя такой код: при получении сообщения от Telegram код должен на Webhook послать сообщение.
Таким образом ты посылаешь команду боту в смартфоне или в десктопном приложении, а бот тебе отвечает на эту команду “привет”.

Для этого не нужен aiogram. Там вообще хватит только urllib.request.urlopen() .

GeorgeSU
Можешь посоветовать как эти вэбхуки запустить?
Надо в Telegram зарегистрировать этот Webhook. Там ему посылаешь JSON-документ, в котором указываешь url. Так Telegram поймёт, куда перенаправлять команды.
https://core.telegram.org/bots/api#setwebhook

GeorgeSU
Лучше давать ссылку на Гитхаб с кодом, или выкладывать оттуда код сюда?
Если будет готовый вариант даже простого эхо-бота, то лучше здесь оставить его с полным описанием. Кто-нибудь потом найдёт его случайно через поисковик типа Google или Яндекс и применит для своего обучения. При этом на GitHub'е его не нужно будет держать годами. А тут он сохранится.

Вот если бы такой вариант тут уже был, я бы тебе на него ссылку и дал, чтобы ты сам не экспериментировал.
Тут писал только про виды ботов.
Тут делал скрипт отправки сообщения от имени бота.
GeorgeSU
Уфф, эхо-бот заработал. Дальше буду уже накручивать в него свои функционалы.
Оставляю на случай если кому-то понадобится Webhook для Телеграма, работающий на Heroku:

 import asyncio
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils.executor import start_webhook
import os
#в переменных среды Heroku заданы TOKEN и HEROKU_APP_NAME
BOT_TOKEN = os.getenv('TOKEN') 
HEROKU_APP_NAME = os.getenv('HEROKU_APP_NAME') 
# webhook настройки
WEBHOOK_HOST = f'https://{HEROKU_APP_NAME}.herokuapp.com'
WEBHOOK_PATH = f'/webhook/{BOT_TOKEN}' 
WEBHOOK_URL = f"{WEBHOOK_HOST}{WEBHOOK_PATH}"
# webserver настройки
WEBAPP_HOST = '0.0.0.0'
WEBAPP_PORT = int(os.environ.get('PORT', '8443'))
loop = asyncio.get_event_loop()
bot = Bot(token=BOT_TOKEN, loop=loop)
dp = Dispatcher(bot)
#просто повтор сказанного пользователем
@dp.message_handler()
async def echo(message: types.Message):
    await bot.send_message(message.chat.id, message.text)
async def on_startup(dp):
    await bot.delete_webhook(dp) 
    await bot.set_webhook(WEBHOOK_URL)
    # и дальше все что надо после запуска
async def on_shutdown(dp):
    # если что-то надо для окончания
    pass
if __name__ == '__main__':
    start_webhook(dispatcher=dp, webhook_path=WEBHOOK_PATH, on_startup=on_startup, on_shutdown=on_shutdown,
                  skip_updates=True, host=WEBAPP_HOST, port=WEBAPP_PORT)

Procfile:
web: python test.py
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB