Загрузка...

Скрипт Скрипт для созыва участников чата в Telegram

Тема в разделе Python создана пользователем vendues 10 июн 2025 в 14:41. 127 просмотров

  1. vendues
    vendues Автор темы 10 июн 2025 в 14:41 1 22 мар 2020


    [IMG]




    Этот Python-скрипт реализует команду /zov для Telegram-бота, которая позволяет модераторам и администраторам созывать всех или только неактивных участников чата. Скрипт использует библиотеку python-telegram-bot для взаимодействия с Telegram API и SQLite для хранения данных о пользователях. Скрипт требует доработки, но структура рабочая
    1. Созыв участников: Возможность вызывать всех участников чата или только неактивных (кто не писал в чат более 24 часов)
    2. Гибкое управление: Указание причины созыва и фильтрация по статусу регистрации
    3. Красивые упоминания: Участники упоминаются с использованием случайных тематических смайликов
    4. Безопасность: Проверка прав доступа перед выполнением команды
    5. Статистика: Отображение количества упомянутых участников в итоговом сообщении
    Скрипт подходит для управления крупными чатами, где требуется привлекать внимание участников к важным обсуждениям или объявлениям.


    Python
    from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
    from telegram.ext import ContextTypes
    import sqlite3
    import asyncio
    import random
    from datetime import datetime

    # Инициализация базы данных
    def init_db():
    conn = sqlite3.connect('chat_members.db')
    cursor = conn.cursor()
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS chat_members (
    chat_id TEXT,
    user_id TEXT,
    username TEXT,
    role TEXT,
    PRIMARY KEY (chat_id, user_id)
    )
    ''')
    conn.commit()
    return conn

    async def zov_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Созыв всех участников чата с возможностью указать причину"""
    # Инициализация базы данных
    conn = init_db()
    cursor = conn.cursor()

    user_id = str(update.message.from_user.id)
    if not has_moderation_access(user_id):
    await update.message.reply_text("Эта команда доступна только модераторам и администраторам.")
    return

    chat_id = update.message.chat_id
    args = context.args or []
    target = "всех"
    reason = " ".join(args[1:]) if len(args) > 1 else ""

    # Проверяем, указан ли тип созыва (всех или неактивных)
    if args and args[0].lower() in ["неактивных", "неактивные"]:
    target = "неактивных"
    reason = " ".join(args[1:]) if len(args) > 1 else ""
    else:
    reason = " ".join(args) if args else ""

    try:
    # Отправляем начальное сообщение с причиной, если она есть
    caller_name = get_user_display_name(update.message.from_user)
    role = "Администратор" if is_admin(user_id) else "Модератор"

    header_text = (
    f" <b>Созыв {target} участников!</b>\n\n"
    f" {role} {caller_name} созывает чат!"
    )

    if reason:
    header_text += f"\n\n Причина: {reason}"

    header_text += "\n\nПодождите, упоминания загружаются..."

    header_message = await context.bot.send_message(
    chat_id=chat_id,
    text=header_text,
    parse_mode='HTML'
    )

    # Получаем список участников чата из базы данных
    cursor.execute("SELECT user_id, username FROM chat_members WHERE chat_id = ?", (str(chat_id),))
    db_members = cursor.fetchall()
    members = [(uid, username) for uid, username in db_members if uid != str(context.bot.id)]

    # Если нужны только неактивные - фильтруем
    if target == "неактивных":
    twenty_four_hours_ago = datetime.now().timestamp() - 86400
    active_users = set()

    if str(chat_id) in daily_stats:
    for uid, data in daily_stats[str(chat_id)].items():
    if data["last_message"] >= twenty_four_hours_ago:
    active_users.add(uid)

    members = [m for m in members if m[0] not in active_users]
    if not members:
    await header_message.edit_text("Нет неактивных участников для созыва.")
    return

    # Фильтруем участников по статусу регистрации
    members = [m for m in members if user_registration.get(m[0], True)]

    if not members:
    await header_message.edit_text("Нет участников с активными упоминаниями для созыва.")
    return

    # Список смайликов для упоминаний
    smi = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]
    random.shuffle(smi)

    # Отправляем упоминания группами по 5 смайликов
    for i in range(0, len(members), 5):
    group = members[i:i+5]
    mentions = []

    for j, (user_id, username) in enumerate(group):
    username = username.lstrip('@') if username else f"ID{user_id}"
    mentions.append(f'<a href="tg://user?id={user_id}">{smi[j % len(smi)]}</a>')

    # Отправляем группу смайликов-упоминаний
    await context.bot.send_message(
    chat_id=chat_id,
    text=" ".join(mentions),
    parse_mode='HTML',
    reply_to_message_id=header_message.message_id
    )
    await asyncio.sleep(1) # Небольшая задержка между группами

    # Обновляем заголовочное сообщение
    final_text = (
    f" <b>Созыв {target} участников завершен!</b>\n\n"
    f" {role} {caller_name} созвал чат!"
    )

    if reason:
    final_text += f"\n\n Причина: {reason}"

    final_text += f"\n\nУпомянуто участников: {len(members)}"

    await header_message.edit_text(
    final_text,
    parse_mode='HTML'
    )

    except Exception as e:
    logger.error(f"Ошибка в команде zov: {e}", exc_info=True)
    try:
    await context.bot.send_message(
    chat_id=chat_id,
    text="Произошла ошибка при выполнении команды."
    )
    except:
    pass
    finally:
    conn.close()

    # Вспомогательные функции (нужно будет добавить их реализацию)
    def has_moderation_access(user_id: str) -> bool:
    """Проверяет, есть ли у пользователя права модерации"""
    pass

    def is_admin(user_id: str) -> bool:
    """Проверяет, является ли пользователь администратором"""
    pass

    def get_user_display_name(user) -> str:
    """Возвращает отображаемое имя пользователя"""
    pass
     
    1. Элейна
  2. Элейна
    Элейна 10 июн 2025 в 14:45 4667 16 авг 2019
     
    1. vendues Автор темы
      Элейна, концепция дальнейшей доработки, бля че приебался дружище, хочу гитару ставлю, могу ебальник отца своего вложить
Загрузка...
Top