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

Как создать для неё свои команды было наверное одним из первых моих вопросов после того, как она попала ко мне в руки.
В этой статье мы сделаем простую команду на 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);
    }

Тестируем

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