Как создать свой class для PHP бота

После того как мы поняли основные принципы работы 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
Автор: Семен

Предыдущий урок:
Как создать простого бота
Следующий урок:
Пишем свой class обработки webhook