from telethon.errors import FloodWaitError from telethon.tl.functions.channels import JoinChannelRequest import asyncio from telethon import TelegramClient from telethon.sessions import StringSession from src.core.settings.base import settings import time import openpyxl import os # Конфигурация Excel-файла EXCEL_FILE_PATH = "/home/harold/Documents/chats.xlsx" SHEET_NAME = 'Чаты' # Имя листа в Excel LINK_COLUMN = 3 # Номер столбца со ссылками (3 = колонка C) async def main(): # Загрузка групп из Excel groups = [] try: # Проверка существования файла if not os.path.exists(EXCEL_FILE_PATH): raise FileNotFoundError(f"Excel файл не найден: {EXCEL_FILE_PATH}") wb = openpyxl.load_workbook(EXCEL_FILE_PATH) # Проверка существования листа if SHEET_NAME not in wb.sheetnames: raise ValueError(f"Лист '{SHEET_NAME}' не найден в файле") sheet = wb[SHEET_NAME] # Чтение данных, пропуская заголовок for row in range(2, sheet.max_row + 1): link_cell = sheet.cell(row=row, column=LINK_COLUMN) if link_cell.value and 't.me/' in link_cell.value: # Извлекаем username из ссылки username = link_cell.value.split('t.me/')[-1].split('/')[0].split('?')[0] groups.append(username) if not groups: print("⚠️ В файле не найдено валидных ссылок на Telegram группы") return except Exception as e: print(f"❌ Ошибка при чтении Excel файла: {str(e)}") return # Инициализация Telegram клиента client = TelegramClient( session=StringSession(settings.ACCOUNT.SESSION), api_id=settings.ACCOUNT.API_ID, api_hash=settings.ACCOUNT.API_HASH, ) await client.start() print(f"\nНайдено {len(groups)} групп в файле. Начинаю подписку...") success_count = 0 for i, username in enumerate(groups, 1): try: # Пытаемся найти группу group = await client.get_entity(username) # Подписываемся await client(JoinChannelRequest(group)) print(f"{i}. ✓ Успешно: @{username}") success_count += 1 except FloodWaitError as e: wait_time = e.seconds + 5 print(f"{i}. ⏳ Ожидаем {wait_time} секунд из-за ограничения Telegram") time.sleep(wait_time) # Повторяем попытку после ожидания try: await client(JoinChannelRequest(username)) print(f"{i}. ✓ Успешно после ожидания: @{username}") success_count += 1 except Exception as e: print(f"{i}. ✗ Ошибка повторной попытки для @{username}: {str(e)}") except Exception as e: print(f"{i}. ✗ Ошибка в @{username}: {str(e)}") # Задержка между запросами time.sleep(2) print(f"\nПроцесс завершен! Успешно подписано на {success_count} из {len(groups)} групп") await client.disconnect() # # # if __name__ == '__main__': # asyncio.run(main())