Во втором уроке я вам покажу как создать бота для 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/
FanatPHP
А вот здесь уже во всю захромала логика :)
А что нам мешало использовать массив $getQuery с file_get_conents()?
Но это же очевидно не так. Каким образом классическая карго-культ борода из curlopt может быть читабельнее одной строчки с file_get_contents()?
"Где логика, где разум?" (с) Вовочка. Надо всегда вычитывать текст перед публикацией, на предмет таких неувязок.
Кроме того
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
? И действительно ли её надо писать каждый раз?ИМХО, не стоило здесь метаться между fgc() и курлом. А ввести курл позже, когда уже понадобится пост.
trawl
Но fgc ведь тоже умеет в пост
FanatPHP
Да, но речь здесь не об этом, а просто о логике изложения.