Некоторое время назад я рассказывал о своем боте для Telegram, который умеет данные из Google Analytics показывать. А тут Microsoft объявила о запуске ботов в Skype — самое время изучить как это работает. Под катом — небольшое описание возможных проблем. Кому не терпится посмотреть результат, вот он — MetricsBot .
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=<your-app-id>&client_secret=<your-app-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 довольно просто.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (26)
khaale
13.04.2016 10:27Как долго пришлось ждать разрешения после sign up'а в Skype Bot Developer Preview?
and7ey
13.04.2016 10:40Разрешения на что? На публикацию бота разрешение пока так и не получил.
khaale
13.04.2016 10:49У меня после клика на https://developer.microsoft.com/en-us/skype/bots появляется регистрационная форма, после ее заполнения обещают прислать дальнейшие инструкции на email. Жду ответа со вчерашнего вечера :)
and7ey
13.04.2016 11:04Этот процесс у меня занял довольно много времени. Может, неделю. Но в моем случае, наверное, Skype API ещё не было открыто для всех разработчиков, потому пришлось ждать сначала открытия, а потом уже согласования.
prefrontalCortex
13.04.2016 10:48
Curl же по умолчанию шлёт POST-запросы вcurl -X POST -H "Cache-Control: no-cache" -H "Content-Type: application/x-www-form-urlencoded"
application/x-www-form-urlencoded
.
disem
13.04.2016 11:25А не запаблишеный бот сейчас может писать/читать в групповых чатах?
and7ey
13.04.2016 11:30Я тестировать это не стал в итоге, так что не знаю. Но судя по документации — может. Попробуйте и поделитесь с нами информацией ;).
disem
13.04.2016 11:36Я через бот платформу интегрировался, своего бота к себе не могу добавить на андроиде (его просто нет в контактах, чужие появляются), для мак клиента боты еще не доступны. Так что пока не ясно когда я туда доберусь :)
Diden05
13.04.2016 11:33+1Может, но это функционал доступный как limited preview for developer accounts only, а при его использовании бота вы не опубликуете, меня вот интересует как там со звонками 1:1, функционал тоже доступен как limited preview for developer accounts only, но с какой стороны подойти пока не знаю.
zBit
13.04.2016 11:33+3Ох, я как-то около года назад, писал бота для скайпа, for fun.
Расковырял всё что смог в web версии скайпа. С авторизацией только по логину и паролю разобрался.
Принцип работы бота — выполнять команды. Не помню что я уже там реализовал, но точно помню, ping работал :)
Работал так:
me: /ping
bot: pong
И, кажется, ещё умел работать с задачами в jira.
Могу выложить исходники когда дома буду, если кому-нибудь интересно :)
Бот «расширяемый» :)
Там, кстати, нюанс один был при работе с чатами. Оказывается в скайпе можно создать чат с флагом p2p и его нельзя будет увидеть в веб версии. Не знаю можно ли сейчас так делать.inDeepCode
13.04.2016 12:12Выложите)
zBit
13.04.2016 14:47+2Вообще, очень не плохо было бы, если бы MS опубликовали документацию по Skype Web API. Многие разработчики сказали бы спасибо :)
beduin01
13.04.2016 23:33Господи, Skype по-моему все нормальные люди используют лишь чтобы разово созвониться голосом. Во все остальное время пользование им вызывает отврещение, а вы тут про каких-то еще ботов. Тут даже контакты хрен поймешь как ищутся\удаляются.
and7ey
13.04.2016 23:35Наверное, даже для того, чтобы созвониться не просто голосом, а еще и с видео. Согласен, мне тоже кажется, что скайп умирает. Хотя, возможно, в корпоративном сегменте он распространен (Lync/Skype for Business?).
Gonchar_POTT
14.04.2016 22:21Skype будет умирать еще долго. Я — как типичный представитель малого бизнеса — бы с удовольствием заимел у себя на сайте Skype-бота вместо или в дополнение к jivosite. Чтобы избавиться от рутинных объяснений «не продаем физ. лицам», «цена сегодня такая-то». Именно Skype-bot, т. к. Skype — привычен и удобен большинству моих клиентов.
Приглашаю к сотрудничеству.and7ey
14.04.2016 22:23А почему именно Skype? Ведь с Telegram можно то же самое организовать. На хабре где-то была статья.
Часть по «именно skype-bot» непонятна. Ведь на сайте пользователь не интерфейс скайпа видит.Gonchar_POTT
15.04.2016 08:22В любом случае для общения с ботом нужен клиент (и аккаунт) со стороны пользователя. Число пользователей Скайпа в разы больше, чем Telegram. По крайней мере, среди моих клиентов.
Начинать в любом случае буду со Скайпа.
Diden05
Спасибо, три дня бьюсь с авторизацией, пойду попробую по вашему методу.
PS: Очень странно что нет refresh_token, что делать когда access_token сдохнет, таким же образом запрашивать второй раз?
and7ey
Да, запрашивать второй раз. Тоже был удивлён отсутствием refresh_token.