diff --git a/main.py b/main.py index 4b40080..75c4d95 100644 --- a/main.py +++ b/main.py @@ -8,7 +8,7 @@ logger = logging.getLogger(__name__) async def main(): logger.debug("Инициализация Worker") - async with Worker() as worker: + async with Worker(lang_code="ru") as worker: # Russian for SpamBot check logger.debug("Worker успешно инициализирован") await worker.check_all() logger.debug("Worker завершил работу") diff --git a/modules/checker.py b/modules/checker.py index 5bc682d..f1efa0b 100644 --- a/modules/checker.py +++ b/modules/checker.py @@ -27,6 +27,7 @@ class Result: me: Optional[User] = None stars: Optional[int] = None country: Optional[str] = None + spamblock: Optional[bool] = None contacts: Optional[List[User]] = None chats: Optional[List[Chat]] = None @@ -35,9 +36,10 @@ class Result: class Checker: - def __init__(self, path: Path, temp_path: Path): + def __init__(self, path: Path, temp_path: Path, lang_code: str = "en"): self.path = path self.temp_path = temp_path + self.lang_code = lang_code self.client = None logger.debug(f"Создание экземпляра Checker для пути: {path}") try: @@ -53,7 +55,7 @@ class Checker: logger.error("TDATA не инициализирована") raise SessionInvalid() try: - await self.__ensure_client() + await self.__ensure_client(lang_code=self.lang_code) except (OpenTeleException, Exception) as e: logger.error(f"Не удалось инициализировать клиент: {e}") raise SessionInvalid() @@ -68,10 +70,10 @@ class Checker: except Exception as e: logger.warning(f"Ошибка при отключении клиента: {e}") - async def __ensure_client(self): + async def __ensure_client(self, lang_code: str = "en"): if self.client is None: - logger.debug("Конвертация TDATA в Telethon клиент") - self.client = await self.desktop.convert() + logger.debug(f"Конвертация TDATA в Telethon клиент с языком '{lang_code}'") + self.client = await self.desktop.convert(lang_code=lang_code) logger.debug("Telethon клиент успешно создан") async def check_stars(self, me: User) -> int: @@ -160,6 +162,39 @@ class Checker: logger.warning(f"Не удалось проверить админские права: {e}") return [] + async def check_spamblock(self) -> bool: + logger.debug("Проверка spamblock через @SpamBot") + try: + await self.client.send_message("@SpamBot", "/start") + logger.debug("Отправлено сообщение /start в @SpamBot") + + # Ждем ответ от SpamBot + import asyncio + + await asyncio.sleep(2) + + # Получаем последние сообщения от SpamBot + messages = await self.client.get_messages("@SpamBot", limit=1) + + if messages and len(messages) > 0: + response_text = messages[0].message + logger.debug(f"Ответ от SpamBot: {response_text[:50]}...") + + # Проверяем, содержит ли ответ текст об отсутствии ограничений + if "свободен от каких-либо ограничений" in response_text.lower(): + logger.debug("Аккаунт не имеет spamblock") + return False + else: + logger.debug("Аккаунт имеет spamblock") + return True + else: + logger.warning("Не удалось получить ответ от SpamBot") + return None + + except Exception as e: + logger.warning(f"Не удалось проверить spamblock: {e}") + return None + async def check_all(self) -> Result: logger.debug("Начало полной проверки аккаунта") try: @@ -172,6 +207,7 @@ class Checker: stars = await self.check_stars(me=me) country = await self.check_country(me=me) + spamblock = await self.check_spamblock() contacts = await self.check_contacts() chats = await self.check_chats() channels = await self.check_channels(chats=chats) if chats else [] @@ -184,6 +220,7 @@ class Checker: me=me, stars=stars, country=country, + spamblock=spamblock, contacts=contacts, chats=chats, channels=channels, diff --git a/modules/tdata.py b/modules/tdata.py index c902098..b85b2ae 100644 --- a/modules/tdata.py +++ b/modules/tdata.py @@ -107,7 +107,7 @@ class TDATA: logger.debug("Отключение клиента после валидации") await client.disconnect() - async def convert(self) -> TelegramClient: + async def convert(self, lang_code: str = "en") -> TelegramClient: logger.debug("Начало конвертации TDATA в Telethon сессию") if not await self.validate(): logger.error("TDATA невалидна, конвертация невозможна") @@ -116,9 +116,9 @@ class TDATA: tempPath = self.__gen_session_path() try: - logger.debug(f"Создание Telethon сессии по пути '{tempPath}'") + logger.debug(f"Создание Telethon сессии по пути '{tempPath}' с языком '{lang_code}'") client = await self.desktop.ToTelethon( - session=tempPath, flag=UseCurrentSession, api=self.api + session=tempPath, flag=UseCurrentSession, api=self.api, lang_code=lang_code ) logger.debug("Валидация созданной сессии") diff --git a/modules/thread.py b/modules/thread.py index 5c05b9b..2d25ade 100644 --- a/modules/thread.py +++ b/modules/thread.py @@ -16,17 +16,23 @@ class Worker: input_path: str = "tdata", output_path: str = "data", temp_path: str = "temp", + lang_code: str = "en", ): - logger.debug(f"Инициализация Worker с путями: input={input_path}, output={output_path}, temp={temp_path}") + logger.debug( + f"Инициализация Worker с путями: input={input_path}, output={output_path}, temp={temp_path}, lang={lang_code}" + ) self.input_path = Path(input_path).absolute() self.output_path = Path(output_path).absolute() self.temp_path = Path(temp_path).absolute() + self.lang_code = lang_code self.valid_path = self.output_path.joinpath("valid") self.invalid_path = self.output_path.joinpath("invalid") self.all_path = self.valid_path.joinpath("all.txt") - logger.debug(f"Пути настроены: valid={self.valid_path}, invalid={self.invalid_path}") + logger.debug( + f"Пути настроены: valid={self.valid_path}, invalid={self.invalid_path}" + ) async def __aenter__(self): logger.debug("Вход в контекстный менеджер Worker") @@ -105,10 +111,15 @@ class Worker: logger.debug(f"Не удалось получить флаг для страны '{result.country}': {e}") flag = "🌐" + spamblock_status = "unknown" + if result.spamblock is not None: + spamblock_status = "true" if result.spamblock else "false" + return ( - f"👤 [{flag} {result.country}] {result.me.phone} — {result.me.id}\n" + f"👤 [{flag} {result.country}] +{result.me.phone} — {result.me.id}\n" f"⭐️ {result.stars}\n" f"💎 Premium: {'true' if result.me.premium else 'false'}\n" + f"🚫 Spamblock: {spamblock_status}\n" f"👥 {len(result.chats)}/{len(result.contacts)}\n" f"🍀 {len(result.admin_channels)}" ) @@ -162,11 +173,17 @@ class Worker: logger.info(f"Проверка TDATA: {tdata.name}") try: - async with Checker(path=tdata_absolute, temp_path=self.temp_path) as checker: + async with Checker( + path=tdata_absolute, temp_path=self.temp_path, lang_code=self.lang_code + ) as checker: result = await checker.check_all() - logger.info(f"Проверка завершена: {result.me.first_name} (+{result.me.phone})") - self.__save_valid(user_id=result.me.id, result=result, tdata=tdata_absolute) + logger.info( + f"Проверка завершена: {result.me.first_name} (+{result.me.phone})" + ) + self.__save_valid( + user_id=result.me.id, result=result, tdata=tdata_absolute + ) except SessionInvalid: logger.warning(f"TDATA невалидна: {tdata.name}")