как написать телеграм-бота с помощью библиотеки 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())