@bybacapitan

Как сделать правильно?

При создании бота пришел к тому что хранить все в одной файле не разумно и не удобно, решил разделить по разным.
Но столкнулся с проблемой.
Использую библиотеку aiogram.
62739195b1159485800998.jpeg
Вот моя директория, код __init__.py :
from handlers import text
from handlers import tiktok

Вот код create_bot.py :
import os
import config
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher

bot = Bot(token=config.TOKEN)
dp = Dispatcher(bot)

main1.py
from aiogram.utils import executor
from create_bot import dp



async def on_startup(_):
    print('Бот запущен')



from handlers import text
from handlers import tiktok




text.register_handlers_text(dp)
tiktok.register_handlers_tiktok(dp)

if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True, on_startup=on_startup)

text.py :
from aiogram import types, Dispatcher
from create_bot import dp, bot


#@dp.message_handler()
async def text1(message:types.Message):
    if "привет" in message.text.lower():
        await bot.send_message(message.chat.id, "привет!")  

def register_handlers_text(dp : Dispatcher):
    dp.register_message_handler(text1)


И вот основной код который скачивает тиктоки
tiktok.py :
import requests
import os

from aiogram import Dispatcher, types
from tiktok_downloader import snaptik
from create_bot import dp, bot



def download_video(video_url, name):
    r = requests.get(video_url, allow_redirects=True)
    content_type = r.headers.get('content-type')
    if content_type == 'video/mp4':
        open(f'./videos/video{name}.mp4', 'wb').write(r.content)
    else:
        pass


if not os.path.exists('videos'):
    os.makedirs('videos')

#@dp.message_handler(commands=['start', 'help'])
async def start(message: types.Message):
    await bot.send_message(message.chat.id, text='привет')

#@dp.message_handler(content_types=['text'])
async def tiktokdownloader(message: types.Message):
    message_id_to_delete = message.message_id
    if message.text.startswith('https://www.tiktok.com'):
        await bot.send_message(chat_id=message.chat.id, text='скачиваю')
        video_url = message.text
        try:
            snaptik(video_url).get_media()[0].download(f"./videos/result_{message.from_user.id}.mp4")
            path = f'./videos/result_{message.from_user.id}.mp4'
            with open(f'./videos/result_{message.from_user.id}.mp4', 'rb') as file:
                await bot.send_video(
                    chat_id=message.chat.id,
                    video=file.read(),
                    )
            await bot.delete_message(message.chat.id, message_id_to_delete)
            await bot.delete_message(message.chat.id, message.message_id + 1)
            os.remove(path)
        except Exception as e:
            print(e)
            await bot.send_message(chat_id=message.chat.id,
                                   text='я не могу это скачать')
    
    elif message.text.startswith('https://vm.tiktok.com') or message.text.startswith('http://vm.tiktok.com'):
        await bot.send_message(chat_id=message.chat.id, text='скачиваю')
        video_url = message.text
        try:
            snaptik(video_url).get_media()[0].download(f"./videos/result_{message.from_user.id}.mp4")
            path = f'./videos/result_{message.from_user.id}.mp4'
            with open(f'./videos/result_{message.from_user.id}.mp4', 'rb') as file:
                await bot.send_video(
                    chat_id=message.chat.id,
                    video=file.read(),
                    )
            await bot.delete_message(message.chat.id, message_id_to_delete)
            await bot.delete_message(message.chat.id, message.message_id + 1)
            os.remove(path)
        except Exception as e:
            print(e)
            await bot.send_message(chat_id=message.chat.id,
                                   text='я не могу это скачать')
    
    elif message.text.startswith('https://vt.tiktok.com') or message.text.startswith('http://vt.tiktok.com'):
        await bot.send_message(chat_id=message.chat.id, text='скачиваю')
        video_url = message.text
        try:
            snaptik(video_url).get_media()[0].download(f"./videos/result_{message.from_user.id}.mp4")
            path = f'./videos/result_{message.from_user.id}.mp4'
            with open(f'./videos/result_{message.from_user.id}.mp4', 'rb') as file:
                await bot.send_video(
                    chat_id=message.chat.id,
                    video=file.read(),
                    )
                
            await bot.delete_message(message.chat.id, message_id_to_delete)
            await bot.delete_message(message.chat.id, message.message_id + 1)
            os.remove(path)
        except Exception as e:
            print(e)
            await bot.send_message(chat_id=message.chat.id,
                                   text='я не могу это скачать')


def register_handlers_tiktok(dp : Dispatcher):
    dp.register_message_handler(start, commands=['start', 'help'])
    dp.register_message_handler(tiktokdownloader)


При запуске бота, не работает tiktok.py, но работает text.py .
Если убрать импорт text'a начинает работать и tiktok.
Пожалуйста помогите решить проблему.
  • Вопрос задан
  • 5583 просмотра
Решения вопроса 1
@twistfire92
Python backend developer
Один хендлер перекрывает другой
dp.register_message_handler(tiktokdownloader, lambda message: message.text.startswith('http'))


и местами поменять очередность
tiktok.register_handlers_tiktok(dp)
text.register_handlers_text(dp)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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