Пользователь
0,0
рейтинг
17 июля 2011 в 17:03

Разработка → SkypeKit и с чем его едят

SkypeKit — это проприетарный SDK для Skype. В принципе единственное на сегодня средство создания альтернативных Skype клиентов. Продукт интересен, но имеет достаточное количество проблем, которые могут вызвать разочарование у воодушевленного разработчика.

О том, что Skype открыл свой SDK уже писали на хабре. Поэтому топик будет непосредственно о практическом смысле применения SkypeKit и о его подводных камнях.

1. Регистрация

Я зарегистрировался еще когда SkypeKit находился в бете, а получить сие можно было только по инвайту и когда бесплатно не давали ключей для распространения в принципе.
Однако сейчас может вступить любой желающий, достаточно зайти на developer.skype.com, заполнить несложную форму и отдать кровных $10 (списывается со счета в Skype).
Большой совет: внимательно читайте лицензионные соглашения, они достаточно суровы. О лицензиях позже будет отдельный разговор. Обобщить это можно так: «Скайп попытался встать навстречу разработчикам, но так и не смог расстаться с проприетарщиной головного мозга». В относительной юридической безопасности только разработчики железяк.
Потом у вас будет возможность приглашать других пользователей в вашу организацию, но все равно с каждого попросят по 10 баксов, хотя на самом деле их можно не платить, просто давайте новым пользователям все необходимое для разработки барахло, залогиниться то они смогут (информация давно не обновлялась, могу ошибаться). Больше 100 человек в организации быть не может.

2. Получение SDK и Runtime

Интересное начинается с этого момента. Заходя на developer.skype.com/skypekit/sdks вы обнаружите предложение скачать «SkypeKit Multi-OS SDK», но поводов для радости на самом деле мало. В этом пакете кроме заголовочных файлов для C++, Java и Python и нескольких примеров на этих языках вы не найдете почти ничего. Где обещанный скайп спросите вы? А вот фиг вам просто так дадут runtime, заплатите 10 баксов и только после этого внизу страницы появится «Request a runtime». Список доступных платформ достаточно обширен: Windows, Linux, Mac с кодом в x86, ARM (v5, v6, v7) и MIPS (как little, так и big-endian). Но вы будете удивлены: видеозвонки поддерживаются только версией для Linux (причем на всех типах CPU). Ауу, Microsoft, куда ты смотришь?
ВНИМАНИЕ! Каждый рантайм собирается специально для вас и содержит вшитый идентификатор, который позволяет вас взять в анальное рабство вычислить. Полученный рантайм отождествлен с вашей зарегистрированной организацией. И во время разработки возможно залогинивание только тех аккаунтов, которые состоят в вашей организации.

3. Получение ключа

Для начала нужно зарегистрировать приложение на developer.skype.com/applications. Но тут есть забавные моменты:
  • Для одной организации можно создать до 50 приложений, удалять старые нельзя
  • Для возможности распространения большинства приложений требуется пройти сертификационный тест, который стоит $4000 и в случае неудачи, следующий тест будет стоить столько же
  • Но из предыдущего правила есть 3 исключения: обычные программы для Windows и Mac (без Linux), мобильные приложения и веб приложения. В этом случае «Distribution keypair» можно получить без прохождения тестов и траты денег, но придется принять весьма странное лицензионное соглашение
  • «Development keypair» доступен для всех приложений, но он действует только 60 дней. Причем при добавлении новых пользователей в организацию они не смогут пользоваться ранее полученным ключом
  • Чтобы можно было получить потом нормальный ключ, просто указывайте: только x86, только Windows и Standard Win/Mac application (последнее потом поменять будет нельзя)
4. Распаковываем полученное добро
И так мы имеем SDK, Runtime и Development keypair. Распаковываем в удобное место SDK, рантайм кладем в нужно место в %SDK%/bin, для ключа тоже придумываем место.
Наверняка вам захочется запустить примеры, но тут не так все просто. Для начала они должны знать, где лежит ключ. Для этого редактируем keypair.h, token.py и AppKeyPairMgr.java и вписываем нужный путь. Я очень не советую с душой вчитываться в какой-либо код — там страшнейший быдлокод! (позже я приведу пару примеров)
Если вы взяли рантайм с поддержкой VoicePCM/VoiceRTP или VideoRTP, тогда вам придется еще собрать заглушки для RTP/PCM (они есть в комплекте), а потом положить сборки в одну директорию с рантаймом. Для голоса в режиме SAL (Skype audio library) и без видео ничего собирать не нужно. Для запуска рантайма предназначен скрипт startskypekit.py, его можно немного подредактировать и получить удобный инструмент запуска рантайма вместе с обработчиками голоса и видео (без них рантайм тупо падает).
Теперь можно собрать примеры (в случае Python просто запустить, прежде запустив рантайм). В VisualStudio примеры собираются без каких-либо проблем. Можете поразвлекаться.

5. Особенности SDK

Есть некоторые особенности:
  • Нельзя запускать несколько рантаймов на одной машине
  • Для связи с рантаймом SDK использует сокеты
  • Можно использовать несколько аккаунтов через один рантайм
  • Код на питоне написан как-будто его писал индус, знающий только C++
  • Код SDK совместим только с рантаймами той же самой версии
Вы можете сами поизучать SDK, скачать можно и у меня: goo.gl/3egQi (благо там нет рантайма или чего-то еще персонализированного).

6. Примеры быдлокода

        if(input_started)
        {

          unsigned int samples_returned = output_buf.size() /( 2 * numOfOutputChannels );
          

          if(input_buf[(input_p % INPUT_BUF_ARRAY_SIZE)].size() != samples_returned * 2)
        input_buf[(input_p % INPUT_BUF_ARRAY_SIZE)].resize(samples_returned * 2);
    
          if(input_muted)
          {
        memset((char*)input_buf[(input_p % INPUT_BUF_ARRAY_SIZE)].data(), 0, input_buf[(input_p % INPUT_BUF_ARRAY_SIZE)].size());
          }
          else if(numOfOutputChannels > 1)
          {
        short* ob = (short*) output_buf.data();
        short* ib = (short*) input_buf[(input_p % INPUT_BUF_ARRAY_SIZE)].data();
        for(unsigned int i = 0 ; i < samples_returned; i ++)
        {
          ib[i] = ob[i * numOfOutputChannels];
        }
            
          }
          else
          {
        input_buf[(input_p % INPUT_BUF_ARRAY_SIZE)] = output_buf;
          }

          int input_samples_returned = input_buf[(input_p + 1) % INPUT_BUF_ARRAY_SIZE].size() / 2;
          m_transport->InputDeviceReady(input_samples_returned,input_sampleRate,1, input_buf[(input_p + 1) % INPUT_BUF_ARRAY_SIZE]);
        }
      }

Да, тут перенеслось несколько длинных строк, но это не сильно испортило код. Я не знаю что надо отрывать за одновременное использование табов и пробелов в отступах.
А это вообще пример «с любовью из Индии»
switch (propid) {
                case 4: return &skylibFields[689];
                case 5: return &skylibFields[690];
                case 7: return &skylibFields[691];
                case 8: return &skylibFields[692];
                case 9: return &skylibFields[693];
                case 10: return &skylibFields[694];
                case 11: return &skylibFields[695];
                case 12: return &skylibFields[696];
                case 13: return &skylibFields[697];
                case 14: return &skylibFields[698];
                case 15: return &skylibFields[699];
                case 16: return &skylibFields[700];
                case 17: return &skylibFields[701];
                case 18: return &skylibFields[702];
                case 19: return &skylibFields[703];
                case 26: return &skylibFields[704];
                case 27: return &skylibFields[705];
                case 28: return &skylibFields[706];
                case 34: return &skylibFields[707];
                case 37: return &skylibFields[708];
                case 70: return &skylibFields[709];
                case 71: return &skylibFields[710];
                case 72: return &skylibFields[711];
                case 73: return &skylibFields[712];
                case 74: return &skylibFields[713];
                case 75: return &skylibFields[714];
                case 76: return &skylibFields[715];
                case 77: return &skylibFields[716];
                case 78: return &skylibFields[717];
                case 79: return &skylibFields[718];
                case 160: return &skylibFields[719];
                case 161: return &skylibFields[720];
                case 162: return &skylibFields[721];
                case 163: return &skylibFields[722];
                case 164: return &skylibFields[723];
                case 165: return &skylibFields[724];
                case 166: return &skylibFields[725];
                case 168: return &skylibFields[726];
                case 169: return &skylibFields[727];
                case 182: return &skylibFields[728];
                case 183: return &skylibFields[729];
                case 205: return &skylibFields[730];
                case 773: return &skylibFields[731];
                case 800: return &skylibFields[732];
                case 801: return &skylibFields[733];
                case 802: return &skylibFields[734];
                case 804: return &skylibFields[735];
                default: break;
                }

Ну еще можно сказать, что не надо в питоне после окончания строки ставить точку с запятой. Причем то строчка, то строчка сяк. Я не знаю, есть-ли вообще у них какие-либо Code Style Conventions.

7. Лицензионные соглашения

Именно таким текстом вас поприветствует рантайм:
SkypeRuntime Copyright (C) 2003-2011 Skype Technologies S.A.
SkypeRuntime Version: 3.4.1/windows-x86-skypekit-novideo_3.4.1.339_%боюсь_палить%
Proprietary and confidential, do not share this application.

А по сути: соглашение раз и соглашение два
Особо порадовала цитата:
4.3. Without limiting the generality of the foregoing, you are expressly prohibited from:
4.3.1. running one or more copies of the SkypeKit Software on physical or virtual servers in order to make a SkypeKit Product available to End Users;
4.3.2. licensing, selling, marketing distributing or otherwise making available:
4.3.2.1. any Hardware Product directly (or indirectly through value added resellers or other channels) to small, medium or large businesses or enterprises;
4.3.2.2. any Prohibited Development as defined in Section 4 of the License Agreement.

То есть они говорят, что нельзя продавать железки юридическим лицам, даже если это торговые сети. Ну господа, извините, но это какое-то невыполнимое условие. Интересно, как тогда Samsung встроил скайп в свои телевизоры?

8. В итоге

Приведу маленький пример кода на питоне:
import sys, time, SkyLib

accountName = sys.argv[1]
accountPsw  = sys.argv[2]
keyFileName = sys.argv[3]

def AccountOnChange (self, property_name):
    if property_name == 'status':
        if self.status == 'LOGGED_IN':
            print 'Login complete.'
SkyLib.Account.OnPropertyChange = AccountOnChange

def OnMessage(self, message, changesInboxTimestamp, supersedesHistoryMessage, conversation):
    if message.author != accountName:
        print(message.author_displayname + ': ' + message.body_xml)
        conversation.PostText('Automated reply.', False)
SkyLib.SkyLib.OnMessage = OnMessage

skype = SkyLib.GetSkyLib(keyFileName)
account = skype.GetAccount(accountName)
print 'Logging in with ' + accountName
account.LoginWithPassword(accountPsw, False, False)

while account.status != 'LOGGED_IN':
    time.sleep(1)

print 'Now accepting incoming chat messages.'
print 'Press ENTER to quit.'
raw_input('')
skype.stop()

Несмотря на простоту эта программа принимает сообщения в скайпе и автоматически на них отвечает. Хотя метод возбуждения событий сильно попахивает C++, где для этих целей наследуется класс. Но в питоне это выглядит несколько грубо. Но можно легко написать класс — обработчик событий и писать более красиво. Но это уже на вкус программиста.
В принципе SkypeKit получился достаточно интересным продуктом, но стоило бы пересмотреть лицензионную политику и убрать быдлокод из SDK. Лично мне совершенно без разницы, какой код был при написании скайпа (он откомпилен и все), но смотреть на код в SDK мне, честное слово, противно. Ну могли бы нанять толковых программистов для написания бэкенда к рантайму, ведь не такой уж большой объем кода. В целом API нормально документирован и после некоторого ковыряния приходит понимание, как все это работает. Продукт сырой, хотя ему уже не первый год.
В мои планы входит написание транспорта Skype <-> XMPP, так что буду вкуривать в устройство libjingle. чтобы можно было и звонить. Но я не уверен, что после написания я смогу его распространять в таких лицензионных условиях.

Удачи! Делайте свои скайпы с блэкджеками и чем хотите.
Вам решать, нужно оно вам или нет. Но по моему мнению не стоит жалеть 10 долларов хотя бы ради интереса. Но и строить грандиозные планы тоже очень сложно.
Григорий Крайнов @acmer
карма
88,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

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

Самое читаемое Разработка

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

  • НЛО прилетело и опубликовало эту надпись здесь
    • +2
      А Code style conventions тоже дураки придумавали? Если код относительно сложен, то зачем его дополнительно уродовать отсутствием стиля?
      Хорошо, без оптимизации компилятором, что быстрее отработает: приведенный в примере switch или один if с одним сложением?
      • НЛО прилетело и опубликовало эту надпись здесь
        • +8
          1) Не ставил я вам минус
          2) Комментарий попахивает кармодрочерством
          • +6
            Не попахивает, а разит.
        • +10
          Батхерт быдлокодера
          • НЛО прилетело и опубликовало эту надпись здесь
      • +4
        Не хочу показаться занудой, но в приведенном в примере коде потребовалось бы 11 if'ов. Но, что этот один switch, что получившиеся десяток if'ов будут одинаково трудночитаемы и тудносопровождаемы.
        • 0
          Сорри, да не заметил, что числа в case все таки группами. Но таких мест в коде очень много. Как этот код дебажили — не представляю.
          • 0
            «Читаемость» и отсутствие codestyle. Если все примеры и сам SDK написан так, то стоит только пожалеть тех, кто будет его использовать.
        • +1
          А вот и нифига. Можно было просто по-другому организовать данные (мультимеп, несколько массивов, разреженный масив) — и никаках 11 ифов или огромного свича.
          • +3
            Никто и не спорит. Тот же map был бы на порядок читаемее. 11 ифов — исключительно занудство на предыдущий комментарий.
    • +1
      Попробуйте посопровождать вот этот switch и у вас сразу отпадут вопросы по поводу критериев говнокогда.
      • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    а нужно чтоб был скайп запущен, или нет?
    • +2
      Не нужно. В рантайме встроен скайп без GUI
      • +2
        любопытно что так жрет память, «скайп без GUI» или собственно гуй?
        Больше 100МБ меня как-то не очень радует…
        • +2
          В состоянии покоя занимает 11 метров в ОП. Сам файл рантайма без видео весит 3 метра.
  • +1
    Я правильно понимаю, что чтобы сделать клиент для скайпа под, скажем, андроид придется заиметь версии под все поколения армов и как-то их вкомпиливать в приложение?
    • 0
      Зачем? Версия для Linux ARM v5 поддерживает все функции и совместима с более поздними армами. В случае андроида, рантайм будет отдельным исполняемым файлом. А запустить можно прямо из джавы. Для связи с рантаймом используются сокеты, поэтому SDK на Java по идее должен работать и на андроиде.
      • +1
        Во это «по идее» мне и не нравится))
        • 0
          Я не программирую на джаве, поэтому «по идее». Проверьте ((=
          • 0
            Самое смешное, что придется) Заказ есть заказ)
  • +3
    Убиться об стену…
  • +1
    Если напишете транспорт в SIP и обратно, чтобы и текст и видео, то цены вас не будет.
    • +2
      Цена будет, и, думаю, немаленькая.
  • 0
    >Полученный рантайм отождествлен с вашей зарегистрированной организацией. И во время разработки возможно залогинивание только тех аккаунтов, которые состоят в вашей организации.

    Так что об альтернативных клиентах, работающих без запуска официального, пока можно забыть.
    • +2
      После получения Distribution keypair возможно залогинивание любых клиентов. Написано «во время разработки», то есть с Development keypair.
  • +3
    Из рассказа о лицензиях так и не стало понятно насколько будет законно создание альтернативных клиентов\транспортов.
    • 0
      И на каких условиях их можно будет распространять…
    • +1
      В тексте поста было:
      You are expressly prohibited from running one or more copies of the SkypeKit Software on physical or virtual servers in order to make a SkypeKit Product available to End Users.
      Тут получается такая хитрость: есть SkypeKit Product и SkypeKit Software, причем применяется и то и другое произвольно. То есть по идее Software — это наша программа, a Product — собственность скайпа. Но если им это не понравится, то они могут легко интерпретировать соглашение в свою пользу.
  • –2
    месело в коментах развели, сделали из нормального поста «Быдло пост»
    Человек хотел поделиться новостью, и зажечь людей идеями а мы его так жестко встретили
    • 0
      Кто его жестоко встретил-то? Нормальное обсуждение, имхо.
      По теме: пока неудобоваримо, лицензионная политика отбивает желание изучать.
  • +1
    В общем, не будет у нас альтернативных клиентов
    • 0
      Они могут быть. Только неизвестно как отреагируют владельцы скайпа на это, потому что лицензия составлена очень хитро. Если спокойно, то хорошо.
      • 0
        найдуться умельцы и В****бут ( возведут) Skype — sip клиент
    • 0
      Да ладно? И из-под Pidgin-а можно сидеть вообще-то, и через imo.im/. Думаю, на этом не заканчивается.
      • 0
        При запущенном скайпе — или что-то изменилось?
        • +1
          Да ничего не изменялось. Через Pidgin сидит знакомый, могу порасспрашивать при необходимости, а лично я через IMO последний год где-то сижу. Правда, исходящие видеозвонки идет через их ссылку, а входящие — через тот же флэш-плеер, но и со скайпа обычного тоже.
          • 0
            Пока читал топик — первая мысль: «наконец-то кто-то сделает плагин для пиджина, который можно будет юзать без установки скайпа». Видео не использую, мне бы чаты да звук иногда ( и то не мне, а заказчику).
            • 0
              Ну со звуком все в точности так же как описал (по крайней мере на IMO). Но я в основном чат только использую (в т.ч. групповые). Насчет Pidgin — знакомый сейчас не онлайн, если не найдете в гугле — спрошу.
  • +1
    Тоже хотел сделать skype <-> xmpp или хотя бы просто плагины для пиджина с поддержкой, но почитал условия лицензии, увидел предложение заплатить за то, что хочу сделать их работу… И вот как-то передумалось.
    • 0
      То есть платить нужно чисто за право разработки, а распространять можно без допоплаты попользовательско? Тогда есть хоть и малая надежда на появление плагина пиджина…
      • 0
        Не знаю. У меня доступ ещё с беты и до сих пор не разобрался, каковы же условия на самом деле. То читаешь и выходит, что нужно платить за количество пользователей даже некоммерческим продуктам. То вроде всё чисто. В особо просветлённые моменты выходит, что некоммерческая разработка под Linux вообще запрещена условиями. Так в итоге ничего не понял и забросил.
        Т.е. _может быть_ сделать без риска получить предъявы от Skype можно. Но поставлено всё таким образом, что желание сделать исчезает, а появляется желание закопать.
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        За финансы я работаю на работе :) А в свободное время я — опенсорсный фанатик, пишу код за идею. И вот идея у Skype ну донельзя тухловатая.
        Впрочем, вы можете просто заказать оный у фрилансеров, задача-то довольно тривиальная.
        • НЛО прилетело и опубликовало эту надпись здесь
  • +4
    Хочется верить, что Microsoft попробует привести это в порядок.
  • +5
    Я тоже подписался на эту программу. Моим главным разочарованием был список запрещённых использований. Вот некоторые из них:

    4.1.1.c Веб плагины. То есть сделать что-то вроде хэнгаута не удасться.
    4.1.1.d Сервера. Нельзя запускать ни на сервере, ни в облаке.
    4.1.1.e Корпоративные приложения. Да, в общем, фиг с ним. Я – любитель-самоучка.
    4.1.1.f Мобильные телефоны. Любое устройство с возможностью сотовой связи. Суки.
    4.1.1.g Таблетки. Переведу слово в слово: [запрещено] любое устройство, которое способно функцианировать как мобильный персональный компьютер, обладает тачскрином и управляющееся с тачскрина, а не с физической клавиатуры, и работает под операционными системами Android или iOS. Суки2.

    В общем, почти все мои идеи про то, где бы я хотел видеть скайп пришлось отложить до лучших времён. Ну, то есть пользоваться SIP клиентами и дешевыми VoIP провайдерами.
    • +1
      Ну ладно телефоны, ну ладно сервера, ну ладно корпоративные приложения, но за что веб-плагины? А за что дешевые китайские Android-таблетки? За что Archos?

      Простите, не удержался.
    • 0
      Они похоже уже саму запутались с тем что можно, а чего нельзя.
      Дело в том разрешено делать мобильные приложения, обычные приложения для ПК и веб приложения БЕЗ сертификации. Это автоматически подразумевает легальность юзания на серверах и на мобилах. Можно цитату? Мне самому интересно, но я не удивлен, что они уже в маразм стали впадать при написании лицензии.
      • 0
        Да собственно пункт 4.1.1: You are expressly prohibited from using and shall not use the SkypeKit to develop any of the following. Ну а дальше то, что я в комменте написал.

        Например, пункт g: Tablets: meaning any device that primarily functions as an all purpose personal mobile computer, has an integrated touch screen, operates by touching the screen rather than a physical keyboard and runs on the Android or iOS operating system.

        Короче, либо я чего-то не понимаю, либо в комплект SkypeKit надо влючать шоры.
        • 0
          Я не смог больше ничего цезурного придумать…
          Это трандец, а не лицензия!
          • +7
            При использовании SkypeKit вы обязаны:

            g. Не использовать SkypeKit.
    • 0
      То есть на своём моноблоке за полторы штуки баксов с ультимативной виндой я использовать вашу разработку не смог бы? Тачскрин есть, винда на три кнопки просит чё-то нажать, чего нет и от любого 12В аккумулятора работать может.
  • 0
    Чот я не понял, делать приложения для win/mac можно без лицензирования, а под linux — только с лицензированием?! оО
    • 0
      Зато с видео :(
    • 0
      Все правильно, SkypeKit они сделали для того что бы производители всяких STB и телевизоров встроили skype туда, а на этих устройствах в 99% случаев Linux. Именно по этому у них версии для Linux с Arm и Mips поддерживают практически все возможности Skype. Это очень большой рынок, на котором Skype пока нет. Я сам тружусь в этой сфере и здесь эта возможность очень активно обсуждается. Плюс ко всему имея Skype на телевизоре или STB и учитывая то, что у Skype один из лучших алгоритмов передачи видео и звука можно представить что в будущем мы сможем смотреть какие нибудь телевизионные каналы(скорее всего платные) через Skype.
    • 0
      Именно так!
  • 0
    Мне товарищи из Skype только через полгода прислали письмо что я могу получить этот SkypeKit, пока руки до него не дошли.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Коллеги, подскажите. Никак не могу найти информацию как, с помощью чего и на каком языке можно писать плагины для скайпа. Хочу маленький плагин, чтобы он в заранее запланированное время писал в указанный мне чат/группу нужные слова. Такого плагина не нашел также как и информации о том, как писать плагины. Если конечно это вообще возможно. Извините за оффтоп и надеюсь не напороться на минусы или ссылки на гугл «как написать плагин для скайпа». Спасибо

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