Как создать простую голосовую команду для Яндекс Станции (Алисы)

Как создать для неё свои команды было наверное одним из первых моих вопросов после того, как она попала ко мне в руки.
В этой статье мы сделаем простую команду на PHP которая будет отвечать мне какая версия PHP сейчас на EvilCoder.

Вообще принцип работы очень простой. Вы говорите что-то Алисе, она это как-то распознаёт и просто отсылает вебхук туда, куда надо. За счёт этого можно сделать практически любые команды, например: "Сделай бэкап базы на моём сайте", "Скинь отчёт за сегодня по EvilCoder в Telegram", "Скажи какая температура процессора на сервере", "Прочитай последний комментарий на сайте", "Закажи мою любимую пиццу" и так далее.

По классике, вот такие этапы нас ждут:


  1. Создаём команду на сервере Yandex

  2. Пишем файл callback.php

  3. Тестируем


Для теста у нас будет команда, которая будет отвечать на вопрос: "Версия PHP на сервере".

 

Создаём команду на сервере Yandex


Команду для Алисы мы будем создавать приватную, т.е. исключительно для нашего использования. Такой команде не нужно проходить модерацию и можно сразу пускать её в ход и тестировать.
Так же это значит, что привязанный к яндекс станции аккаунт должен быть тем же, через который Вы будете создавать навык.

Сейчас я покажу на что нужно обратить внимание.
Нам нужно перейти по этой ссылке и жмакнуть на большую кнопку "Создать диалог" и выбрать "Навык в Алисе".

Здесь вы можете заполнять всё по своему желанию. Два самых важных поля, это "Backend" и "Тип доступа".
В "Backend" обязательно ставим URL до нашего скрипта, а в поле "Тип доступа" обязательно ставим, что это "Приватный".

Всё остальное можете выставить по своему усмотрению.

Дайте яндексу немного подумать и всё, он сохранит нашу команду и вебхук.

 

Пишем файл callback.php


Нам нужна минимально рабочая и понятная версия, без всякой воды. Однако добавить разные проверки и точку выхода не будет лишним. Вот такое вот содержимое файла callback.php:


<?php
    $data = file_get_contents('php://input'); //Получаем тело в виде json
    header('Content-Type: application/json');
    $data = json_decode($data, true); //Раскодируем json файл

    //Проверяем нужные поля
    if (!isset($data['request'], $data['session'])) {
        //Возвращаем ничего, т.к. нам не пришло необходимых полей
        exit(json_encode([]));
    } else {
        //В данном тестовом примере нам не нужен текст запроса и т.д.
        //Однако текст запроса можно найти в $data['request']['command']

        $response = json_encode([
            'version' => '1.0',
            'session' => [
                'session_id' => $data['session']['session_id'],
                'message_id' => $data['session']['message_id'],
                'user_id' => $data['session']['user_id']
            ],
            'response' => [
                'text' => 'На сервере EvilCoder PHP версии ' . phpversion(),
                //Ставим плюсики перед теми гласными, на которые ударение
                'tts' => 'На с+ервере +ивилкодера пиэйчп+и в+ерсии '. phpversion(),
            ]
        ]);
        exit($response);
    }

Тестируем


Всё, можем спросить у станции всё по той же команде, которую вы настроили ещё на этапе создания команды на сервере яндекса. :)