Создаю бота на Python с помощью aiogram, в котором одной из функций является проверка на подписку на несколько каналов
Я добавил эти каналы в БД SQLite, сделал цикл для перебора каждого канала и проверки. Но на выходе при использовании команды start у меня выходит два сообщения: ТЫ ПОДПИСАН, а потом ТЫ НЕ ПОДПИСАН. Знающие люди, помогите, пожалуйста.
import sqlite3
from aiogram.filters import CommandStart, Command
from aiogram.types import Message, ChatMemberLeft
from aiogram import Router, types, Bot
import app.keyboards as kb
import config
from config import TOKEN, CHANNELY
from database.data_base import c, db
router = Router()
bot = Bot(token=TOKEN)
@router.message(CommandStart)
async def command_start(message: Message):
try:
c.execute("INSERT OR IGNORE INTO users (user_id) VALUES (?)", (message.from_user.id,))
db.commit()
except sqlite3.Error as e:
print(f"Ошибка SQLite: {e}")
c.execute("SELECT channel_id FROM channels")
rows = c.fetchall()
channel_ids = [row[0] for row in rows]
for channel_id in channel_ids:
sub_check = await bot.get_chat_member(chat_id=channel_id, user_id=message.from_user.id)
if sub_check.status != 'left':
await message.answer('ТЫ ПОДПИСАН')
else:
await message.answer(text='ТЫ НЕ ПОДПИСАН'
Ответы (1 шт):
Автор решения: Paladin4ick
→ Ссылка
Берешь, удаляешь базу данных, и используешь простой JSON-файл.
Создаешь в нем список с id
нужных каналов.
А дальше с помощью get_chat_member()
пробегаешься по списку каналов, который загружаешь ранее из JSON-файла, и проверяешь статус человека, если он LEFT
- значит, участник не подписан, если MEMBER
- значит, подписан:
async def check_users_subscription(bot: Bot, user_id: int) -> bool:
user_status = await bot.get_chat_member(chat_id=id_канала), user_id=user_id)
return user_status.status in ["creator", "administrator", "member"]