#!/usr/bin/env python3 """ Сбор всех участников группы в базу данных Использование: python collect_all_members.py """ import asyncio import logging import aiohttp from aiohttp_socks import ProxyConnector from sqlalchemy import select, func from database.db import AsyncSessionLocal, init_db from database.models import User from config import BOT_TOKEN, ADMIN_CHAT_ID, get_proxy_url logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) async def collect_all_members(): """Собрать всех участников группы""" await init_db() proxy_url = get_proxy_url() connector = ProxyConnector.from_url(proxy_url) async with aiohttp.ClientSession(connector=connector) as session: # Получаем всех участников через getChatMembers # Telegram API позволяет получать по 100 за раз all_members = [] offset = 0 limit = 100 logger.info(f'🔄 Начинаем сбор участников...') while True: try: url = f"https://api.telegram.org/bot{BOT_TOKEN}/getChatMembers" params = { "chat_id": ADMIN_CHAT_ID, "offset": offset, "limit": limit } async with session.get(url, params=params) as resp: result = await resp.json() if not result.get('ok'): logger.error(f'Ошибка API: {result}') break members = result.get('result', []) if not members: break all_members.extend(members) offset += limit logger.info(f'Загружено {len(all_members)} участников...') # Если загрузили меньше чем лимит — это конец if len(members) < limit: break except Exception as e: logger.error(f'Ошибка при загрузке: {e}') break logger.info(f'✅ Всего загружено: {len(all_members)}') # Добавляем в базу async with AsyncSessionLocal() as db_session: added = 0 updated = 0 for member in all_members: user_data = member.get('user', {}) user_id = user_data.get('id') if not user_id: continue user = await db_session.get(User, user_id) if not user: # Новый пользователь user = User( user_id=user_id, username=user_data.get('username'), first_name=user_data.get('first_name'), last_name=user_data.get('last_name'), verified=False, # Пока не верифицирован ) db_session.add(user) added += 1 else: # Обновляем данные if user_data.get('username') and user.username != user_data.get('username'): user.username = user_data.get('username') updated += 1 if user_data.get('first_name') and user.first_name != user_data.get('first_name'): user.first_name = user_data.get('first_name') updated += 1 await db_session.commit() # Статистика total = (await db_session.execute(select(func.count(User.user_id)))).scalar() logger.info(f'✅ Сбор завершён!') logger.info(f' Добавлено: {added}') logger.info(f' Обновлено: {updated}') logger.info(f' Всего в базе: {total}') if __name__ == '__main__': asyncio.run(collect_all_members())