Во втором уроке я вам покажу как создать бота для Telegram и мы попробуем отправить несколько сообщений в чат.

Полный список всех записей курса находится на сайте https://prog-time.ru/course_cat/telegram-bot-basic/ или в публикациях на Хабр https://habr.com/ru/users/Prog-Time/posts/

Для того чтобы создать бота, нам необходимо сделать несколько последовательных действий.

1) Вам нужно авторизоваться в Telegram аккаунте

2) В поиске найти пользователя @BotFather

3) Отправить сообщение боту — /newbot

4) После отправки запроса , нужно указать имя бота

5) После этого дублировать название бота, но только суффиксом _bot

6) После успешной регистрации бота, @BotFather пришлёт вам сообщение с токеном, который вам нужно сохранить, в дальнейшем он нам понадобится.

7) Теперь нам нужно создать чат в который мы добавим нашего бота

8) Далее нам нужно получить id нашего бота. Для этого нужно перейти по следующей ссылке, где вместо символов X нужно подставить ваш токен:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Не закрывайте эту страницу, после 9 пункта, её нужно будет обновить.

9) Теперь вам необходимо отправить команду /join в чат для активации бота. После отправки команды, вам нужно обновить страницу, чтобы сделать повторный запрос.

Здесь вам нужно записать следующий фрагмент кода — id вашего бота.

Вам нужен id со знаком минус.

"my_chat_member":{"chat":{"id":-594377170, ...

Пример отправки сообщения боту в Telegram

Теперь давайте попробуем отправить сообщение нашему боту методом GET запроса.

Здесь мы создаём переменные в которые заносим токен, id чата и сообщение. Сообщение мы прогоняем через функцию urlencode() для формирования специальный кодировки, для создания запросов.

А в конце мы используем функцию file_get_contents() для отправки запроса.

$token = "5340791844:AAEXXD786InvQrlWHRXykV91USOQSevrPVU";
$chat_id = -594377170;

$textMessage = "Тестовое сообщение";
$textMessage = urlencode($textMessage);

$urlQuery = "https://api.telegram.org/bot". $token ."/sendMessage?chat_id=". $chat_id ."&text=" . $textMessage;

$result = file_get_contents($urlQuery);

Данный метод рабочий, но он не удобен для создания сложной структуры приложения. Для более гибкой настройки лучше использовать библиотеку Curl.

Информацию по использованию данной библиотеке, вы можете получить в следующей записи — https://prog-time.ru/parsing-php-biblioteka-curl/

Давайте посмотрим код для запросов, с использованием Curl.

$token = "5340791844:AAEXXDduvInvQrlykV91USOQSevrPVU";

$getQuery = array(
     "chat_id" 	=> 1424625511,
     "text"  	=> "Новое сообщение из формы",
     "parse_mode" => "html",
);
$ch = curl_init("https://api.telegram.org/bot". $token ."/sendMessage?" . http_build_query($getQuery));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);

$resultQuery = curl_exec($ch);
curl_close($ch);

echo $resultQuery;

Теперь мы получили более удобочитаемый код, благодаря записи параметров в массив $getQuery. При такой структуре, вам не нужно переписывать URL запроса, изменения вносятся только в массив $getQuery, а функция http_build_query() сама добавит строку параметров в URL запроса.

В дальнейших уроках, мы будем пользоваться библиотекой Curl, но вы должны понимать что многие запросы можно отправлять через функцию file_get_contents. Нужно просто составить правильный URL.

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

Разбор ответа от Telegram.

При создании запроса к боту, Telegram всегда отправляет ответ, который вы можете записать в переменную и вывести на экран.

Если вы допустили ошибку, то вам придёт сообщение с параметрами, в которых указан код ошибки с описанием.

В зависимости от метода работы, вам будут возвращаться разные ответы. В прошлом уроке мы с вами рассматривали документацию, где я рассказывал о типах данных которые вам могут прийти в ответе.

Сейчас давайте попробуем сделать запрос на отправку сообщения и разобрать полученный ответ.

{
  "ok": true,
  "result": {
    "message_id": 12,
    "from": {
      "id": 5340791844,
      "is_bot": true,
      "first_name": "test_prog_time",
      "username": "test_prog_time_bot"
    },
    "chat": {
      "id": 1424646511,
      "first_name": "Илья",
      "last_name": "Лящук",
      "username": "iliyalyachuk",
      "type": "private"
    },
    "date": 1658907913,
    "text": "Новое сообщение из формы"
  }
}

В ответе мы видим следующее:

  • Параметр «ok» — описывает успешность отправки запроса

  • «result» — возвращает массив с данными ответа, в которых:

    • «message_id» — id созданного сообщения

    • «from» — кто отправил сообщение

    • «chat» — данные о чате в который попало сообщение

    • «date» — дата создания сообщения

    • «text» — текст сообщения

Подведём итог.

  • Все боты для Telegram создаются через BotFather

  • Для отправки запросов вы можете использовать функцию file_get_contents или воспользоваться библиотекой Curl

  • Каждый запрос в Telegram возвращает ответ с описание результата запроса.

Третий урок уже на Хабр - https://habr.com/ru/post/697002/

Комментарии (3)


  1. FanatPHP
    03.11.2022 10:08
    +1

    А вот здесь уже во всю захромала логика :)


    Теперь мы получили более удобочитаемый код, благодаря записи параметров в массив $getQuery.

    А что нам мешало использовать массив $getQuery с file_get_conents()?


    Теперь мы получили более удобочитаемый код

    Но это же очевидно не так. Каким образом классическая карго-культ борода из curlopt может быть читабельнее одной строчки с file_get_contents()?


    "Где логика, где разум?" (с) Вовочка. Надо всегда вычитывать текст перед публикацией, на предмет таких неувязок.


    Кроме того


    • file_get_contents здесь получается немного функциональнее, сообщая об ошибке, если мы накосячили со ссылкой. А курл тут молча вернет пустоту. А с обработкой ошибок курловый код получится ещё больше.
    • вы не задумывались, что делает команда curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);? И действительно ли её надо писать каждый раз?

    ИМХО, не стоило здесь метаться между fgc() и курлом. А ввести курл позже, когда уже понадобится пост.


    1. trawl
      03.11.2022 19:05

      Но fgc ведь тоже умеет в пост


      1. FanatPHP
        03.11.2022 19:11

        Да, но речь здесь не об этом, а просто о логике изложения.