После того как мы поняли основные принципы работы API, нам нужно создать свой php класс для API бота, в стиле ООП. Что бы не пришлось использовать if else как в примере "простого бота". Давайте же напишем его, а потом при необходимости будем его дополнять.
Пока что нам нужно что бы он умел отправлять сообщения. Так же нам нужно прописать конструктор для него. Посмотрим код:
<?php
class Bot {
//бот токен.
private $token;
//Данные которые мы получим через webhook
public $data;
//Массив с данными о пользователе у которого диалог с ботом
public $user;
//создаем экземпляр бота, при создании бота указываем токен
public function __construct($token) {
//сохраняем в свойства полученный токен
$this->token = $token;
//получаем данные от webhook
$this->data = json_decode(file_get_contents('php://input'), true);
//записываем информарция о пользователе
$this->setUser();
}
//Функция что бы установить пользователя в свойство user
public function setUser() {
//исходя из типа полученного update записываем информацию о текущем чате
if($this->getType() == "callback_query") {
$this->user = $this->data['callback_query']['message']['chat'];
} elseif ($this->getType() == "inline_query") {
$this->user = $this->data['inline_query']['from'];
} else {
$this->user = $this->data['message']['chat'];
}
}
//получение id чата
public function getChatId(){
return $this->user['id'];
}
//Функция что бы получить тип сообщения
//Другие типы сообщений мы расмотрим в следующих уроках
public function getType(){
if (isset($this->data['callback_query'])) {
return "callback_query";
} elseif (isset($this->data['inline_query'])) {
return "inline_query";
} elseif (isset($this->data['message']['text'])) {
//если это простой текст боту, то вернем "message".
return "message";
} elseif (array_key_exists('message', $this->data)) {
return "object_message";
} else {
return false;
}
}
//функция что бы получить текст сообщения из полученных данных
public function getText(){
if ($this->getType() == "callback_query") {
return $this->data['callback_query']['data'];
} elseif ($this->getType() == "inline_query") {
return $this->data['inline_query']['query'];
}
return $this->data['message']['text'];
}
/*
отправляем запрос к API Telegram, функция получает метод отправки
запроса и массив данных, отправляет запрос и возвращает результат в виде массива.
Подробней в https://docs.telegid.me/start/first-bot
*/
public function sendApiQuery($method, $data = array()) {
$ch = curl_init('https://api.telegram.org/bot' . $this->token . '/' . $method);
curl_setopt_array($ch, [
CURLOPT_POST => count($data),
CURLOPT_POSTFIELDS => http_build_query($data),
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 10
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
return $res;
}
}
Быстро пробежимся по функциям.
- __construct - в свойство класса сохраняем token от API, для отправки запросов. В свойство data записываем полученный объект Update через webhook. Запускаем функцию setUser, что бы записать данные о пользователе с которым диалог.
- setUser - через функцию getType проверяем какой тип данных к нам пришел и исходя из этого в свойство класса user записываем массив данных о пользователе.
- getChatId - простая функция которая вернет id пользователя с которым чат, будет полезна что бы отправить сообщение ему.
- getType - функция которая определяет какой тип данных к нам поступил. Для начала достаточно просто проверить сообщение ли это или нет. Обязательно рассмотрим подробней в следующих уроках. Если есть в массиве массив с ключем "message" и у него есть элемент "text", то вернет "message". Все типы данных в Update смотрите тут.
- getText - возвращает текст сообщения.
Теперь у вас есть простой класс для отправки запросов. В следующих уроках, мы обязательно будем дополнить его новыми возможностями.
Опубликовано: 30 ноября 2023
Последнее обновление: 2 декабря 2023
Автор: Семен