Деякий час назад я розповідав своєму боті для Telegram, який вміє дані з Google Analytics показувати. А тут Microsoft оголосила про запуск ботів Skype — саме час вивчити як це працює. Під катом — невеликий опис можливих проблем. Кому не терпиться подивитися результат, ось він — MetricsBot Add Bot to Skype.
Bot Framework vs. Skype Bot API
Для початку варто зрозуміти, що є Bot Framework, який дозволяє створювати ботів для багатьох месенджерів, в т. ч. і для Skype, а є Skype Bot API, який дозволяє створювати ботів саме для Skype. У кожного своя документація, свій каталог ботів (?) і своя реєстрація ботів. Начебто очевидно, що це різні речі, але я витратив досить багато часу, намагаючись розібратися в документації Bot Framework’a і реєстрації бота в ньому, коли очікував, що створюю бота без фрейворка. Далі мова буде йти саме про Skype Bot API, Bot Framework нам не потрібен, реєструвати там теж нічого не треба. Є Skype SDK для Node.js і C#. Їх я теж не використовував, т. к. писав бота на Python.
Корисні посилання
Для початку невеликий набір корисних посилань (посилання — англійською мовою):
- Введення
- Опис API
- Свої програми (тут необхідно створити новий додаток і отримати app id client secret)
- Управління своїми ботами (тут необхідно створити нового бота, вказавши app id отриманий раніше)
- Відео про створення бота
В принципі, з документації зрозуміло як працює бот і як він взаємодіє з Skype’ом, тому цю частину описувати не буду — розповім про складнощі.
Авторизація
Це виявилося найбільш трудомісткою для мене частиною. У документації зазначено, що для авторизації необхідно отримати токен, а потім використовувати його в заголовку HTTP при кожному зверненні:
Authorization: Bearer oauth2-token
Однак у документації чомусь забули вказати який scope необхідно використовувати для одержання сертифіката. Правильну відповідь можна знайти в коді Node.js SDK) —
https://graph.microsoft.com/.default
.
Але тут починається найцікавіше — якщо створювати URL для підтвердження користувачем (=власником бота), потім отримувати auth_code, а потім спробувати обміняти цей код на access token, то проблема виникне на першому ж кроці — при відкритті створеного URL, Microsoft лається на неправильний scope. Правильного scope, до речі, немає в списку можливих варіантів документації Microsoft. Я намагався вказувати іншій scope — openid offline_access https://graph.microsoft.com/user.read
, в цьому випадку мені вдавалося отримати token, тільки от з ним взаємодіяти зі Skype не вдавалося.
Рішення виявилося несподіваним для отримання access_token, необхідно було відправити звичайний POST запит:
curl -X POST -H “Cache-Control: no-cache” -H “Content-Type: application/x-www-form-urlencoded” -d ‘client_id=&client_secret=&grant_type=client_credentials&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default’ ‘https://login.microsoftonline.com/common/oauth2/v2.0/token’
У відповідь повертається access_token expires_in (без якого-небудь refresh_token). Такого OAuth я ще не зустрічав.
Відправка повідомлень
Відправлення повідомлень досить проста —
POST /v2/conversations/8:alice/activities HTTP/1.1
Host: apis.skype.com
Authorization: Bearer oauth2-token
{
“message”: {“content” : “Hi! (wave)”}
}
Запити надсилаються на apis.skype.com. В документації забули вказати, що запити повинні йти по https.
В тексті можна використовувати html-теги. Які точно — поки невідомо (в документації списку немає).
Є цікаві та неописані обмеження на запропонований текст. Наприклад, в тексті можна використовувати символи &, < >. Відсутність можливості передати символ & створює проблему при передачі посилань. Ще одна проблема при передачі посилань — автоматично створювані превью для кожного посилання. У моєму боті MetricsBot у тексті запрошення три посилання, Skype створює три превью. Відключити це поки не можна.
Публікація бота
Після створення бота можна спробувати його опублікувати (до цього кількість користувачів бота обмежено — ним може користуватися лише 100 чоловік). Скільки часу займає процес публікації — не ясно, документації цього немає. Мого бота поки так і не опублікували. На офіційному форумі моє запитання на цю тему оминають стороною (хоча на інші мої запитання співробітники Microsoft відповідають). Зверніть увагу, що для публікації бота треба відключити використання бота в групових чатах. Взагалі, створення бота для Skype досить просто.