Заявки с сайта в Telegram: пошаговая настройка за 15 минут
Заявка, которая лежит в почте полдня, часто уже не заявка: человек выбрал другого исполнителя. Когда она за секунду приходит в Telegram, на неё отвечают быстрее. Ниже полный путь от создания бота до работающей формы, с кодом, который можно взять за основу. По такой схеме работает форма на нашем сайте.
Что понадобится
- Аккаунт в Telegram.
- Сайт на обычном хостинге с PHP 7.4 или новее (подходит почти любой тариф).
- Форма на сайте: хотя бы поля «имя» и «контакт».
- Около 15 минут.
Шаг 1. Создайте бота
- Откройте в Telegram @BotFather (официальный бот Telegram) и отправьте команду
/newbot. - Задайте имя бота и его username (он должен заканчиваться на
bot). - BotFather пришлёт токен — длинную строку вида
123456:ABC-DEF….
Шаг 2. Узнайте chat_id
Бот должен знать, кому писать. Для этого нужен идентификатор вашего чата.
- Откройте своего бота и нажмите Start, затем отправьте ему любое сообщение. Бот не может написать первым, пока вы ему не написали.
- Откройте в браузере адрес
https://api.telegram.org/botВАШ_ТОКЕН/getUpdates. - В ответе найдите кусок
"chat":{"id":123456789. Это число и естьchat_id.
Если хотите получать заявки в рабочую группу, добавьте бота в группу, напишите там любое сообщение и повторите шаг с getUpdates: идентификатор группы будет отрицательным числом.
Шаг 3. Серверный скрипт
Форма отправляет данные не в Telegram напрямую, а на ваш сервер. Скрипт принимает их и пересылает боту. Так токен остаётся закрытым. Сохраните файл как send.php в корне сайта и впишите свои токен и chat_id.
<?php
// send.php: положите рядом с сайтом. Токен и chat_id храните только здесь.
const TOKEN = 'ВАШ_ТОКЕН_БОТА';
const CHAT = 'ВАШ_CHAT_ID';
header('Content-Type: application/json; charset=utf-8');
$in = json_decode(file_get_contents('php://input'), true);
if (!is_array($in)) { http_response_code(400); echo '{"ok":false}'; exit; }
// Ловушка для ботов: людям это поле не видно, роботы его заполняют
if (!empty($in['website'])) { echo '{"ok":true}'; exit; }
$clean = fn($k) => mb_substr(trim((string)($in[$k] ?? '')), 0, 500) ?: '—';
$text = "🔔 Новая заявка\n👤 " . $clean('name') . "\n📱 " . $clean('contact');
$ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/sendMessage');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => ['chat_id' => CHAT, 'text' => $text],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
$res = json_decode((string)curl_exec($ch), true);
curl_close($ch);
echo json_encode(['ok' => !empty($res['ok'])]);
Шаг 4. Подключите форму
Форма отправляет данные скрипту и показывает «Спасибо» только после ответа сервера. Скрытое поле website нужно для защиты от спама: человек его не видит и не заполняет, а простые боты заполняют.
<form id="lead">
<input name="name" placeholder="Имя" required>
<input name="contact" placeholder="Телефон или Telegram" required>
<input name="website" style="display:none" tabindex="-1" autocomplete="off">
<button>Отправить</button>
</form>
<script>
document.getElementById('lead').addEventListener('submit', async function (e) {
e.preventDefault();
var form = e.target;
var data = Object.fromEntries(new FormData(form));
try {
var r = await fetch('/send.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
});
var j = await r.json();
if (!j.ok) throw new Error('send failed');
form.innerHTML = 'Спасибо! Мы свяжемся с вами.';
if (typeof ym === 'function') ym(ВАШ_СЧЁТЧИК, 'reachGoal', 'lead_form_sent');
} catch (err) {
alert('Не удалось отправить. Напишите нам в Telegram.');
}
});
</script>
Шаг 5. Проверьте и добавьте цель в Метрике
- Отправьте тестовую заявку с сайта. Сообщение должно прийти в Telegram за пару секунд.
- В Яндекс Метрике создайте цель типа «JavaScript-событие» с идентификатором
lead_form_sent. Строкаym(…, 'reachGoal', …)из формы выше будет её засчитывать, и вы увидите, с каких источников приходят именно заявки, а не просто визиты.
Если сообщения не приходят
- Вы не нажимали Start у бота. Пока вы ему не написали, он не сможет отправить вам сообщение.
- Неверный chat_id или токен. Проверьте, нет ли лишнего пробела или пропущенного символа. Ответ Telegram содержит поле
description, где написана причина. - Для группы указан не тот id. У группы он отрицательный, берите его из
getUpdates. - Скрипт отдаёт ошибку. Откройте
/send.phpв браузере и посмотрите ответ или лог ошибок хостинга.
Что ещё можно подключить
Тот же приём работает для уведомлений: оплата пришла, заказ завис на этапе дольше суток, на склад поступил товар. Заявки обычно самый быстрый старт: эффект видно в первый же день.
Если не хочется разбираться самому, настроим под ваш сайт и ваши процессы: назовём срок и стоимость до начала работы и честно скажем, если автоматизация не окупится.