Почему телеграмм аккаунт не получает информацию о новом участнике канала?

Хочу сделать скрипт, который мониторит новых пользователей в телеграмм канале и если новый пользователь есть в списке blacklist.txt, то его нужно заблокировать.

Вот код:

from telethon import TelegramClient, events
from telethon.tl.functions.channels import EditBannedRequest
from telethon.tl.types import ChatBannedRights
from datetime import datetime
import asyncio
import os

api_id = ...
api_hash = '...'
phone_number = '+...'
channel_invite_link = 'https://t.me/+...'

BAN_RIGHTS = ChatBannedRights(
    until_date=None,
    view_messages=True,
    send_messages=True,
    send_media=True,
    send_stickers=True,
    send_gifs=True,
    send_games=True,
    send_inline=True,
    embed_links=True,
)

client = TelegramClient('session_name', api_id, api_hash)

async def load_blacklist():
    try:
        with open('blacklist.txt', 'r') as f:
            blacklist = []
            for line in f:
                line = line.strip()
                if line:
                    if line.isdigit():
                        blacklist.append(int(line))
                    else:
                        blacklist.append(line.lower())
            return list(set(blacklist))
    except FileNotFoundError:
        print(f"[{datetime.now()}] ⚠️ Файл blacklist.txt не найден! Создайте его.")
        return []

async def ban_user(user, channel):
    try:
        await client(EditBannedRequest(
            channel=channel,
            participant=user,
            banned_rights=BAN_RIGHTS
        ))
        username = f"@{user.username}" if user.username else "нет username"
        log_msg = f"[{datetime.now()}] ✅ Забанен: {username} (ID: {user.id})"
        print(log_msg)
        with open('banned.log', 'a', encoding='utf-8') as log_file:
            log_file.write(log_msg + "\n")
        await asyncio.sleep(1)
        return True
    except Exception as e:
        username = f"@{user.username}" if user.username else "нет username"
        error_msg = f"[{datetime.now()}] ❌ Ошибка при бане {username} (ID: {user.id}): {str(e)}"
        print(error_msg)
        with open('error.log', 'a', encoding='utf-8') as error_file:
            error_file.write(error_msg + "\n")
        return False


@client.on(events.ChatAction)
async def handler(event):
    if event.user_joined or event.user_added:
        user = await event.get_user()
        channel = await event.get_chat()
        blacklist = await load_blacklist()

        user_identifier = user.username.lower() if user.username else None

        if (user_identifier and user_identifier in blacklist) or (user.id in blacklist):
            await ban_user(user, channel)


async def main():
    print(f"[{datetime.now()}] ? Мониторинг новых участников включён.")
    await client.get_entity(channel_invite_link)  # Убедиться, что подключены к каналу
    await client.run_until_disconnected()


if __name__ == '__main__':
    with client:
        client.loop.run_until_complete(main())

Но почему при входе в канал с аккаунта ID, который в blacklist.txt, он не блокируется?


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

Автор решения: Simon

Вообще явно выявить проблему у меня не выходит, но есть идеи. Для начала проверь есть ли у бота права администратора, это самая простая ошибка, потом убедись, что канал является "супергруппой"(с банами короче). Также у тебя в этом блоке

@client.on(events.ChatAction)
async def handler(event):
    if event.user_joined or event.user_added:
        user = await event.get_user()
        channel = await event.get_chat()
        blacklist = await load_blacklist()

        user_identifier = user.username.lower() if user.username else None

        if (user_identifier and user_identifier in blacklist) or (user.id in blacklist):
            await ban_user(user, channel)

небольшая логическая ошибка из-за которой может не корректно добавляется в блэклист юзеры.

user_identifier = user.username.lower() if user.username else None

Он не учитывает ID юзеров в виде строки в блэклисте. Вот примерное решение, попробуй заменить:

if event.user_joined or event.user_added:
    user = await event.get_user ()
    blacklist = await load_blacklist()
# Проверяем все возможные идентификаторы
    identifiers = [
        str(user.id),
        user. username. lower() if user username else None, f"@{user

надеюсь поможет

→ Ссылка