Другое

Настройка приветствия в Pyrogram при подписке на канал

Как настроить отправку приветственных сообщений в Telegram-боте Pyrogram при одобрении заявок на вступление в канал. Полное руководство с кодом и решением проблем.

Как настроить отправку приветственного сообщения при подписке пользователя на канал через Telegram-бота на Pyrogram? У меня есть бот, который является администратором канала и обрабатывает заявки на вступление. Я настроил его для принятия заявок, но не могу заставить авторизованный аккаунт (через сессию Pyrogram) отправлять приветственное сообщение пользователю при подписке на канал. Код бота уже настроен на взаимодействие с пользователями и хранит данные об аккаунтах подписчиков, но приветствие не отправляется. Подскажите, как исправить проблему в коде, чтобы при подписке на канал авторизованный аккаунт отправлял приветственное сообщение пользователю?

Чтобы настроить отправку приветственного сообщения при подписке пользователя на канал через Pyrogram, вам нужно использовать обработчик событий new_chat_members или создать отдельный обработчик для обработки событий вступления в канал через заявки. Ваш бот должен получить информацию о новом участнике и отправить персонализированное приветственное сообщение.

Содержание

Основные подходы к отправке приветственных сообщений

Существует два основных способа отправки приветственных сообщений при подписке на канал через Pyrogram:

  1. Обработка события new_chat_members - срабатывает, когда пользователь напрямую присоединяется к каналу
  2. Обработка заявок на вступление - срабатывает, когда пользователь отправляет заявку на вступление и бот ее одобряет

Для вашей ситуации, когда бот обрабатывает заявки на вступление, вам потребуется второй подход. Важно правильно настроить права администратора бота в канале, чтобы он мог управлять заявками и отправлять сообщения новым пользователям.

Ключевое замечание: Бот должен иметь права администратора с возможностью Invite users (Приглашать пользователей) в канале для обработки заявок на вступление.

Использование обработчика new_chat_members

Для базового приветствия пользователей при прямом присоединении к каналу используйте следующий код:

python
from pyrogram import Client, filters

# Инициализация клиента
app = Client("my_account")

# Целевой канал
TARGET = -100123456789  # Замените на ID вашего канала

# Приветственное сообщение
WELCOME_MESSAGE = "Добро пожаловать в наш канал! 👋"

@app.on_message(filters.chat(TARGET) & filters.new_chat_members)
async def welcome_new_members(client, message):
    # Отправка приветственного сообщения
    await message.reply(WELCOME_MESSAGE)

Этот код будет срабатывать каждый раз, когда новый пользователь присоединяется к каналу. Однако он не подходит для обработки заявок на вступление.

Настройка обработки заявок на вступление

Для обработки заявок на вступление вам нужно использовать другой подход. Вот как это реализовать:

python
from pyrogram import Client, filters
from pyrogram.types import ChatJoinRequest, InlineKeyboardMarkup, InlineKeyboardButton

app = Client("my_account")

# ID вашего канала
CHANNEL_ID = -100123456789  # Замените на ID вашего канала

@app.on_chat_join_request()
async def handle_join_request(client, join_request: ChatJoinRequest):
    """
    Обрабатывает заявки на вступление в канал
    """
    user_id = join_request.from_user.id
    chat_id = join_request.chat.id
    
    # Здесь вы можете добавить логику проверки пользователя
    # Например, проверку подписки на другие каналы
    
    # Отправка приветственного сообщения пользователю
    welcome_text = f"🎉 Добро пожаловать! Ваша заявка на вступление в канал одобрена."
    
    try:
        await client.send_message(
            chat_id=user_id,
            text=welcome_text,
            disable_web_page_preview=True
        )
    except Exception as e:
        print(f"Ошибка отправки приветствия: {e}")
    
    # Одобрение заявки на вступление
    await client.approve_chat_join_request(chat_id=chat_id, user_id=user_id)

Этот код автоматически обрабатывает заявки на вступление и отправляет приветственное сообщение пользователю после одобрения заявки.

Полный пример кода бота

Вот полный пример бота, который обрабатывает заявки на вступление и отправляет приветственные сообщения:

python
from pyrogram import Client, filters
from pyrogram.types import (
    ChatJoinRequest, 
    InlineKeyboardMarkup, 
    InlineKeyboardButton,
    Message
)
import asyncio

# Настройки бота
API_ID = 12345678  # Замените на ваш API ID
API_HASH = "your_api_hash"  # Замените на ваш API Hash
BOT_TOKEN = "your_bot_token"  # Замените на токен вашего бота
CHANNEL_ID = -100123456789  # ID вашего канала

# Инициализация клиента
app = Client(
    "session_name",
    api_id=API_ID,
    api_hash=API_HASH,
    bot_token=BOT_TOKEN
)

# Словарь для хранения пользовательских данных
user_data = {}

@app.on_chat_join_request()
async def handle_join_requests(client, join_request: ChatJoinRequest):
    """
    Основной обработчик заявок на вступление
    """
    user_id = join_request.from_user.id
    user_info = join_request.from_user
    
    # Сохранение информации о пользователе
    user_data[user_id] = {
        'first_name': user_info.first_name,
        'username': user_info.username,
        'join_date': join_request.date
    }
    
    # Проверка, является ли пользователь подписчиком (опционально)
    is_subscribed = await check_user_subscription(client, user_id)
    
    # Формирование персонализированного приветствия
    welcome_message = create_welcome_message(user_info, is_subscribed)
    
    try:
        # Отправка приветственного сообщения пользователю
        await client.send_message(
            chat_id=user_id,
            text=welcome_message,
            disable_web_page_preview=True
        )
        
        # Одобрение заявки
        await client.approve_chat_join_request(
            chat_id=CHANNEL_ID,
            user_id=user_id
        )
        
        print(f"Пользователь {user_info.first_name} ({user_id}) успешно вступил")
        
    except Exception as e:
        print(f"Ошибка при обработке заявки пользователя {user_id}: {e}")
        await client.decline_chat_join_request(
            chat_id=CHANNEL_ID,
            user_id=user_id
        )

async def check_user_subscription(client, user_id: int) -> bool:
    """
    Проверяет, подписан ли пользователь на канал
    """
    try:
        member = await client.get_chat_member(CHANNEL_ID, user_id)
        return member.status in ["member", "administrator", "creator"]
    except Exception as e:
        print(f"Ошибка проверки подписки: {e}")
        return False

def create_welcome_message(user_info, is_subscribed: bool) -> str:
    """
    Создает персонализированное приветственное сообщение
    """
    username = f"@{user_info.username}" if user_info.username else user_info.first_name
    
    if not is_subscribed:
        return (
            f"🎉 Добро пожаловать, {user_info.first_name}!\n\n"
            f"Ваша заявка на вступление в канал одобрена. "
            f"Теперь вы можете участвовать в жизни нашего сообщества! 🚀\n\n"
            f"Ваши данные:\n"
            f"• Имя: {user_info.first_name}\n"
            f"• Юзернейм: {username}"
        )
    else:
        return (
            f"🎉 Добро пожаловать обратно, {user_info.first_name}!\n\n"
            f"Вы снова в нашем канале. Приятного времяпрепровождения! 🌟"
        )

# Запуск бота
app.run()

Решение распространенных проблем

1. Приветствие не отправляется

Проблема: Приветственное сообщение не отправляется после одобрения заявки.

Решение:

  • Проверьте, что бот имеет права администратора в канале
  • Убедитесь, что вы используете правильный ID канала
  • Добавьте обработку исключений для отладки ошибок

2. Бот не видит заявки на вступление

Проблема: Бот не получает события заявок на вступление.

Решение:

  • Проверьте, что канал настроен на требование одобрения заявок
  • Убедитесь, что бот добавлен как администратор с правом управления участниками
  • Проверьте логи на предмет ошибок подключения

3. Ошибка при отправке сообщения пользователю

Проблема: Бот не может отправить сообщение пользователю после одобрения заявки.

Решение:

python
try:
    await client.send_message(user_id, "Тестовое сообщение")
except Exception as e:
    print(f"Ошибка: {e}")
    # Пользователь может заблокировать бота или удалить чат

Дополнительные возможности приветствия

Персонализированные приветствия

python
def create_personalized_welcome(user_info, user_stats=None):
    """
    Создает персонализированное приветствие с учетом истории пользователя
    """
    welcome = f"🌟 Привет, {user_info.first_name}!\n\n"
    
    if user_stats:
        if user_stats['visit_count'] > 1:
            welcome += f"Рад снова вас видеть! Это ваша {user_stats['visit_count']}-я подписка.\n"
        else:
            welcome += "Добро пожаловать в наше сообщество впервые!\n"
    
    welcome += "Надеемся, вам здесь понравится! 🎉"
    
    return welcome

Приветствия с кнопками

python
@app.on_chat_join_request()
async def welcome_with_buttons(client, join_request: ChatJoinRequest):
    user_id = join_request.from_user.id
    
    keyboard = InlineKeyboardMarkup([
        [
            InlineKeyboardButton("📖 Правила канала", callback_data="rules"),
            InlineKeyboardButton("❓ Помощь", callback_data="help")
        ],
        [
            InlineKeyboardButton("🔔 Уведомления", callback_data="notifications")
        ]
    ])
    
    await client.send_message(
        chat_id=user_id,
        text="Добро пожаловать! Используйте кнопки ниже для навигации:",
        reply_markup=keyboard
    )

Асинхронная обработка нескольких заявок

python
from concurrent.futures import ThreadPoolExecutor

async def process_multiple_requests(join_requests):
    """
    Обрабатывает несколько заявок одновременно
    """
    with ThreadPoolExecutor() as executor:
        loop = asyncio.get_event_loop()
        tasks = [
            loop.run_in_executor(
                executor, 
                process_single_request, 
                request
            ) for request in join_requests
        ]
        await asyncio.gather(*tasks)

Не забудьте настроить права администратора для вашего бота в канале, чтобы он мог обрабатывать заявки на вступление и отправлять приветственные сообщения. Также рекомендуется добавить логирование для отслеживания работы бота и диагностики возможных проблем.

Источники

  1. Welcome Bot Example - Pyrogram Documentation
  2. ChatJoinRequest - Pyrogram API Documentation
  3. Approve Chat Join Request - Pyrogram Documentation
  4. Send Message - Pyrogram Documentation
  5. Filters - Pyrogram Documentation

Заключение

  • Для настройки приветственных сообщений при подписке на канал используйте обработчик @app.on_chat_join_request()
  • Убедитесь, что бот имеет права администратора с возможностью управления участниками канала
  • Добавьте обработку исключений и логирование для диагностики проблем
  • Используйте персонализированные сообщения для лучшего пользовательского опыта
  • Тестируйте бота в безопасной среде перед запуском в продакшене

Основная проблема в вашем коде, скорее всего, заключается в отсутствии правильного обработчика событий заявок на вступление. Используйте приведенные примеры для исправления вашей реализации.

Авторы
Проверено модерацией
Модерация