как написать телеграм-бота с помощью библиотеки telebot(aiogram), чтобы бот мог из каналов заносить текст появляющихся оттуда постов в базу данных?

Как написать телеграм-бота с помощью библиотеки telebot(aiogram), чтобы бот мог из списка определенных каналов заносить текст появляющихся оттуда постов в базу данных? Мне нужно, чтобы бот из определенных источников (TG-каналов) мог брать текст появляющихся там постов и заносить в базу данных. Написать клиент на pyrogram - более сложный вариант, потому что придется сочетать работу pyrogram (как раз-таки заполнение бд новыми постами) и обычного телеграм-бота, который должен выводить сообщения при контакте с пользователем (выводить с периодичностью обработанные посты из бд). Если можно как-то совместить эти две библиотеки, запуская одновременно, или написать типа "парсера" ТГканалов на телеботе (или aiogram), то буду благодарна примеру Вашего решения!

Мои попытки написать парсер на aiogram:

import asyncio
from aiogram import Bot, Dispatcher, F, types
from aiogram.types import Message, ContentType
from aiogram.filters import Command
import sqlite3

token = 'my_token'


# Подключение к базе данных

conn = sqlite3.connect('posts.db')
cursor = conn.cursor()


# Создание таблицы для хранения постов

cursor.execute('''
    CREATE TABLE IF NOT EXISTS posts (
        id INTEGER PRIMARY KEY,
        channel TEXT,
        text TEXT
    )
''')
conn.commit()



# Функция для обработки новых постов

async def handle_new_post(message: Message):
    # Проверяем, является ли канал отправителя разрешенным
    if message.chat.username in usernames_public:
        # Сохраняем текст поста в базу данных
        cursor.execute("INSERT INTO posts (channel, text) VALUES (?, ?)", (message.chat.username, message.text))
        conn.commit()
        await message.answer("Пост сохранен в базе данных!")
    else:
        await message.answer("Вы не имеете доступа к отправке сообщений в этот канал.")
    print()
    cursor.execute("SELECT text FROM posts")
    selected_posts = cursor.fetchall()
    print(selected_posts)

usernames_public = []


# Функция, записывающая название канала из пересланного пользователем сообщения (для #создания списка каналов, откуда будут записываться посты в бд)


async def get_channel_name(message: Message, bot: Bot):
    forwarded_channel_info = message.forward_from_chat
    channel_id = forwarded_channel_info.id
    channel_title = forwarded_channel_info.title
    channel_username = forwarded_channel_info.username
    about_channel = (channel_id, channel_title, channel_username)
    await bot.send_message(message.chat.id, f"Сообщение переслано из канала {channel_title} (username: {channel_username})")
    if channel_id not in source_public_ids:
        source_public_ids.append(channel_id)
        usernames_public.append(channel_username)
        source_public.append(about_channel)
        await bot.send_message(message.chat.id, f"Канал {channel_title} добавлен")
    else:
        await bot.send_message(message.chat.id, f"Канал {channel_title} уже добавлен")
    print(source_public_ids)


async def start():
    bot = Bot(token=token, parse_mode='HTML')
    dp = Dispatcher()
    dp.message.register(get_channel_name, F.forward_from_chat.type == "channel")
    dp.message.register(handle_new_post, F.text == True) #& F.chat.type == "channel" , не знаю, как оформить фильтр только постов из каналов
    dp.message.register(get_hello)
    try:
        await dp.start_polling(bot)
    finally:
        await bot.session.close()


if __name__ == "__main__":
    asyncio.run(start())


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