Skip to main content

Бот для Telegram на PHP. Часть 2

Всем привет, сегодня продолжаем писать нашего бота для telegram на php. В предыдущей части мы научились устанавливать BotMan и создали простого бота который отвечает на сообщение. В этом уроке мы создадим бота с командой, вызвав которую бот нам скинет картинку. Продолжать мы будем с предыдущей части.

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

  • Пользователь вводит команду и отправляет боту
  • Бот принимает команду
  • На основе команды мы делаем запрос на внешний API
  • Получаем ответ
  • Отправляем ссылку пользователю

Чтобы у нас была возможность использовать команды, их нужно сначала установить. Для этого в телеграме находим бота @BotFather и пишем команду /setcommands. Далее нужно выбрать которому из ботов задавать команды и отправить ему список команд в формате:

command1 - Description
command2 - Another description

Я сделаю только одну команду:

cat - Send image with cat

Теперь запустив бота вы должны увидеть это

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

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

Первым делом я создал контроллер который будет обрабатывать поступающие запросы:

php artisan make:controller CatController

Пока в контроллере я создал только один метод start который ничего не делает ( пока еще)

Для того, чтобы сообщения попадали в контроллер, нам нужно изменить файл с маршрутами. Откроем файл routes/botman.php и заменим следующим содержимым:

<?php
use App\Http\Controllers\CatController;

$botman = resolve('botman');

$botman->hears('/cat', CatController::class.'@start');

И сам контроллер:

<?php

namespace App\Http\Controllers;

use App\Services\CatApiService;
use BotMan\BotMan\BotMan;
use BotMan\BotMan\Messages\Attachments\Image;
use BotMan\BotMan\Messages\Outgoing\OutgoingMessage;

/**
 * Class CatController
 * @package App\Http\Controllers
 */
class CatController extends Controller
{
    /**
     * @var CatApiService 
     */
    private $service;

    /**
     * CatController constructor.
     * @param CatApiService $service
     */
    public function __construct(CatApiService $service)
    {
        $this->service = $service;
    }

    /**
     * @param BotMan $bot
     */
    public function start(BotMan $bot)
    {
        $imageLink = $this->service->getImageLink();

        $bot->reply(
            OutgoingMessage::create()
                ->withAttachment(new Image($imageLink))
        );
    }
}

Для поиска изображений будет использоваться сервис https://thecatapi.com, всё взаимодействие с сервисом будет происходить в отдельном файле который я создал в папке app/Services (такой папки изначально нет, её нужно создать).

Напишем теперь сам сервис. Для выполнения к стороннему API нам нужен сторонний пакет — Guzzle, а так же специальный ключ, с помощью которого сервис будет давать возможность нам выполнять запросы.

Для установки Guzzle нужно выполнить команду:

composer require guzzlehttp/guzzle

Для получения ключа заходим на сайт https://thecatapi.com и нажимаем справа вверху на кнопку Sign Up. Далее вас попросят ввести email и описание, заполняете поля. После этого вам на почту придет письмо в котором есть строчка
Your API Key
, он нам и нужен.

Для удобства я создал конфиг в папке configs, назвал файл cat-api.php

<?php

return [
    'token' => env('CAT_API_TOKEN', null),
    'url' => env('CAT_API_URL', 'https://api.thecatapi.com/')
];

Для того, чтобы задать token и url, нужно указать соответствующие переменные в ENV файле (.env).

Код сервиса app/Services/CatApiService.php

<?php

namespace App\Services;
use GuzzleHttp\Client;
use Illuminate\Support\Arr;

/**
 * Class CatApiService
 * @package App\Services
 */
class CatApiService
{
    /**
     * @var Client
     */
    private $client;

    /**
     * CatApiService constructor.
     */
    public function __construct()
    {
        $this->client = new Client([
            'base_uri' => config('cat-api.url'),
            'headers' => [
                'X-API-KEY' => config('cat-api.token')
            ]
        ]);
    }

    /**
     * @return string
     */
    public function getImageLink() : string
    {
        $cat = json_decode($this->getRandomCat(), true);
        return Arr::get($cat[0], 'url', 'https://cdn2.thecatapi.com/images/a86.jpg');
    }

    /**
     * @return string
     */
    private function getRandomCat() : string 
    {
        return $this->client->get('v1/images/search', [
            'has_breeds' => true,
            'mime_types' => 'jpg,png',
            'limit' => 1
        ])->getBody()->getContents();
    }
}

Теперь можете открыть вашего бота, написать ему /cat и получить изображение с котом)

Вот таким образом можно взаимодействовать с внешними сервисами через телеграм. Это могут быть API погоды, курса валют, карт и многое многое другое.

Спасибо за внимание, если остались вопросы или что-то не получается — оставляйте ваши комментарии, разберёмся)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *