
Пишем бота для обратной связи с сайта. Часть 2. Отправка сообщения в группу
В прошлой части мы настроили среду разработки и создали наш первый простой Телеграм-бот. Сегодня мы расширим функционал бота заставив его отправлять сообщения в группу.
Удаление Веб-хука
Так как мы используем бесплатный план сервиса ngrok.com в процессе разработки на часто нужно будет менять адрес Вебхука.
Удалим старый адрес, чтобы добавить новый.
Запустим:
curl https://api.telegram.org/bot1234567890:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/deleteWebhook?url=https://bc8ab1191806.ngrok.io/d2549d33-255a-40a6-8cce-36c8f7efe780/6a98fbdb-9fc1-4681-878a-4e4292b79332.php
{"ok":true,"result":true,"description":"Webhook was deleted"}
Таким образом мы удалили старый Вебхук.
Теперь мы можем заново запустить ngrok и добавить новый вебхук, как это сделать описано в предыдущей статье!
Получение chatid группы
Чтобы отправить сообщение в группу нам нужно выяснить её chatid!
Сначала отправим в группу, в которую бот должен отправлять сообщение строку:
test
Затем запустим:
curl https://api.telegram.org/bot1234567890:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/getUpdates
Получим приблизительно такой результат
{"ok":true,"result":[ {"update_id":751702982, "message":{"message_id":14,"from":{"id":123456789,"is_bot":false,"first_name":"Vasiliy","last_name":"Altunin","username":"username","language_code":"ru"},"chat":{"id":-517371153,"title":"altuninvv-dev","type":"group","all_members_are_administrators":false},"date":1628735066,"text":"test"}}
Это данные нашей группы.
Число
-517371153
И есть chatid нашей группы.
Отправляем сообщение в группу
Внесем изменения в код нашего бота:
<?php
include('vendor/autoload.php');
$token = "1234567890:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ";
use Telegram\Bot\Api;
$telegram = new Api($token);
$result = $telegram->getWebhookUpdates();
$chat_id = -517371153;
$r = "Hello user!";
$telegram->sendMessage(['chat_id' => $chat_id, 'text' => $r]);
Запустим несколько раз, открыв в веб-браузере страницу с ботом:
https://aacf63998e59.ngrok.io/d2549d33-255a-40a6-8cce-36c8f7efe780/6a98fbdb-9fc1-4681-878a-4e4292b79332.php
Каждый раз при запуске php-скрипта бот отправляет в группу сообщение.
Но он так же отправляет сообщение каждый раз, когда кто-то пишет сообщение в группу, изменим код, чтобы обрабатывать эту ситуацию:
<?php
include('vendor/autoload.php');
$token = "1234567890:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ";
use Telegram\Bot\Api;
$telegram = new Api($token);
$result = $telegram->getWebhookUpdates();
$chat_id = -517371153;
$text = $result["message"]["text"];
if(is_null($text)){
$r = "Hello user!";
$telegram->sendMessage(['chat_id' => $chat_id, 'text' => $r]);
}
Запустим отправку еще несколько раз.
Бот не реагирует на отправку текста!
Отправляем сообщения с сайта
На самом деле, совершенно необязательно устанавливать Вебхук, если всё что вам нужно это отправлять сообщение в группу!
Тем не менее мы рассматривали механизм Вебхуков, так как будем его использовать в будущих частях!
Создадим в папке с ботом файл index.php
touch /var/phpbots/landing-bot/index.php
Скопируем в него код нашего бота:
<?php
include('vendor/autoload.php');
$token = "1234567890:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ";
use Telegram\Bot\Api;
$telegram = new Api($token);
$result = $telegram->getWebhookUpdates();
$chat_id = -517371153;
$text = $result["message"]["text"];
if(is_null($text)){
$r = "Hello user!";
$telegram->sendMessage(['chat_id' => $chat_id, 'text' => $r]);
echo "Сообщение в группу отправлено!";
}
И откроем в браузере.
Сообщение в группу отправлено!
В группе появилось новое сообщение.
Создаем форму для отправки сообщения
Переименуем файл index.php в send.php
mv index.php send.php
Создадим пустой файл index.php
touch /var/phpbots/landing-bot/index.php
С содержимым:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Telegram-bot sender</title>
</head>
<body>
<form action="send.php">
<label for="fio">Имя</label><input type="text" name="fio"><p>
<label for="phone">Телефон</label><input type="text" name="phone"><p>
<label for="email">Email</label><input type="text" name="email"><p>
<label for="msg">Сообщение</label><textarea name="msg" rows="3"></textarea><p>
<input type="submit" name="submit" value="Отправить">
</form>
</body>
</html>
Вот такая у нас получилась страшненькая форма, для наших целей вполне сойдет:
Заполним форму и нажмем отправить, у нас откроется страница с адресом:
https://aacf63998e59.ngrok.io/d2549d33-255a-40a6-8cce-36c8f7efe780/send.php?fio=Василий&phone=%2B79123456780&email=send%40mail.ti&msg=Message&submit=Отправить
В будущем, естественно, вы будете использовать POST для отправки сообщений, но для отладки нам и эта сойдет!
Обратите внимание, что существуют множество тонкостей и способов, чтобы защитить ваши скрипты от спама, предотвратить использование их ботами и защитить от DDoS! Но их описание выходит за рамки рассматриваемой темы, поэтому вам придется дополнительно озаботиться безопасностью формы и защитой её при помощи captcha!
Внесем изменения в файл send.php
<?php
include('vendor/autoload.php');
$token = "1234567890:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ";
use Telegram\Bot\Api;
$telegram = new Api($token);
$result = $telegram->getWebhookUpdates();
$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$text = null;
$chat_id = -517371153;
$r = sprintf("Новое обращение через форму на вашем лэндинге!\nИмя:\n%s\nТелефон:\n%s\nEmail:\n%s\nСообщение:\n%s",
$_GET['fio'], $_GET['phone'], $_GET['email'], $_GET['msg']);
$telegram->sendMessage(['chat_id' => $chat_id, 'text' => $r]);
echo "Сообщение в группу отправлено!";
Перезагрузим страницу с нашей ссылкой:
Всё работает, как и задумано!
Заключение
Сегодня мы доработали наш Телеграмм-бот таким образом, чтобы он мог отправлять сообщения в группу по нашему выбору.
Рассмотрели процесс удаления Вебхука.
Разобрались как получить chatid группы.
Переписали бот для отправки сообщения в группу.
Создали примитивную форму для отправки сообщений.
Создали скрипт для отправки минимально форматированного текста в группу.
В следующей части мы рассмотрим форматирование текста с помощью HTML и Markdown.
Добавить комментарий