Пишем бота для обратной связи с сайта. Часть 1. Создаем бота и настраиваем среду разработки
Наличие лэндинга на вашем сайте ставит перед вами очевидную задачу – необходимость своевременно отвечать потенциальным клиентам на вопросы, задаваемые через встроенные в лэндинг формы.
Это может быть простая форма обратной связи или форма с заказом обратного звонка, в любом случае чем быстрее будет дан ответ, тем больше шансов, что посетитель станет вашим клиентом или покупателем.
Сегодня я начинаю цикл статей, в которых мы рассмотрим написание простого Телеграмм-бота, который будет присылать сообщение в специально созданный канал, после того, как пользователь заполнил форму на вашем сайте.
А чтобы не изобретать велосипед мы будем использовать готовую библиотеку:
https://github.com/irazasyed/telegram-bot-sdk
Но для её установки нам потребуется Composer!
Установка Composer
Установим Composer, это популярный установщик библиотек для PHP. Данный метод рекомендуется в документации для использования при установке.
Актуальную команду для установки вы можете найти на странице проекта –
https://getcomposer.org/doc/faqs/how-to-install-composer-programmatically.md
Создадим папку для будущего бота:
sudo mkdir -p /var/phpbots/landing-bot
Перейдем в папку
sudo cd /var/phpbots/landing-bot
Для упрощения разработки установим права доступа на папку:
sudo chmod -R 777 /var/phpbots/landing-bot
Обратите внимание! При установке на продакшн-сервер права 777 на папку ставить строго не рекомендуется!
Запустим
sudo wget https://raw.githubusercontent.com/composer/getcomposer.org/76a7060ccb93902cd7576b67264ad91c8a2700e2/web/installer -O - -q | php –
Перенесем скрипт в папку
/usr/local/bin/
Таким образом он будет глобально:
sudo mv composer.phar /usr/local/bin/composer
Проверим корректность установки:
sudo composer self-update
You are already using the latest available Composer version 2.1.5 (stable channel).
Установка библиотеки telegram-bot-sdk
Обратите внимание строго не рекомендуется запускать composer из под пользователя root.
Используйте учетную запись обычного пользователя!
Запустим установку.
composer require irazasyed/telegram-bot-sdk ^2.0
./composer.json has been created
Running composer update irazasyed/telegram-bot-sdk
Loading composer repositories with package information
Updating dependencies
Lock file operations: 20 installs, 0 updates, 0 removals
- Locking doctrine/inflector (2.0.3)
…
- Locking symfony/translation-contracts (v2.4.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 20 installs, 0 updates, 0 removals
- Downloading doctrine/inflector (2.0.3)
…
- Downloading irazasyed/telegram-bot-sdk (v2.3.0)
- Installing doctrine/inflector (2.0.3): Extracting archive
…
- Installing irazasyed/telegram-bot-sdk (v2.3.0): Extracting archive
15 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
10 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Я сильно сократил вывод команды, для экономии места!
После окончания установки будет создана папка
vendor
и два файла
composer.json
composer.lock
На этом установка библиотеки закончена!
Создание бота в Телеграмм
Для того, чтобы бот мог отправлять сообщения, его нужно создать и пригласить на канал.
Откройте в Телеграмм раздел Все чаты и введите в строку поиска:
@BotFather
Отец всех ботов выглядит ка как показано на рисунке. Разными «умниками» созданы поддельные боты, для продвижения всяческой чепухи, но нам нужен только главный!
В чат боту напишем
/newbot
Alright, a new bot. How are we going to call it? Please choose a name for your bot.
Напишем имя бота. Так как я создаю тестового бота, то и назову его:
Ru-Test9999-bot
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.
Теперь нам нужно придумать внешнее имя, это имя, по которому его можно будет найти в Телеграмм.
Обратите внимание, что многие имена уже зарегистрированы и даже имя Ru-Test9999-bot занято! Будем импровизировать:
Ru_Test9999_bot
Если всё прошло успешно, вы получите сообщение:
Done! Congratulations on your new bot. You will find it at t.me/Ru_Test9999_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.
Use this token to access the HTTP API:
1234567890:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Keep your token secure and store it safely, it can be used by anyone to control your bot.
For a description of the Bot API, see this page: https://core.telegram.org/bots/api
Нас интересует строчка вида:
1234567890:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Это токен вашего бота и вы должны бережно его хранить в недоступном месте! Никому не сообщать и не забывать удалять его из исходного кода, если размещаете его на github.com!
Для теста я создал группу:
altuninvv-dev
и при создании ввел имя бота
Ru_Test9999_bot
После создания группы зайдите в Настройки группы - Разрешения и уберите все возможности. Это будет канал для бота, соответственно нам не нужно, чтобы сюда писали всякую чушь и приглашали левых людей.
Так же откроем Управление группой и сделаем Ru_Test9999_bot администратором.
На этом настройка бота завершена.
Чтобы бот из Телеграм имел доступ к программному коду на вашем сервере нам потребуется доменное имя и доступ к серверу по протоколу https://
Настройка Nginx
Бот должен быть доступен по https://. Давайте настроим Nginx для предоставления доступа к файлу с ботом.
Чтобы защититься от разных «хацкеров» я рекомендую создать на веб-сервере папку с длинным именем. Для этого сгенерируем UUID:
python -c 'import uuid; print(str(uuid.uuid4()))' d2549d33-255a-40a6-8cce-36c8f7efe780
Каждый раз при запуске результат будет разным!
Создадим папку для веб-сервера
sudo mkdir /var/www/phpbots
В папке создадим симлинк до папки /var/phpbots/landing-bot
cd /var/www/phpbots sudo ln -s /var/phpbots/landing-bot d2549d33-255a-40a6-8cce-36c8f7efe780
Теперь, если мы напишем:
ls /var/www/phpbots/d2549d33-255a-40a6-8cce-36c8f7efe780 composer.json composer.lock vendor
То увидим содержимое папки /var/phpbots/landing-bot
Создадим файл конфигурации для nginx
server {
listen 9966 default_server;
listen [::]:9966 default_server;
root /var/www/phpbots;
# Add index.php to the list if you are using PHP
index index.php index.html;
server_name _;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include /etc/nginx/fastcgi.conf;
}
}
Откроем
http://192.168.1.42:9966
Получим
403 Forbidden
nginx/1.14.1
Создадим в папке
/var/www/phpbots/d2549d33-255a-40a6-8cce-36c8f7efe780
файл test.php с содержимым:
<?php echo phpinfo(); ?>
Откроем
http://192.168.1.42:9966/d2549d33-255a-40a6-8cce-36c8f7efe780/test.php
Откроется страница с phpinfo()
Настройка туннеля с помощью ngrok.com
Еще одной проблемой при разработке бота является то, что нам придется вносить изменения сразу на сервере. Не хотелось и не рекомендуется использовать продакшн-сервер для опытов.
Чтобы решить эту проблемы мы воспользуемся бесплатным планом сервиса https://ngrok.com
Установим клиент ngrok на наш локальный сервер:
Зарегистрируйтесь на сайте и в разделе
https://dashboard.ngrok.com/get-started/setup
Скачайте файл ngrok-stable-linux-amd64.zip
На момент написания статьи ссылка была такой:
https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
Но лучше скопировать свежую!
Скачаем в папку обычного пользователя, опять же, не запускайте ничего от root без необходимости!
cd ~ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
Обратите внимание мы будем запускать ngrok от обычного пользователя!
Распакуем архив:
unzip ngrok-stable-linux-amd64.zip
Archive: ngrok-stable-linux-amd64.zip
inflating: ngrok
На странице
https://dashboard.ngrok.com/get-started/setup
вы найдете команду для добавления вашего токена в локальное хранилище ngrok
скопируйте и запустите строчку вида:
./ngrok authtoken XXXXXXXXXXваштокенXXXXXXXXXXXXXXXXXXXXXXX
Authtoken saved to configuration file: /home/user/.ngrok2/ngrok.yml
Запустим ngrok:
./ngrok https 9966
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Account Vasiliy Altunin (Plan: Free)
Version 2.3.40
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http:// bc8ab1191806.ngrok.io -> http://localhost:9966
Forwarding https:// bc8ab1191806.ngrok.io -> http://localhost:9966
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
Откроем
https://bc8ab1191806.ngrok.io/d2549d33-255a-40a6-8cce-36c8f7efe780/test.php
Обратите внимание, bc8ab1191806 меняется каждый раз, когда вы перезапускаете ngrok. Чтобы получить постоянное имя придется купить подписку!
Но нам для написания и отладки бота хватит и бесплатного функционала.
Откроем ссылку
https://bc8ab1191806.ngrok.io/d2549d33-255a-40a6-8cce-36c8f7efe780/test.php
И увидим свою страницу phpinfo().
Привязываем Вебхук (Webhook)
Теперь, когда у нас есть внешний домен, пришла пора привязать к боту наш сайт через Вебхук.
Каждый раз, когда пользователь взаимодействует с ботом, тот отсылает сообщение на наш сервер, чтобы указать адрес, на который бот должен направлять запросы используется Вебхук.
Создадим файл для будущего бота:
python -c 'import uuid; print(str(uuid.uuid4()))'
6a98fbdb-9fc1-4681-878a-4e4292b79332
sudo touch /var/phpbots/landing-bot/6a98fbdb-9fc1-4681-878a-4e4292b79332.php
Откроем в браузере:
https://bc8ab1191806.ngrok.io/d2549d33-255a-40a6-8cce-36c8f7efe780/6a98fbdb-9fc1-4681-878a-4e4292b79332.php
Получим пустую страницу – это хорошо, значит файл доступен.
Далее не забудьте заменить
1234567890:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
На ваш токен!
Обратите внимание, мы добавили bot перед токеном ЭТО ВАЖНО!
Привяжем URL
Для этого укажем токен и адрес файла с ботом!
curl https://api.telegram.org/bot1234567890:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/setWebhook?url= https://bc8ab1191806.ngrok.io/d2549d33-255a-40a6-8cce-36c8f7efe780/6a98fbdb-9fc1-4681-878a-4e4292b79332.php
{"ok":true,"result":true,"description":"Webhook was set"}
Таким образом мы установили Вебхук!
Пишем код для бота
Напишем простой код для бота:
<?php
include('vendor/autoload.php');
$token = "1234567890:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ";
use Telegram\Bot\Api;
$telegram = new Api($token);
$result = $telegram->getWebhookUpdates();
$text = $result["message"]["text"];
$chat_id = $result["message"]["chat"]["id"];
if($text == "/start"){
$r = "Hello user!";
$telegram->sendMessage(['chat_id' => $chat_id, 'text' => $r]);
}
Откроем ссылку:
https://bc8ab1191806.ngrok.io/d2549d33-255a-40a6-8cce-36c8f7efe780/6a98fbdb-9fc1-4681-878a-4e4292b79332.php
Notice: Undefined index: message in /var/phpbots/landing-bot/vendor/illuminate/support/Collection.php on line 1290
Notice: Trying to access array offset on value of type null in /var/phpbots/landing-bot/6a98fbdb-9fc1-4681-878a-4e4292b79332.php on line 12
Notice: Undefined index: message in /var/phpbots/landing-bot/vendor/illuminate/support/Collection.php on line 1290
Notice: Trying to access array offset on value of type null in /var/phpbots/landing-bot/6a98fbdb-9fc1-4681-878a-4e4292b79332.php on line 13
Notice: Trying to access array offset on value of type null in /var/phpbots/landing-bot/6a98fbdb-9fc1-4681-878a-4e4292b79332.php on line 13
Так ка мы вызываем бот напрямую, он выдает множество нотисов, это нормально!
В будущем мы добавим проверку и в случае вызова напрямую, он будет отдавать страницу с кодом 403.
Откроем Телеграмм и найдем бот Ru_Test9999_bot нажмем на кнопку Запустить
И получим ответ:
Поздравляю! Мы с вами написали простой бот для Телеграм.
Заключение
Сегодня мы рассмотрели создание простого Телеграмм-бота.
Был установлен Composer PHP.
С его помощью мы установили библиотеку для разработки Телеграмм-ботов - telegram-bot-sdk.
Мы создали бот в Телеграмм и добавили его в специально созданную группу и получили токен.
Настроили Nginx и скрипт для бота.
Установили ngrok для организации доступа к боту, размещенному на нашем локальном сервере, из интернета.
Привязали Вебхук к публичному адресу ngrok.
Написали и протестировали простой Телеграмм-бот.
В следующей части мы рассмотрим отправку сообщения с формы сайта в группу Телеграмм.
Добавить комментарий