Бот написан на 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
// **** Настройки ****
$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 на свой вопрос и ответ. Не забудьте сохранить файл.
Установите вебхук. Для этого напишите в адресной строке браузера:
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. Если что — ошибки ищите там.