Всем привет, с сентября прошлого года пытаюсь организовать полностью автоматическую систему которая настраивает аккаунты, подписывается на каналы, пишет комментарии под посты, пишет посты в новостном канале с пересылкой и прогонкой через нейронку с подбором подходящего медиа под пост. И у меня такая проблема - аккаунты или банятся или вылетают сессии с ошибкой [401 AUTH_KEY_UNREGISTERED] (caused by "updates.GetState") Pyrogram 2.2.10 thinks: The specified authorization key is not registered in the system (for example, a PFS temporary key has expired). Или же при блокировке аккаунта [401 USER_DEACTIVATED_BAN] (caused by "updates.GetState") Pyrogram 2.2.10 thinks: The current account was deleted and banned by Telegram's antispam system.←[0m Суть в том, что аккаунты отлетают даже после входа через апи, т.е. единственное что было сделано с аккаунтом, это вход через API, и в этот же момент может прилететь ошибка 1 или 2. Прилетают они случайно - могут через час, могут через 5 секунд. Но это происходит с каждым аккаунтом. Видел похожие темы на лолзе, но ни один вариант мне не помог. Т.е. я пробовал: разные ****** разных стран, подмена system_version например 4.16.30-vxYOUR_TEXT и тд, подмена device_model например на "iPhone 13 Pro Max" и другие что писали на форумах, запускать код с дедика/виртуальной машины. Пробовал и telethon и pyrogram, пробовал ставить APP ID и APP HASH свои новые которые регал на мутелеграморг и пробовал официальные от тг десктоп тг веб тг андроид. Пробовал разные способы авторизации, использовал готовые session telethon/pyrogram с маркета, пробовал делать свои, делал их из Tdata, пробовал брать старые session которым по несколько лет(у меня лежал пак акков тг с 18 года). Каждый раз был один результат: или бан антиспам системой или же вылет сессии. ****** если что использовал с разных сайтов, - резидентские, общие, мобильные, мобильные где свитч айпи происходит. Лучший результат показывали аккаунты индонезии, они живут дольше других но тоже отлетают. пробовал номера: Мьянма, индонезия, США, Канада, Россия Кто в теме - помогите пожалуйста, скоро будет год как вожусь с этим и решения так и не нашёл. пример кода который используется для чека спам/гео блока на pyrogram: import asyncio import json import logging import os from datetime import datetime from pyrogram import Client, filters # === НАСТРОЙКИ === ACCOUNT_FILE = "1.json" SESSION_DIR = os.path.basename(os.path.dirname(os.path.abspath(__file__))) # Логирование logging.basicConfig(level=logging.INFO, format="%(message)s") logger = logging.getLogger() class Color: INFO = '\033[96m' SUCCESS = '\033[92m' WARNING = '\033[93m' ERROR = '\033[91m' RESET = '\033[0m' DATE = '\033[91m' NUMERIC = '\033[93m' def read_json(filename): with open(filename, 'r', encoding='utf-8') as f: return json.load(f) def format_time_left(time_left): days = time_left.days hours, remainder = divmod(time_left.seconds, 3600) minutes, seconds = divmod(remainder, 60) parts = [] if days > 0: parts.append(f"{Color.NUMERIC}{days} день{'а' if days > 1 else ''}{Color.RESET}") if hours > 0: parts.append(f"{Color.NUMERIC}{hours} час{'а' if hours > 1 else ''}{Color.RESET}") if minutes > 0: parts.append(f"{Color.NUMERIC}{minutes} минут{'ы' if minutes > 1 else ''}{Color.RESET}") if seconds > 0: parts.append(f"{Color.NUMERIC}{seconds} секунд{'ы' if seconds > 1 else ''}{Color.RESET}") return ' '.join(parts) async def check_spambot(app): try: await asyncio.sleep(2) await app.send_message("@spambot", "/start") @app.on_message(filters.user(178220800)) async def handler(client, message): text = message.text logger.info(f"{Color.INFO}[ACC {SESSION_DIR}] Полученный ответ от @spambot:{Color.RESET}") if "Ограничения будут автоматически сняты" in text: date_line = text.split("Ограничения будут автоматически сняты ")[1].split(".")[0] end_time = datetime.strptime(date_line, "%d %b %Y, %H:%M UTC") left = end_time - datetime.utcnow() logger.info(f"{Color.ERROR}[ACC {SESSION_DIR}] Временный бан. Конец: {Color.DATE}{date_line} | Осталось:({format_time_left(left)}){Color.RESET}") elif "Your account will be automatically released on" in text: date_line = text.split("Your account will be automatically released on ")[1].split(".")[0] end_time = datetime.strptime(date_line, "%d %b %Y, %H:%M UTC") left = end_time - datetime.utcnow() logger.info(f"{Color.ERROR}[ACC {SESSION_DIR}] Временный бан. Конец: {Color.DATE}{date_line} | Осталось:({format_time_left(left)}){Color.RESET}") elif "излишне сурово реагирует на некоторые номера" in text or "Unfortunately, some phone numbers may trigger a harsh response" in text: logger.info(f"{Color.WARNING}[ACC {SESSION_DIR}] Геоблокировка! Телеграм подозревает номер. Нужно подождать.{Color.RESET}") elif "on forever" in text.lower() or "навсегда" in text.lower(): logger.info(f"{Color.ERROR}[ACC {SESSION_DIR}] Вечный спамблок на аккаунте!{Color.RESET}") elif "Good news, no limits are currently applied to your account" in text or "Ваш аккаунт свободен от каких-либо ограничений" in text: logger.info(f"{Color.SUCCESS}[ACC {SESSION_DIR}] Аккаунт чист! Ограничений нет !{Color.RESET}") else: logger.warning(f"{Color.WARNING}[ACC {SESSION_DIR}] Неизвестный ответ от @spambot:\n{text}{Color.RESET}") await asyncio.sleep(5) except Exception as e: logger.error(f"{Color.ERROR}[ACC {SESSION_DIR}] Ошибка при проверке через @spambot: {e}{Color.RESET}") async def main(): account = read_json(ACCOUNT_FILE) proxy_list = account.get("proxy") proxy = { "scheme": "socks5", # SOCKS5 "hostname": "(", "port": (, "username": "(", "password": "(" } attempt = 1 app = None while True: try: logger.info(f"{Color.INFO}[ACC {SESSION_DIR}] Попытка подключения: {Color.NUMERIC}{attempt}{Color.RESET}") start_time = datetime.utcnow() app = Client( name=account["session_file"], api_id=account["app_id"], api_hash=account["app_hash"], device_model=account["device"], system_version=account["sdk"], app_version=account["app_version"], lang_code=account["lang_code"], proxy=proxy ) await app.start() elapsed = datetime.utcnow() - start_time logger.info(f"{Color.SUCCESS}[ACC {SESSION_DIR}] Подключение успешно за {Color.NUMERIC}{elapsed.total_seconds():.2f} секунд!{Color.RESET}") me = await app.get_me() if me: logger.info(f"{Color.SUCCESS}[ACC {SESSION_DIR}] Авторизация успешна: {account['device']}{Color.RESET}") await check_spambot(app) logger.info(f"{Color.INFO}[ACC {SESSION_DIR}] Аккаунт активен 5 секунд...{Color.RESET}") await asyncio.sleep(5) await app.stop() logger.info(f"{Color.SUCCESS}[ACC {SESSION_DIR}] Клиент завершён корректно!{Color.RESET}") break else: logger.error(f"{Color.ERROR}[ACC {SESSION_DIR}] Не авторизован! Проверь сессию.{Color.RESET}") await app.stop() break except Exception as e: elapsed = datetime.utcnow() - start_time logger.error(f"{Color.ERROR}[ACC {SESSION_DIR}] Ошибка за {Color.NUMERIC}{elapsed.total_seconds():.2f} секунд: {e}{Color.RESET}") attempt += 1 await asyncio.sleep(3) if __name__ == "__main__": try: asyncio.run(main()) except RuntimeError as e: if str(e) != 'Event loop is closed': raise Python import asyncio import json import logging import os from datetime import datetime from pyrogram import Client, filters # === НАСТРОЙКИ === ACCOUNT_FILE = "1.json" SESSION_DIR = os.path.basename(os.path.dirname(os.path.abspath(__file__))) # Логирование logging.basicConfig(level=logging.INFO, format="%(message)s") logger = logging.getLogger() class Color: INFO = '\033[96m' SUCCESS = '\033[92m' WARNING = '\033[93m' ERROR = '\033[91m' RESET = '\033[0m' DATE = '\033[91m' NUMERIC = '\033[93m' def read_json(filename): with open(filename, 'r', encoding='utf-8') as f: return json.load(f) def format_time_left(time_left): days = time_left.days hours, remainder = divmod(time_left.seconds, 3600) minutes, seconds = divmod(remainder, 60) parts = [] if days > 0: parts.append(f"{Color.NUMERIC}{days} день{'а' if days > 1 else ''}{Color.RESET}") if hours > 0: parts.append(f"{Color.NUMERIC}{hours} час{'а' if hours > 1 else ''}{Color.RESET}") if minutes > 0: parts.append(f"{Color.NUMERIC}{minutes} минут{'ы' if minutes > 1 else ''}{Color.RESET}") if seconds > 0: parts.append(f"{Color.NUMERIC}{seconds} секунд{'ы' if seconds > 1 else ''}{Color.RESET}") return ' '.join(parts) async def check_spambot(app): try: await asyncio.sleep(2) await app.send_message("@spambot", "/start") @app.on_message(filters.user(178220800)) async def handler(client, message): text = message.text logger.info(f"{Color.INFO}[ACC {SESSION_DIR}] Полученный ответ от @spambot:{Color.RESET}") if "Ограничения будут автоматически сняты" in text: date_line = text.split("Ограничения будут автоматически сняты ")[1].split(".")[0] end_time = datetime.strptime(date_line, "%d %b %Y, %H:%M UTC") left = end_time - datetime.utcnow() logger.info(f"{Color.ERROR}[ACC {SESSION_DIR}] Временный бан. Конец: {Color.DATE}{date_line} | Осталось:({format_time_left(left)}){Color.RESET}") elif "Your account will be automatically released on" in text: date_line = text.split("Your account will be automatically released on ")[1].split(".")[0] end_time = datetime.strptime(date_line, "%d %b %Y, %H:%M UTC") left = end_time - datetime.utcnow() logger.info(f"{Color.ERROR}[ACC {SESSION_DIR}] Временный бан. Конец: {Color.DATE}{date_line} | Осталось:({format_time_left(left)}){Color.RESET}") elif "излишне сурово реагирует на некоторые номера" in text or "Unfortunately, some phone numbers may trigger a harsh response" in text: logger.info(f"{Color.WARNING}[ACC {SESSION_DIR}] Геоблокировка! Телеграм подозревает номер. Нужно подождать.{Color.RESET}") elif "on forever" in text.lower() or "навсегда" in text.lower(): logger.info(f"{Color.ERROR}[ACC {SESSION_DIR}] Вечный спамблок на аккаунте!{Color.RESET}") elif "Good news, no limits are currently applied to your account" in text or "Ваш аккаунт свободен от каких-либо ограничений" in text: logger.info(f"{Color.SUCCESS}[ACC {SESSION_DIR}] Аккаунт чист! Ограничений нет !{Color.RESET}") else: logger.warning(f"{Color.WARNING}[ACC {SESSION_DIR}] Неизвестный ответ от @spambot:\n{text}{Color.RESET}") await asyncio.sleep(5) except Exception as e: logger.error(f"{Color.ERROR}[ACC {SESSION_DIR}] Ошибка при проверке через @spambot: {e}{Color.RESET}") async def main(): account = read_json(ACCOUNT_FILE) proxy_list = account.get("proxy") proxy = { "scheme": "socks5", # SOCKS5 "hostname": "(", "port": (, "username": "(", "password": "(" } attempt = 1 app = None while True: try: logger.info(f"{Color.INFO}[ACC {SESSION_DIR}] Попытка подключения: {Color.NUMERIC}{attempt}{Color.RESET}") start_time = datetime.utcnow() app = Client( name=account["session_file"], api_id=account["app_id"], api_hash=account["app_hash"], device_model=account["device"], system_version=account["sdk"], app_version=account["app_version"], lang_code=account["lang_code"], proxy=proxy ) await app.start() elapsed = datetime.utcnow() - start_time logger.info(f"{Color.SUCCESS}[ACC {SESSION_DIR}] Подключение успешно за {Color.NUMERIC}{elapsed.total_seconds():.2f} секунд!{Color.RESET}") me = await app.get_me() if me: logger.info(f"{Color.SUCCESS}[ACC {SESSION_DIR}] Авторизация успешна: {account['device']}{Color.RESET}") await check_spambot(app) logger.info(f"{Color.INFO}[ACC {SESSION_DIR}] Аккаунт активен 5 секунд...{Color.RESET}") await asyncio.sleep(5) await app.stop() logger.info(f"{Color.SUCCESS}[ACC {SESSION_DIR}] Клиент завершён корректно!{Color.RESET}") break else: logger.error(f"{Color.ERROR}[ACC {SESSION_DIR}] Не авторизован! Проверь сессию.{Color.RESET}") await app.stop() break except Exception as e: elapsed = datetime.utcnow() - start_time logger.error(f"{Color.ERROR}[ACC {SESSION_DIR}] Ошибка за {Color.NUMERIC}{elapsed.total_seconds():.2f} секунд: {e}{Color.RESET}") attempt += 1 await asyncio.sleep(3) if __name__ == "__main__": try: asyncio.run(main()) except RuntimeError as e: if str(e) != 'Event loop is closed': raise
MK_Shop, а как часто слетает? может логичнее автозамену аккаунтов сделать просто и грузить например 10 на неделю
fishinstruktor, часто слетают после просто авторизации ещё до выполнения каких-либо действий, пачками
MK_Shop, просто мой тебе совет попробуй собрать на make за день такой скрипт, это бесплатно и слетать ничего не будет тк там через бота или постбота воркает связка
Откуда берешь аккаунты? Сразу покупаешь на маркете и заходишь в них? Что если не получать api hash и api id, а скачать сессию и через него авторизоваться?
Xindy, отредактировал пост и прикрепил в него пример кода который используется для написания в @spambot для проверки гео/спам блока
Thor, отредактировал пост и прикрепил в него пример кода который используется для написания в @spambot для проверки гео/спам блока
KLINTXXXGOD, пробовал через +- такую же настррйку клиента когда в самом начале пытался на телетоне сделать, выдавало то же самое
MK_Shop, Отлеги сессии давай больше, если ****ает акки значит система безопасности ТГ выебнулась, а если это так значит чето подозрительное сделал
KLINTXXXGOD, прикрепил код который просто тестит через Spamblock, проверяет гео/спам блок через него, никаких подозрительных действий для бана :/
il44kvk, пробовал номера/акки/****** разных поставщиков, результат один. через тдата всё ок - через апи слетают или банятся сразу
Ну я аккаунты прогревал сначало перед из использованием , писал другим аккаунт в Бд. Попробуй так , сам сел писать скрипты для этой херни
DEVOYOR, да беда в том что акки отлетают ещё до каких-либо действий часто очень, только прошла инициализация через проксю и через 2-5 секунд акк заблочен/вылетела сессия
кажется все проблемы исходили от app id / app hash кривых и от того что я не перелогинился с номера телефона, сейчас на пробу поставил ссбор по 5к сообщений за раз, всё работает, до этого на 50 сообщениях в минуту жить планировал с одного аккаунта У человека была похожая проблема. Попробуй
Thor, не совсем понял, что именно с app id и app hash нужно делать или каким именно их способом надо получать чтобы всё ок было,
MK_Shop, https://lavhost.su/telegram-api . Авторизацию проходи 1 акк = 1 набор hash и id. Попробуй так