Telegram-бот для автоматического принятия заявок в чат

Бот написан на PHP, использует вебхуки и Telegram Bot API. Прост в настройке, работает быстро, ресурсы не потребляет. Бот примитивный, на идеальный код не претендует, используйте на свой страх и риск.

Принцип работы

У вас закрытый чат в Телеграме. Или открытый, но чтобы писать в нем, надо подать заявку на добавление. Вы не хотите вручную одобрять все заявки. Этот бот будет автоматически одобрять заявку в том случае, если тот, кто отправил ее, правильно ответит на один вопрос. Если что — заявки по-прежнему можно будет одобрять вручную, они будут скапливаться в настройках группы. Там же будут находиться те заявки, которые не смогли ответить на вопрос бота. Получается такой простой, но достаточно эффективный антиспам.

Что необходимо

  • PHP: Убедитесь, что у вас установлен PHP (версии 7.4 или выше).
  • Веб-сервер: Вам понадобится веб-сервер (например, Apache или Nginx) с поддержкой PHP и HTTPS.
  • SSL-сертификат: HTTPS обязателен для вебхуков. Вам потребуется SSL-сертификат для вашего домена. Можно использовать бесплатный сертификат от Let’s Encrypt.

Создаем бота

Создайте на вашем сайте файл название_файла.php с кодировкой UTF-8 без BOM. Разумеется, он должен быть доступен по адресу https://вашсайт.ру/название_файла.php. В файл разместите код:

PHP
<?php

// **** Настройки ****
$botToken = 'YOUR_BOT_TOKEN'; // Замените на токен вашего бота
$groupId = -1001234567890; // Замените на ID вашей группы
$question = "Сколько будет 2 + 2?";
$correctAnswer = "4";

// **** Telegram Bot API URL ****
define('TELEGRAM_API_URL', 'https://api.telegram.org/bot' . $botToken . '/');

// **** Функция для отправки запросов к Telegram Bot API ****
function telegramRequest($method, $params = []) {
    $url = TELEGRAM_API_URL . $method;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    $result = curl_exec($ch);

    if (curl_errno($ch)) {
        error_log('Ошибка curl: ' . curl_error($ch));
        return false;
    }

    curl_close($ch);
    return json_decode($result, true);
}

// **** Функция для одобрения заявки на вступление ****
function approveChatJoinRequest($chatId, $userId) {
    $params = [
        'chat_id' => $chatId,
        'user_id' => $userId
    ];
    return telegramRequest('approveChatJoinRequest', $params);
}

// **** Функция для отправки сообщения пользователю ****
function sendMessage($chatId, $text) {
    $params = [
        'chat_id' => $chatId,
        'text' => $text,
        'parse_mode' => 'Markdown'
    ];
    return telegramRequest('sendMessage', $params);
}

// **** Обработка входящих данных ****
$update = json_decode(file_get_contents('php://input'), true);

// **** Логирование (необязательно, но полезно для отладки) ****
error_log(json_encode($update, JSON_PRETTY_PRINT));

// **** Обработка запроса на вступление ****
if (isset($update['chat_join_request'])) {
    $chatId = $update['chat_join_request']['chat']['id'];
    $userId = $update['chat_join_request']['from']['id'];
    $username = $update['chat_join_request']['from']['username'] ?? $update['chat_join_request']['from']['first_name'];

    // Проверяем, что это наша группа
    if ($chatId == $groupId) {
        // Отправляем вопрос пользователю
        $messageText = "Привет, @{$username}! Чтобы вступить в группу, ответьте на вопрос: *{$question}*";
        sendMessage($userId, $messageText);
    }
}

// **** Обработка входящего сообщения (ответа на вопрос) ****
if (isset($update['message'])) {
    $chatId = $update['message']['chat']['id'];
    $userId = $update['message']['from']['id'];
    $text = $update['message']['text'];

    // Сравниваем ответ с правильным ответом (без учета регистра и пробелов)
    if (strtolower(trim($text)) == strtolower(trim($correctAnswer))) {
        // Ответ правильный, одобряем заявку
        $result = approveChatJoinRequest($groupId, $userId);
        if ($result && $result['ok']) {
            // Отправляем приветственное сообщение
            sendMessage($userId, "Поздравляем! Ваша заявка одобрена. Добро пожаловать в группу!");
        } else {
            error_log("Ошибка при одобрении заявки: " . json_encode($result));
            sendMessage($userId, "Произошла ошибка при одобрении вашей заявки. Пожалуйста, свяжитесь с администратором.");
        }
    } 
}

?>

У @BotFather создайте бота командой /newbot, токен вставьте в файл сюда: $botToken.

Надо узнать id вашего чата. Можно это сделать например тут. Запустите этого бота, перешлите ему любое сообщение из чата и он напишет в ответ id. Введите это значение в файл сюда: $groupId.

Измените $question и $correctAnswer на свой вопрос и ответ. Не забудьте сохранить файл.

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

HTTP
https://api.telegram.org/botYOUR_BOT_TOKEN/setWebhook?url=YOUR_WEBHOOK_URL

Замените YOUR_BOT_TOKEN и YOUR_WEBHOOK_URL на токен и https://вашсайт.ру/название_файла_бота.php, которые вы получили ранее. Нажмите Enter и перейдите по этому url. Вы должны увидеть JSON-ответ {«ok»:true,»result»:true,»description»:»Webhook was set»}. Если видите ошибку, убедитесь, что URL правильный, у вас есть HTTPS, и ваш веб-сервер доступен.

Добавьте бота в ваш чат и сделайте его администратором со всеми правами, включая право на одобрение заявок на вступление. Попробуйте добавиться в чат с нового аккаунта: после отправки заявки бот напишет вам вопрос, а когда вы правильно на него ответите — добавит вас в чат.

Бот пишет логи в файл название_файла_с_ботом.log. Если что — ошибки ищите там.

Как вам статья?
+1
0
+1
1
+1
0
+1
0
+1
0
+1
0

Рекомендую почитать