Вторник, 10.08.2021 02:15

Пишем бота для обратной связи с сайта. Часть 1. Создаем бота и настраиваем среду разработки

Пишем бота для обратной связи с сайта. Часть 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 

2021-08-09_19-29-35.png

Отец всех ботов выглядит ка как показано на рисунке. Разными «умниками» созданы поддельные боты, для продвижения всяческой чепухи, но нам нужен только главный!

2021-08-09_19-33-02.png

В чат боту напишем

 /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 нажмем на кнопку Запустить

2021-08-09_21-53-45.png

И получим ответ: 2021-08-09_21-54-54.png

Поздравляю! Мы с вами написали простой бот для Телеграм.

Заключение

Сегодня мы рассмотрели создание простого Телеграмм-бота.

Был установлен Composer PHP.

С его помощью мы установили библиотеку для разработки Телеграмм-ботов - telegram-bot-sdk.

Мы создали бот в Телеграмм и добавили его в специально созданную группу и получили токен.

Настроили Nginx и скрипт для бота.

Установили ngrok для организации доступа к боту, размещенному на нашем локальном сервере, из интернета.

Привязали Вебхук к публичному адресу ngrok.

Написали и протестировали простой Телеграмм-бот.

В следующей части мы рассмотрим отправку сообщения с формы сайта в группу Телеграмм.

Категория PHP
Теги PHP Telegram

Добавить комментарий

Простой текст

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
Просмотров: 136