Делаем бот для обратной связи в Telegram

Делаем бот для обратной связи в Telegram

iMakeBots

Немаловажная часть работы администратора Телеграм канала - это конечно же работа с обратной связью. Многое приходит из общения с подписчиками, ведь они и оценивают ваш труд, и подсказывают где у вас недочеты, бывает даже подкинут новую идею. Они всегда будут вам благодарны если вы открыты для общения, и у вас налажена обратная связь, которой удобно и легко пользоваться. 

В этой статье я хочу поделиться своим ботом для взаимодействия с подписчиками, который я уже использую. Для начала нам в качестве необходимых параметров нам нужно знать наш личный ID Telegram (через бот @userinfobot) и Token API нашего бота.


Начинаем работать

Данные от Bot API приходят в формате application/json, поэтому доступа к ним через массив $_POST нет, и брать их будем в "сыром", необработанном виде через 'php://input' используя встроенную функцию PHP file_get_contents().

В работе мы будем использовать кодировку UTF-8, это требование Telegram Bot API. Определим ее в начале скрипта index.php. Создадим класс Bot, для начала добавим ему два приватных свойства и один публичный метод. Очень часто я в коде буду использовать в качестве условного оператора тернарный оператор.

Создадим еще один метод, сделаем его приватным т.к. он нужен нам только внутри класса, вызываться из вне как публичный метод init() он не будет. Его задача будет преобразовывать через функцию json_decode() преданные ему данные из JSON в ассоциативный массив, назовем его getData().

Для отладки можно создать метод, который будет записывать в файл все результаты работы метода getData(). Это очень удобно, ведь можно посмотреть какую информацию отправляет нам Bot API. На входе он принимает результат метода getData(). Вызывать метод можно вот так: $this->setFileLog($data);

Находим наш бот в Telegram и запускаем его. Бот примет нашу команду Strat/Старт, обработает и запишет результат в файл. Теперь мы можем рассмотреть содержимое файла.

Как видно из содержимого, приходит много служебной информации. Сейчас нас интересует элемент массива $data['message'], который тоже является массивом и содержит в себе информацию, с которой предстоит работать. Проверяя наличие нужных нам ключей в массиве, мы можем определить какой тип данных был отправлен боту. Для данного бота важно определить кто написал, ведь от этого зависит куда направлять сообщение. 

У нас предусмотрено две роли: администратор и пользователь. Есть еще один участник - это сам бот. Мы его будем определять по специальному флагу, но это чуть позже.



Мои первые ошибки 

В начале, когда я делал этого бота, то потратил время на написание лишней логики. Бот принимал сообщения от пользователя проверял тип и направлял его админу как новое сообщение с вложенной кнопкой "Ответить", при нажатии на которую происходила временная запись в файл id пользователя, и бот следующим действием ждал сообщение от админа для ответа пользователю. Получилось много ненужного кода, каких-то проверок и вообще пользоваться было не удобно.

Также если админ начал писать ответ, то написать ему еще одно сообщение, даже другому пользователю было нельзя пока админ не закончит. Еще ограничение было если у пользователя не задан @userName, то просмотреть его профиль было никак. Конечно придумать хаки для достижения полной работоспособности этой логики можно было, но все оказалось намного проще. 



Решение пришло из официальной документации

На самом деле нужно было просто внимательнее читать официальную документацию Telegram Bot API. Есть такой методforwardMessage - он позволяет переслать сообщение, и не важно, что в нем текст, стикер или медиа, бот просто его перенаправит в тот чат в какой укажете. Этим методом и воспользуемся. Пользователю мы будем просто отвечать на его сообщение, используя для этого доступную функцию "Ответить" в контекстном меню интерфейса приложения Телеграм, специального кода для этого не нужно. 

Плюсы от использования:

  1. когда сообщение переслано то в нем видно кто написал, и даже если у пользователя нет @userName мы сможем посмотреть его профиль;
  2. когда мы отвечаем на сообщение, то видим в общем списке сообщений на что мы ответили.
Сторона пользователя
Отвечаем пользователю
Сторона администратора



Пишем логику бота обратной связи

В момент старта - бот отправляет нам сообщение с текстовым сообщением /start. Нам надо это сообщение поймать и обработать, например, поздороваться с пользователем, дать ему понять, что бот готов к работе. А если стартует админ, то просто сообщить ему, что бот готов. 

Давайте напишем несколько вспомогательных методов для нашего класса Bot

Настало время поговорить о том, как отправить сообщение через бот. За это отвечает целый набор методов Telegram Bot API, перечислю только те, которые мы будем использовать в рамках этой статьи:

  1. sendMessage - текстовое сообщение
  2. sendPhoto - фотография
  3. sendAudio - аудио-файл
  4. sendDocument - документ
  5. sendVideo - видео-файл
  6. sendSticker - стикер

Telegram Bot API принимает как POST так и GET HTTP-запросы. Мы напишем метод, который будет оправлять POST запрос используя возможности CURL

Добавим еще пару свойств и изменим наш публичный метод init(), опишем в нем действия если пришло сообщение о начале диалога с ботом. В добавленных свойствах будет приветственное слово: одно для админа, другое для пользователя. И еще один метод для замены в приветственном сообщении для пользователя {username} на имя пользователя из полученных данных при помощи функции str_replace(), это придаст приветствию персонализацию. 

Теперь давайте опишем действия если это уже очередное сообщение, а не начало диалога с ботом, оно может быть, как от пользователя, так и от админа. Следующий код - это обработка сообщения от пользователя - перенаправление сообщения администратору - здесь все просто: создаем массив с обязательными параметрами для метода forwardMessage и передадим в наш метод для отправки запроса в API. 

Чтобы пользователь получил от бота сообщение, боту нужно сказать в какой чат отправлять, узнаем id чата пользователя из специального параметра

Добавим несколько проверок

Исключим ситуацию когда админ может забыть использовать в контекстном меню команду "Ответить", для этого нужно сделать проверку, и в таком случае вывести предупреждение, добавим еще одно свойство в котором будет текст предупреждения, и метод в котором будем проверять наличие ключа reply_to_message с помощью функции array_key_exists(), это ключ скажет нам, что это ответ на чье-то сообщение

Обработаем еще одну ситуацию, когда админ по ошибке может начать отвечать на сообщение бота. Согласитесь такое ведь тоже может быть, у меня было )) поэтому и родилась эта проверка. Когда сообщение прислал бот (это может быть предупреждение или приветствие для админа) то это можно определить проверив значение ['from']['is_bot'] оно будет равно единице. Вторым условием в проверке исключим ситуацию, когда бот пересылает сообщение пользователя, потому что при ответе на сообщение пользователя, в служебных данных будет присутствовать флаг, определяющий отправителя как бота.

Надеюсь не устали читать? Потерпите осталось еще немного ))

Опишем обработку отправки сообщения пользователю от админа, здесь нам нужно сначала определить, что мы будем отправлять: текст, документ, картинку, стикер, аудио или видео. Для администратора это сделает интерфейс Телеграма, боту же нужно использовать методы Telegram Bot API. У каждого метода API есть свои обязательные параметры. Создадим еще один метод, который будет понимать, что отправил админ, заполнит необходимые параметры и предаст их в метод для отправки запроса в Telegram с соответствующей командой.

И заключительная часть - это отправка и реализация проверок сообщений от администратора к пользователю


Подводим итоги

У нас получился вполне работоспособный бот для поставленной задачи по осуществлению обратной связи с администратором канала. Его также можно применять и для службы поддержки. Весь исходный код бота вы можете скачать и пользоваться им без каких-либо ограничений на свой страх и риск. 

Вы можете оставить комментарий к статье.

Report Page