Почему телеграмм аккаунт не получает информацию о новом участнике канала?
Хочу сделать скрипт, который мониторит новых пользователей в телеграмм канале и если новый пользователь есть в списке 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 шт):
Вообще явно выявить проблему у меня не выходит, но есть идеи. Для начала проверь есть ли у бота права администратора, это самая простая ошибка, потом убедись, что канал является "супергруппой"(с банами короче). Также у тебя в этом блоке
@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
надеюсь поможет