Всем привет, сегодня продолжаем писать нашего бота для 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 погоды, курса валют, карт и многое многое другое.
Спасибо за внимание, если остались вопросы или что-то не получается — оставляйте ваши комментарии, разберёмся)