Некоторое время назад я рассказывал о своем боте для 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.

Полезные ссылки


Для начала небольшой набор полезных ссылок (все ссылки — на английском языке):

В принципе, из документации понятно как работает бот и как он взаимодействует со 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 довольно просто.
Боты для Skype

Проголосовало 474 человека. Воздержалось 137 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Комментарии (26)


  1. Diden05
    13.04.2016 10:22
    +2

    Спасибо, три дня бьюсь с авторизацией, пойду попробую по вашему методу.
    PS: Очень странно что нет refresh_token, что делать когда access_token сдохнет, таким же образом запрашивать второй раз?


    1. and7ey
      13.04.2016 10:40
      +2

      Да, запрашивать второй раз. Тоже был удивлён отсутствием refresh_token.


  1. khaale
    13.04.2016 10:27

    Как долго пришлось ждать разрешения после sign up'а в Skype Bot Developer Preview?


    1. and7ey
      13.04.2016 10:40

      Разрешения на что? На публикацию бота разрешение пока так и не получил.


      1. khaale
        13.04.2016 10:49

        У меня после клика на https://developer.microsoft.com/en-us/skype/bots появляется регистрационная форма, после ее заполнения обещают прислать дальнейшие инструкции на email. Жду ответа со вчерашнего вечера :)


        1. and7ey
          13.04.2016 11:04

          Этот процесс у меня занял довольно много времени. Может, неделю. Но в моем случае, наверное, Skype API ещё не было открыто для всех разработчиков, потому пришлось ждать сначала открытия, а потом уже согласования.


        1. moigagoo
          13.04.2016 11:06

          Я ждал 3-4 дня.


        1. khaale
          13.04.2016 11:17

          Спасибо за информацию!


  1. khaale
    13.04.2016 10:48

    del


  1. prefrontalCortex
    13.04.2016 10:48

    curl -X POST -H "Cache-Control: no-cache" -H "Content-Type: application/x-www-form-urlencoded"
    Curl же по умолчанию шлёт POST-запросы в application/x-www-form-urlencoded.


  1. disem
    13.04.2016 11:25

    А не запаблишеный бот сейчас может писать/читать в групповых чатах?


    1. and7ey
      13.04.2016 11:30

      Я тестировать это не стал в итоге, так что не знаю. Но судя по документации — может. Попробуйте и поделитесь с нами информацией ;).


      1. disem
        13.04.2016 11:36

        Я через бот платформу интегрировался, своего бота к себе не могу добавить на андроиде (его просто нет в контактах, чужие появляются), для мак клиента боты еще не доступны. Так что пока не ясно когда я туда доберусь :)


    1. Diden05
      13.04.2016 11:33
      +1

      Может, но это функционал доступный как limited preview for developer accounts only, а при его использовании бота вы не опубликуете, меня вот интересует как там со звонками 1:1, функционал тоже доступен как limited preview for developer accounts only, но с какой стороны подойти пока не знаю.


  1. zBit
    13.04.2016 11:33
    +3

    Ох, я как-то около года назад, писал бота для скайпа, for fun.
    Расковырял всё что смог в web версии скайпа. С авторизацией только по логину и паролю разобрался.
    Принцип работы бота — выполнять команды. Не помню что я уже там реализовал, но точно помню, ping работал :)
    Работал так:
    me: /ping
    bot: pong

    И, кажется, ещё умел работать с задачами в jira.
    Могу выложить исходники когда дома буду, если кому-нибудь интересно :)
    Бот «расширяемый» :)

    Там, кстати, нюанс один был при работе с чатами. Оказывается в скайпе можно создать чат с флагом p2p и его нельзя будет увидеть в веб версии. Не знаю можно ли сейчас так делать.


    1. inDeepCode
      13.04.2016 12:12

      Выложите)


      1. zBit
        13.04.2016 14:38
        +6

        вот
        https://bitbucket.org/zbitname/skypebot


    1. seerozha
      13.04.2016 13:33

      Выложите, пожалуйста.


  1. zBit
    13.04.2016 14:47
    +2

    Вообще, очень не плохо было бы, если бы MS опубликовали документацию по Skype Web API. Многие разработчики сказали бы спасибо :)


  1. artishok
    13.04.2016 17:10
    +1

    Создание бота для телеграмма и проверка с помощью пинг-понга заняло минут 20-30.
    А тут ждать только одобрения несколько дней, жесть…


    1. and7ey
      13.04.2016 23:30

      Судя по всему, ботов типа флибусты и рутрекера в Skype не будет…


  1. beduin01
    13.04.2016 23:33

    Господи, Skype по-моему все нормальные люди используют лишь чтобы разово созвониться голосом. Во все остальное время пользование им вызывает отврещение, а вы тут про каких-то еще ботов. Тут даже контакты хрен поймешь как ищутся\удаляются.


    1. and7ey
      13.04.2016 23:35

      Наверное, даже для того, чтобы созвониться не просто голосом, а еще и с видео. Согласен, мне тоже кажется, что скайп умирает. Хотя, возможно, в корпоративном сегменте он распространен (Lync/Skype for Business?).


      1. Gonchar_POTT
        14.04.2016 22:21

        Skype будет умирать еще долго. Я — как типичный представитель малого бизнеса — бы с удовольствием заимел у себя на сайте Skype-бота вместо или в дополнение к jivosite. Чтобы избавиться от рутинных объяснений «не продаем физ. лицам», «цена сегодня такая-то». Именно Skype-bot, т. к. Skype — привычен и удобен большинству моих клиентов.
        Приглашаю к сотрудничеству.


        1. and7ey
          14.04.2016 22:23

          А почему именно Skype? Ведь с Telegram можно то же самое организовать. На хабре где-то была статья.
          Часть по «именно skype-bot» непонятна. Ведь на сайте пользователь не интерфейс скайпа видит.


          1. Gonchar_POTT
            15.04.2016 08:22

            В любом случае для общения с ботом нужен клиент (и аккаунт) со стороны пользователя. Число пользователей Скайпа в разы больше, чем Telegram. По крайней мере, среди моих клиентов.
            Начинать в любом случае буду со Скайпа.