Как создать своего бота для Skype. Что не написано в документации



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

    Поделиться публикацией

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 31

      +2
      Спасибо, три дня бьюсь с авторизацией, пойду попробую по вашему методу.
      PS: Очень странно что нет refresh_token, что делать когда access_token сдохнет, таким же образом запрашивать второй раз?
        +2
        Да, запрашивать второй раз. Тоже был удивлён отсутствием refresh_token.
        0
        Как долго пришлось ждать разрешения после sign up'а в Skype Bot Developer Preview?
          0
          Разрешения на что? На публикацию бота разрешение пока так и не получил.
            0
            У меня после клика на https://developer.microsoft.com/en-us/skype/bots появляется регистрационная форма, после ее заполнения обещают прислать дальнейшие инструкции на email. Жду ответа со вчерашнего вечера :)
              0
              Этот процесс у меня занял довольно много времени. Может, неделю. Но в моем случае, наверное, Skype API ещё не было открыто для всех разработчиков, потому пришлось ждать сначала открытия, а потом уже согласования.
                0
                Я ждал 3-4 дня.
                  0
                  Спасибо за информацию!
              0
              del
                0
                curl -X POST -H "Cache-Control: no-cache" -H "Content-Type: application/x-www-form-urlencoded"
                Curl же по умолчанию шлёт POST-запросы в application/x-www-form-urlencoded.
                  0
                  А не запаблишеный бот сейчас может писать/читать в групповых чатах?
                    0
                    Я тестировать это не стал в итоге, так что не знаю. Но судя по документации — может. Попробуйте и поделитесь с нами информацией ;).
                      0
                      Я через бот платформу интегрировался, своего бота к себе не могу добавить на андроиде (его просто нет в контактах, чужие появляются), для мак клиента боты еще не доступны. Так что пока не ясно когда я туда доберусь :)
                      +1
                      Может, но это функционал доступный как limited preview for developer accounts only, а при его использовании бота вы не опубликуете, меня вот интересует как там со звонками 1:1, функционал тоже доступен как limited preview for developer accounts only, но с какой стороны подойти пока не знаю.
                        0
                        Может, но его надо в чат добавить. И похоже что контакты, которые не добавили себе лично в контакты бота, его сообщений не видят.
                        +3
                        Ох, я как-то около года назад, писал бота для скайпа, for fun.
                        Расковырял всё что смог в web версии скайпа. С авторизацией только по логину и паролю разобрался.
                        Принцип работы бота — выполнять команды. Не помню что я уже там реализовал, но точно помню, ping работал :)
                        Работал так:
                        me: /ping
                        bot: pong

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

                        Там, кстати, нюанс один был при работе с чатами. Оказывается в скайпе можно создать чат с флагом p2p и его нельзя будет увидеть в веб версии. Не знаю можно ли сейчас так делать.
                          0
                          Выложите)
                            +6
                            вот
                            https://bitbucket.org/zbitname/skypebot
                            0
                            Выложите, пожалуйста.
                            +2
                            Вообще, очень не плохо было бы, если бы MS опубликовали документацию по Skype Web API. Многие разработчики сказали бы спасибо :)
                              +1
                              Создание бота для телеграмма и проверка с помощью пинг-понга заняло минут 20-30.
                              А тут ждать только одобрения несколько дней, жесть…
                                0
                                Судя по всему, ботов типа флибусты и рутрекера в Skype не будет…
                                0
                                Господи, Skype по-моему все нормальные люди используют лишь чтобы разово созвониться голосом. Во все остальное время пользование им вызывает отврещение, а вы тут про каких-то еще ботов. Тут даже контакты хрен поймешь как ищутся\удаляются.
                                  0
                                  Наверное, даже для того, чтобы созвониться не просто голосом, а еще и с видео. Согласен, мне тоже кажется, что скайп умирает. Хотя, возможно, в корпоративном сегменте он распространен (Lync/Skype for Business?).
                                    0
                                    Skype будет умирать еще долго. Я — как типичный представитель малого бизнеса — бы с удовольствием заимел у себя на сайте Skype-бота вместо или в дополнение к jivosite. Чтобы избавиться от рутинных объяснений «не продаем физ. лицам», «цена сегодня такая-то». Именно Skype-bot, т. к. Skype — привычен и удобен большинству моих клиентов.
                                    Приглашаю к сотрудничеству.
                                      0
                                      А почему именно Skype? Ведь с Telegram можно то же самое организовать. На хабре где-то была статья.
                                      Часть по «именно skype-bot» непонятна. Ведь на сайте пользователь не интерфейс скайпа видит.
                                        0
                                        В любом случае для общения с ботом нужен клиент (и аккаунт) со стороны пользователя. Число пользователей Скайпа в разы больше, чем Telegram. По крайней мере, среди моих клиентов.
                                        Начинать в любом случае буду со Скайпа.
                                  0
                                  Жаль что бот не умеет читать все сообщения в группе. С такой функцией легко настроить транспорт в другие системы, например Telegram.
                                    0
                                    А нельзя ли делать бота по poll-модели? Как-то не очень хочется делать callback url, который должен быть виден всем в интернете. В телеграме в этом смысле хорошо — можно веб хуком делать, а можно и просто делать запросы по таймеру на наличие новых сообщений.
                                      0
                                      Почему callback url виден всем в интернете?
                                      +1
                                      Спасибо за статью! Внесу свои 5 копеек по API v3, не причесанный код, только что заработал, оставляю для истории, чтобы последователям не сидеть 2 дня над этой задачей. Естественно, и первый запрос можно cUrl'ом отправлять, код экспперементальный, не пинайте сильно.

                                      <?php
                                      
                                      // Получаем токен, он живет 3600 сек, можно кешировать
                                      /*
                                        "token_type": "Bearer",
                                        "expires_in": 3599,
                                        "ext_expires_in": 0,
                                        "access_token": "eyJ0eXAiOi..."
                                      */
                                      $url='https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token';
                                      $params=array
                                          (
                                          'client_id' => 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx', //your-app-id
                                          'client_secret' => 'xxxxxxxxxxxxxxxxx',          // your-app-secret
                                          'grant_type'=>'client_credentials',                     //client_credentials&
                                          'scope'=>'https://api.botframework.com/.default'
                                          );
                                      $result=file_get_contents($url, false, stream_context_create(array('http' => array
                                          (
                                          'method' => 'POST',
                                          'header' => 'Content-type: application/x-www-form-urlencoded',
                                          'content' => http_build_query($params)
                                          ))));
                                      
                                      $token = json_decode($result, TRUE);
                                      
                                      // Соответствия входящему массиву из вызова
                                      // $IN['CHANNEL_NAME']
                                      // $IN['CHANNEL']  = ['conversation']['id']
                                      // $IN['URL'] = ['serviceUrl']
                                      // $IN['TO'] = ['recipient']['id']
                                      // $IN['FROM_ID'] = ['from']['id']
                                      
                                      $url =$IN['URL'].'/v3/conversations/'.$IN['CHANNEL'].'/activities/';
                                      $data_string = '
                                      {
                                        "type": "message",
                                        "from": {
                                          "id": "'.$IN['TO'].'",
                                          "name": "Echo Bot"
                                        },
                                        "conversation": {
                                          "id": "'.$IN['CHANNEL'].'"
                                        },
                                        "recipient": {
                                          "id": "'.$IN['CHANNEL'].'",
                                          "name": "User Name"
                                        },
                                        "text": "'.$OUT['MSG'].'",
                                        "replyToId": "'.$IN['FROM_ID'].'"
                                      }
                                      ';
                                      
                                      $ch = curl_init($url);                                                                      
                                      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
                                      curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
                                      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
                                      curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
                                          'Content-Type: application/json',
                                      	'Authorization: Bearer '.$token['access_token'].'',
                                          'Content-Length: ' . strlen($data_string))                                                                       
                                      );        
                                      
                                      $result = curl_exec($ch); // должен вернуть {"id":"0:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
                                      

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

                                      Самое читаемое