🔥 ОБЪЯВЛЕНИЯ: • Срок действия: 7 → 14 дней 🎯 ИНИЦИАТИВНАЯ ГРУППА: • Добавлена кнопка 'Рассылка ИГ' в меню • Команда /ig_broadcast для членов ИГ • Поддержка текста + фото + файлов • Настройка лимита в веб-панели ⚙️ ВЕБ-ПАНЕЛЬ: • Новая страница /settings • Настройка лимита рассылки ИГ (секунды) • Кнопки статистики фильтруют пользователей • Индикатор активного фильтра 🎨 UI: • Исправлен <font> → emoji (Telegram не поддерживает) • Цветные заголовки через emoji 📁 ФАЙЛЫ: • handlers/ads.py: 14 дней • handlers/initiative_group.py: рассылка ИГ • web/app.py: API настроек • web/templates/settings.html: страница настроек • utils/ui_styles.py: без <font> тегов • database: settings table Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
100 lines
4 KiB
Python
100 lines
4 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Импорт всех участников группы в базу данных
|
||
Прямой запрос к Telegram API
|
||
"""
|
||
import asyncio
|
||
import logging
|
||
import aiohttp
|
||
from datetime import datetime
|
||
from sqlalchemy import select
|
||
from database.db import AsyncSessionLocal, init_db
|
||
from database.models import User
|
||
from config import BOT_TOKEN, ADMIN_CHAT_ID, get_proxy_url
|
||
from aiohttp_socks import ProxyConnector
|
||
|
||
logging.basicConfig(level=logging.INFO)
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
async def import_group_members():
|
||
"""Импортировать всех участников группы"""
|
||
|
||
await init_db()
|
||
|
||
proxy_url = get_proxy_url()
|
||
logger.info(f'🔒 Прокси: {proxy_url}')
|
||
|
||
# Создаём коннектор с прокси
|
||
connector = ProxyConnector.from_url(proxy_url)
|
||
|
||
async with aiohttp.ClientSession(connector=connector) as session:
|
||
# Получаем список администраторов (это все кто есть в чате)
|
||
async with session.get(
|
||
f"https://api.telegram.org/bot{BOT_TOKEN}/getChatAdministrators",
|
||
params={"chat_id": ADMIN_CHAT_ID}
|
||
) as resp:
|
||
result = await resp.json()
|
||
|
||
if not result.get('ok'):
|
||
logger.error(f'Ошибка API: {result}')
|
||
return
|
||
|
||
members = result.get('result', [])
|
||
logger.info(f'📊 Найдено участников: {len(members)}')
|
||
|
||
async with AsyncSessionLocal() as db_session:
|
||
added = 0
|
||
updated = 0
|
||
|
||
for member in members:
|
||
# member это dict с ключом 'user'
|
||
user_data = member.get('user', {})
|
||
user_id = user_data.get('id')
|
||
|
||
if not user_id:
|
||
continue
|
||
|
||
# Проверяем есть ли в базе
|
||
existing = await db_session.get(User, user_id)
|
||
|
||
if existing:
|
||
# Обновляем данные
|
||
username = user_data.get('username')
|
||
first_name = user_data.get('first_name')
|
||
last_name = user_data.get('last_name')
|
||
|
||
if username:
|
||
existing.username = username
|
||
if first_name:
|
||
existing.first_name = first_name
|
||
if last_name:
|
||
existing.last_name = last_name
|
||
# Верифицируем!
|
||
if not existing.verified:
|
||
existing.verified = True
|
||
existing.verification_date = datetime.utcnow()
|
||
updated += 1
|
||
else:
|
||
# Добавляем нового
|
||
new_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=True, # Сразу верифицируем!
|
||
verification_date=datetime.utcnow(),
|
||
message_count=0,
|
||
)
|
||
db_session.add(new_user)
|
||
added += 1
|
||
|
||
await db_session.commit()
|
||
|
||
logger.info(f'✅ Добавлено: {added}')
|
||
logger.info(f'🔄 Обновлено: {updated}')
|
||
logger.info(f'💾 Итого в базе: {added + updated}')
|
||
|
||
|
||
if __name__ == '__main__':
|
||
asyncio.run(import_group_members())
|