93 lines
3.5 KiB
Python
93 lines
3.5 KiB
Python
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()) |