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

Урок о том как создать php класс для работы своего Telegram бота.

Как создать свой 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, функция получает метод отправки     запроса и массив данных, отправляет запрос и возвращает результат в виде массива.     Подробней в http://botphp.ru/guides/perviy-bot/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".
  • getText - возвращает текст сообщения.

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

Комментарии