Загрузка данных
import asyncio
from datetime import datetime, timedelta, timezone
from telethon import TelegramClient
from telethon.errors import (
ChannelPrivateError,
FloodWaitError,
UsernameInvalidError,
UsernameNotOccupiedError,
)
API_ID = 35901392
API_HASH = "08ab29c9da01a4f3eaf10f3baa7200f2"
SESSION_NAME = "session_acc3"
INPUT_FILE = "usernames.txt"
FILE_KEEP = "keep.txt"
FILE_REMOVE = "remove.txt"
# Стоп-слова (отсекаем спам, крипту, гейминг)
STOP_WORDS = [
"airdrop",
"token",
"presale",
"forex",
"binance",
"trading",
"signals",
"apk mod",
"pubg",
"free fire",
"casino",
"betting",
"giveaway",
"investment",
"gift card",
]
# Платформы (Trigger A)
PLATFORMS = [
"o365",
"office 365",
"office365",
"microsoft 365",
"m365",
"azure ad",
"entra id",
"exchange online",
"outlook",
"webmail",
"cpanel",
"roundcube",
"zimbra",
]
# Маркеры доступов / почтовой инфраструктуры (Trigger B)
VECTORS = [
"estsaauth",
"session cookie",
"tdata",
"refresh token",
"user:pass",
"mail:pass",
"stealer logs",
"fwd rule",
"forwarding rule",
"inbox rule",
"global admin",
"smtp relay",
"mailer",
"inbox delivery",
"bulletproof",
"corporate leads",
"corp domain",
"business lead",
"inbox fwd",
"tenant",
"valid rate",
"mail access",
"imap logs",
"mailbase",
]
def has_cyrillic(text: str) -> bool:
return any("\u0400" <= char <= "\u04ff" for char in text.lower())
def is_100_bec(text_lower: str) -> bool:
if any(stop in text_lower for stop in STOP_WORDS):
return False
has_platform = any(p in text_lower for p in PLATFORMS)
if not has_platform:
return False
has_vector = any(v in text_lower for v in VECTORS)
has_direct_bec = "bec" in text_lower and (
"o365" in text_lower or "email" in text_lower
)
return has_vector or has_direct_bec
async def append_to(filename: str, username: str):
with open(filename, "a", encoding="utf-8") as f:
f.write(f"@{username}\n")
async def inspect_chat(client, entity):
now = datetime.now(timezone.utc)
one_day_ago = now - timedelta(days=1)
messages_24h = []
text_corpus = []
senders = set()
try:
async for msg in client.iter_messages(entity, limit=25):
if msg.text:
text_corpus.append(msg.text)
if msg.date and msg.date >= one_day_ago:
messages_24h.append(msg)
sender = msg.sender_id or msg.from_id
if sender:
senders.add(sender)
except Exception:
pass
is_active = len(messages_24h) >= 3 and len(senders) >= 2
return is_active, " ".join(text_corpus)
async def main():
try:
with open(INPUT_FILE, "r", encoding="utf-8") as f:
raw_lines = [line.strip() for line in f if line.strip()]
except FileNotFoundError:
print(f"Ошибка: Создайте файл {INPUT_FILE}")
return
usernames = []
for line in raw_lines:
clean = line.split("|")[0].split()[0].replace("@", "").strip()
if clean:
usernames.append(clean)
print(f"Загружено {len(usernames)} строк. Запуск фильтрации...")
async with TelegramClient(SESSION_NAME, API_ID, API_HASH) as client:
for idx, username in enumerate(usernames, 1):
while True:
try:
entity = await client.get_entity(username)
title = getattr(entity, "title", "") or ""
is_active, chat_body = await inspect_chat(client, entity)
full_text = f"{title} {chat_body}".strip()
full_text_lower = full_text.lower()
if (
has_cyrillic(full_text)
or not is_active
or not is_100_bec(full_text_lower)
):
await append_to(FILE_REMOVE, username)
print(f"[{idx}/{len(usernames)}] [REMOVE]: @{username}")
else:
await append_to(FILE_KEEP, username)
print(f"[{idx}/{len(usernames)}] [KEEP]: @{username}")
break
except (
UsernameInvalidError,
UsernameNotOccupiedError,
ValueError,
ChannelPrivateError,
):
await append_to(FILE_REMOVE, username)
print(f"[{idx}/{len(usernames)}] [REMOVE - Недоступен]: @{username}")
break
except FloodWaitError as e:
print(f"Лимит Telegram. Ждем {e.seconds} сек...")
await asyncio.sleep(e.seconds + 2)
except Exception:
await append_to(FILE_REMOVE, username)
print(f"[{idx}/{len(usernames)}] [REMOVE - Ошибка]: @{username}")
break
await asyncio.sleep(2.0)
print("\nГотово! Списки сохранены в keep.txt и remove.txt")
if __name__ == "__main__":
asyncio.run(main())