Как работать с aiogram webhook'ами?

Вот код который я написал, знаю что код не красивый(займусь позже т. к. мне главное чтоб работало, на хендлеры и как они работают не смотрите, все связанное с webhook есть только в начале и конце кода). Я пытался переписать с long_polling на webhook и разместить на heroku, но у меня естественное неполучилось. Прошу помощи, так как немогу найти нормального туториала. from Parse_homework import get_homework - это я импортирую еще один код(там я использую selenium для получения дом. задания. Для работы selenium я установил на heroku такие config Vars: CHROMEDRIVER_PATH - /app/.chromedriver/bin/chromedriver и GOOGLE_CHROME_BIN - /app/.apt/usr/bin/google-chrome Такие Buildpacks: heroku/python и https://github.com/heroku/heroku-buildpack-google-chrome и https://github.com/heroku/heroku-buildpack-chromedriver Пишите если чтото забыл указать.

from Parse_homework import get_homework
import os
import time
import emoji
import random
import logging
import requests
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove, InlineKeyboardMarkup, InlineKeyboardButton
from bs4 import BeautifulSoup
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.utils.exceptions import Throttled
from aiogram.utils import executor
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.dispatcher.filters import Text
from aiogram.utils.executor import start_webhook
import sqlite3 as sq

BOT_TOKEN = os.getenv('TOKEN')
HEROKU_APP_NAME = os.getenv('HEROKU_NAME')
WEBHOOK_HOST = f'https://{HEROKU_APP_NAME}.herokuapp.com/'
WEBHOOK_PATH = f'/webhook/{BOT_TOKEN}'
WEBHOOK_URL = f"{WEBHOOK_HOST}{WEBHOOK_PATH}"
WEBAPP_HOST = '0.0.0.0'
WEBAPP_PORT = #??? я не знаю что сюда вставлять
logging.basicConfig(level=logging.INFO)
URL = 'https://22bobruisk.schools.by/pupil/225105#dnevnik'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50',
           'accept': '*/*'}
bot = Bot(token=BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
dp.middleware.setup(LoggingMiddleware())

async def start_bot(dp):
    logging.warning('Starting connection')
    print("Бот вышел в онлайн")
    sql_start()
    await bot.set_webhook(WEBHOOK_URL, drop_pending_updates=True)

def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r


def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    global mest
    mest = soup.find(class_='sch_about_box').find_previous_sibling().text
    mest = list(mest)
    i = 0
    global n
    n = ''
    for i in range(0, len(mest)):
        try:
            if mest[i] == "\n" and mest[i + 1] == "\n":
                mest[i] = mest[i].replace("\n", "")
            elif mest[i] == " " and mest[i + 1] == " ":
                mest[i] = mest[i].replace(" ", "")
            elif mest[i] == " " and mest[i + 1] == "\n":
                mest[i] = mest[i].replace(" ", "")
            elif mest[i] == "\n" and mest[i + 1] == " ":
                mest[i] = mest[i].replace("\n", "")
            n += mest[i]
        except:
            pass

def parse():
    html = get_html(URL)
    if html.status_code == 200:
        get_content(html.text)
    else:
        print('Error')


async def anti_flood(*args, **kwargs):
    ex = args[0]
    await ex.answer("Не флуди")
ID = None
m = 0

    #await bot.send_message(msg.from_user.id, msg.text) - в личку
    #await msg.answer(msg.text) - написать
    #await msg.reply(msg.text) - ответить на сообщение
'''**********************************Кнопки вместо клавиатуры**********************************'''
#b1 = KeyboardButton('Математика')
#b2 = KeyboardButton('Физика')
#b3 = KeyboardButton('Русский язык')
#b4 = KeyboardButton('Беларусский язык')
#b5 = KeyboardButton('История Беларуси')
#b6 = KeyboardButton('Химия')

#v1 = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True).add(b1).add(b2).add(b3).add(b4).add(b5).add(b6)  # add.(b2).add(b3)

#v2 = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True).row(b1, b2, b3, b4, b5, b6)

#v3 = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True).row(b1, b2, b3).add(KeyboardButton('Слава жареный шашлык'))
#v3.row(b4, b5) #row - В столбик
#v3.insert(b6) #insert - если есть место в строке то вставляет туда, если места нет то переносит на новую строку

#v4 = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True).add(
    #KeyboardButton('Отправить ваш контакт', request_contact=True)
#).add(
   # KeyboardButton('Отправить свою локацию', request_location=True)
#)
button_load = KeyboardButton('/Загрузить')
button_delete = KeyboardButton('/Удалить')
button_case_admin = ReplyKeyboardMarkup(resize_keyboard=True).add(button_load).add(button_delete)

button_zn1 = KeyboardButton(text=emoji.emojize(':victory_hand:'))
button_zn2 = KeyboardButton(text=emoji.emojize(':raised_hand:'))
button_zn3 = KeyboardButton(text=emoji.emojize(':raised_fist:'))
button_zn_v = ReplyKeyboardMarkup(resize_keyboard = True).insert(button_zn1).insert(button_zn2).insert(button_zn3)
'''**********************************Кнопки под сообщением**********************************'''
ib1 = InlineKeyboardButton('Математика', callback_data='ibq')#
ib2 = InlineKeyboardButton('Русский язык', callback_data='ibw')#
ib3 = InlineKeyboardButton('Русская литература', callback_data='ibe')#
ib4 = InlineKeyboardButton('Беларусский язык', callback_data='ibr')#
ib5 = InlineKeyboardButton('Беларусская литература', callback_data='ibt')#
ib6 = InlineKeyboardButton('Физика', callback_data='iby')#
ib7 = InlineKeyboardButton('Химия', callback_data='ibu')#
ib8 = InlineKeyboardButton('Всемирная история', callback_data='ibi')#
ib9 = InlineKeyboardButton('История Беларуси', callback_data='ibo')#
ib10 = InlineKeyboardButton('География', callback_data='ibp')#
ib11 = InlineKeyboardButton('Физкультура', callback_data='iba')#
ib12 = InlineKeyboardButton('Обществоведение', callback_data='ibs')#
ib13 = InlineKeyboardButton('Английский язык', callback_data='ibz')#
ib14 = InlineKeyboardButton('Трудовое обучение', callback_data='ibx')#
ib15 = InlineKeyboardButton('Информатика', callback_data='ibc')#
ib16 = InlineKeyboardButton('Биология', callback_data='ibv')#
ibs = InlineKeyboardMarkup(row_width=1).row(ib1, ib2).row(ib3, ib4).row(ib5, ib6).row(ib7, ib8).row(ib9, ib10).row(ib11, ib12)

lins = [
    InlineKeyboardButton('Google', url='https://google.com'),
    InlineKeyboardButton('Youtube', url='https://youtube.com'),
    InlineKeyboardButton('ЧБG-Rust', url='https://www.youtube.com/channel/UCs9wjEag0GObS7wuiPMgLyg'),
    InlineKeyboardButton(text=emoji.emojize(':smiling_face_with_halo:'), url='https://rt.pornhub.com')
]
links = InlineKeyboardMarkup(row_width=1).add(lins[0]).row(*lins[1:])



'''************************************Админка**********************************************'''
class FSMAdmin(StatesGroup):
    photo = State()
    name = State()
    description = State()
    price = State()

class FSMADelete(StatesGroup):
    number = State()

@dp.message_handler(commands = ['moderator'], is_chat_admin = True)
async def make_changes_command(message: types.Message):
    global ID
    ID = message.from_user.id
    await bot.send_message(message.from_user.id, 'Что требуется?', reply_markup = button_case_admin)
    await message.delete()

@dp.message_handler(commands = 'Загрузить', state = None)
async def cm_start(message: types.Message):
    if message.from_user.id == ID:
        await FSMAdmin.photo.set()
        await message.reply('Загрузи фото')

@dp.message_handler(commands = 'Удалить', state = None)
async def cm_delete(message: types.Message):
    if message.from_user.id == ID:
        await FSMADelete.number.set()
        for ret in cur.execute('SELECT * FROM menu').fetchall():
            await bot.send_photo(message.from_user.id, ret[0], f'{ret[1]}\nОписание: {ret[2]}\nОценка {ret[-1]}')
        await bot.send_message(message.from_user.id, 'Введите имя факта для удаления')

@dp.message_handler(state = FSMADelete)
async def delete_lot(message: types.Message, state: FSMContext):
    if message.from_user.id == ID:
        cur.execute('DELETE FROM menu WHERE name == ?', (message.text,))
        base.commit()
        await bot.send_message(message.from_user.id, 'Факт успешно удалён')

@dp.message_handler(content_types = ['photo'], state = FSMAdmin.photo)
async def load_photo(message: types.Message, state: FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['photo'] = message.photo[0].file_id
        await FSMAdmin.next()
        await message.reply("Теперь введи название")

@dp.message_handler(state = FSMAdmin.name)
async def load_name(message: types.Message, state: FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['name'] = message.text
            await FSMAdmin.next()
            await message.reply("Введи описание")

@dp.message_handler(state = FSMAdmin.description)
async def load_description(message: types.Message, state: FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['description'] = message.text
            await FSMAdmin.next()
            await message.reply("Введи оценку")

@dp.message_handler(state = FSMAdmin.price)
async def load_description(message: types.Message, state: FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['price'] = float(message.text)
        await sql_add_command(state)
        await state.finish()
        await bot.send_message(message.from_user.id, 'Факт успешно добавлен', reply_markup=ReplyKeyboardRemove())

@dp.message_handler(state = "*", commands = 'отмена')
@dp.message_handler(Text(equals = 'отмена', ignore_case = True), state = '*')
async def cancel_handler(message: types.Message, state: FSMContext):
    if message.from_user.id == ID:
        current_state = await state.get_state()
        if current_state is None:
            return
        await state.finish()
        await message.reply('ОК', reply_markup=ReplyKeyboardRemove)
'''************************************База данных**********************************************'''
def sql_start():
    global base, cur
    base = sq.connect('all_information.db')
    cur = base.cursor()
    if base:
        print('Data base connected succesful')
        base.execute('CREATE TABLE IF NOT EXISTS menu(img TEXT, name TEXT PRIMARY KEY, description TEXT, price TEXT)')
        base.commit()

async def sql_add_command(state):
    async with state.proxy() as data:
        cur.execute('INSERT INTO menu VALUES (?, ?, ?, ?)', tuple(data.values()))
        base.commit()
'''************************************Камень ножницы бумага**********************************************'''







'''************************************Домашнее задание**********************************************'''
@dp.callback_query_handler(lambda c: c.data and c.data.startswith('ib'))
@dp.throttled(anti_flood, rate=10)
async def shortcut(callback_query: types.CallbackQuery):
    code = callback_query.data[-1]
    delay = 0
    if code == 'q' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Матем'))
        delay = 0
    if code == 'w' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Русяз'))
        delay = 0
    if code == 'e' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Руслит'))
        delay = 0
    if code == 'r' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Беляз'))
        delay = 0
    if code == 't' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Беллит'))
        delay = 0
    if code == 'y' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Физика'))
        delay = 0
    if code == 'u' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Химия'))
        delay = 0
    if code == 'i' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Всемирист'))
        delay = 0
    if code == 'o' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('ИстБел'))
        delay = 0
    if code == 'p' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('География'))
        delay = 0
    if code == 'a' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Физкизд'))
        delay = 0
    if code == 's' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Обществов'))
        delay = 0
    if code == 'z' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Англяз'))
        delay = 0
    if code == 'x' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Трудобуч'))
        delay = 0
    if code == 'c' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Информ'))
        delay = 0
    if code == 'v' and delay == 0:
        delay = 1
        await bot.answer_callback_query(callback_query.id)
        await bot.send_message(callback_query.from_user.id, "Прошу немного подождать. Это процесс не быстрый")
        await bot.send_message(callback_query.from_user.id, text=get_homework('Биология'))
        delay = 0


'''**************************************************************************************************'''

'''**************************************************************************************************'''
@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
    try:
        await message.answer("Привет!\nЯ создан для демонстрации способностей моего кодера - /help. Если меня ещё нет у вас в личном чате, прошу меня добавить для получения дополнительных возможностей: https://t.me/HelperPoMoschnik_bot")
        #await message.delete()
    except:
        await message.reply("Нам запрещено первым писать пользователям во избежание спама и т. д.\n"
                            "Прошу вас добавить меня в лс для возможности получения более подробной информации: https://t.me/HelperPoMoschnik_bot")

@dp.message_handler(commands=['help'])
async def help(message: types.Message):
    await message.answer("На данный момент доступны команды:\n"
                   "/start\n"
                   #"/School1\n"
                   #"/School2\n"
                   #"/School3\n"
                   #"/meinfo\n"
                   "/HomeWork\n"
                   "/SchoolInfo\n"
                   "/Facts - Факты\n"
                   "/Links\n"
                   "/moderator - пользоваться данной командой могут только администраторы\n"
                   "/SSP - Игра: камень ножницы бумага")

#@dp.message_handler(commands=['School1'])
#async def School(message: types.Message):
    #await bot.send_message(message.from_user.id, "Выбирайте:", reply_markup=v1)
    #await bot.send_message('Вот задание:', reply_markup=ReplyKeyboardRemove())

#@dp.message_handler(commands=['School2'])
#async def School(message: types.Message):
    #await bot.send_message(message.from_user.id, "Выбирайте:", reply_markup=v2)
    #await bot.send_message('Вот задание:', reply_markup=ReplyKeyboardRemove())

#@dp.message_handler(commands=['School3'])
#async def School(message: types.Message):
    #await bot.send_message(message.from_user.id, "Выбирайте:", reply_markup=v3)
    #await bot.send_message('Вот задание:', reply_markup=ReplyKeyboardRemove())

@dp.message_handler(commands=['SchoolInfo'])
async def School(message: types.Message):
    parse()
    await bot.send_message(message.from_user.id, "Вот информация о школе:")
    await bot.send_message(message.from_user.id, text=n)

#@dp.message_handler(commands=['meinfo'])
#async def School(message: types.Message):
    #await bot.send_message(message.from_user.id, "Немного обо мне", reply_markup=v4)

@dp.message_handler(commands = ['Links'])
async def urls(message: types.Message):
    await message.answer('Вот все имеющиеся ссылки. Для добавления персональной ссылки: https://t.me/Silendave', reply_markup=links)

@dp.message_handler(commands=['HomeWork'])
async def School(message: types.Message):
    await bot.send_message(message.from_user.id, "Выберите предмет по которому хотите получить домашнее задание:", reply_markup=ibs)

@dp.message_handler(commands = ['Facts'])
async def facts_for_all(message: types.Message):
    for ret in cur.execute('SELECT * FROM menu').fetchall():
        await bot.send_photo(message.from_user.id, ret[0], f'{ret[1]}\nОписание: {ret[2]}\nОценка {ret[-1]}')

@dp.message_handler(commands = ['SSP'])
async def games(message: types.Message):
    await message.answer('Ваш ход', reply_markup = button_zn_v)
    global m
    m = 1

@dp.message_handler()
async def msg(message: types.Message):
    if message.text == 'Закончим':
        await message.reply('Как скажете', reply_markup = ReplyKeyboardRemove())
        global m
        m = 0
    elif m == 1:
        try:
            if message.text == emoji.emojize(':victory_hand:') or message.text == emoji.emojize(':raised_hand:') or message.text == emoji.emojize(':raised_fist:'):
                vo = random.randint(1, 3)
                if vo == 1 and message.text == emoji.emojize(':victory_hand:'):
                    await message.answer(text=emoji.emojize(':victory_hand:'))
                    await message.answer('Ничья')
                elif vo == 1 and message.text == emoji.emojize(':raised_hand:'):
                    await message.answer(text=emoji.emojize(':victory_hand:'))
                    await message.answer('Вы проиграли')
                elif vo == 1 and message.text == ':fist:':
                    await message.answer(text=emoji.emojize(':victory_hand:'))
                    await message.answer('Вы победили')
                elif vo == 2 and message.text == emoji.emojize(':victory_hand:'):
                    await message.answer(text=emoji.emojize(':raised_hand:'))
                    await message.answer('Вы победили')
                elif vo == 2 and message.text == emoji.emojize(':raised_hand:'):
                    await message.answer(text=emoji.emojize(':raised_hand:'))
                    await message.answer('Ничья')
                elif vo == 2 and message.text == emoji.emojize(':raised_fist:'):
                    await message.answer(text=emoji.emojize(':raised_hand:'))
                    await message.answer('Вы проиграли')
                elif vo == 3 and message.text == emoji.emojize(':victory_hand:'):
                    await message.answer(text=emoji.emojize(':raised_fist:'))
                    await message.answer('Вы проиграли')
                elif vo == 3 and message.text == emoji.emojize(':raised_hand:'):
                    await message.answer(text=emoji.emojize(':raised_fist:'))
                    await message.answer('Вы победили')
                elif vo == 3 and message.text == emoji.emojize(':raised_fist:'):
                    await message.answer(text=emoji.emojize(':raised_fist:'))
                    await message.answer('Ничья')
        except:
            message.answer('Прошу выбрать один из вариантов. Если вы больше не желаете играть, напишите: Закончим')
    else:
        pass

if __name__ == '__main__':
    start_webhook(
        dispatcher=dp,
        webhook_path=WEBHOOK_PATH,
        skip_updates=True,
        on_startup=start_bot,
        host=WEBAPP_HOST,
        port=WEBAPP_PORT,
    )


Ответы (0 шт):