Recent changes

07/02/2020

The documentation has been restructured and (hopefully) improved for new and existing users alike. It’s now organised into prose Guides for basic tasks, Reference API documentation, and additional Background material.

31/08/2020

The previous Live login flow has been repaired, which will once again permit Skype-only accounts. However, SOAP authentication remains the default – if you need the Live login flow, use SkypeConnection.liveLogin() (see also Manual control).

20/08/2020

Skype made a change to their authentication flow that broke the method SkPy uses to login. At the same time, it was noted that an alternative flow exists (SOAP-based authentication) supporting two-factor authentication, though not supporting Skype usernames and passwords.

As of v0.10, SOAP authentication is used by default. You must provide a Microsoft account email address and password (or application-specific password if 2FA is enabled) in order to login; Skype-only accounts will not work with this flow.

27/05/2020

Skype stopped sending contact presence events by default. If you need them, you can call Skype.subscribePresence() before event polling starts to enable them again.

14/10/2019

Skype made a breaking change to one of their APIs. If you’re seeing this:

ConnectionError: HTTPSConnectionPool(host='flagsapi.skype.com', port=443)

…then update to v0.9.1 which disables flag collection (SkypeSettings.syncFlags()) by default.

11/07/2018

The latest release (v0.9) pushes out a number of miscellaneous bug fixes that have accrued over the last few months.

It also adds a BSD 3-clause license, which will hopefully satisfy any downstream licensing requirements.

09/11/2016

All instances of SkypeMsg now include a html attribute, which dynamically constructs the Skype-flavoured HTML for the message.

For received messages, this isn’t particularly useful as SkypeMsg.content already contains the original message body. However, you can now create an instance of a SkypeMsg subclass, then retrieve the content ready to send:

>>> SkypeLocationMsg(latitude=51.5074, longitude=-0.1277,
...                  address="5 Trafalgar Square, London",
...                  mapUrl="https://www.bing.com/mapspreview?cp=52.2448~-0.304923&lvl=8").html
<location address="5 Trafalgar Square, London" latitude="51507400" longitude="-127700" pointOfInterest="" timeStamp="1478731167"><a href="https://www.bing.com/mapspreview?cp=52.2448~-0.304923&amp;lvl=8">5 Trafalgar Square, London</a></location>

HTML is returned as a BeautifulSoup bs4.Tag instance, so you can still easily modify the output before passing it to SkypeChat.sendMsg().

14/10/2016

Microsoft account auth is now the default and only authentication method; msEmail and msPwd have been removed in favour of user and pwd.

13/10/2016

The Skype auth flow has now been superceded by the Microsoft account flow. SkypeConnection has been updated to always do a Live login – if you’re on 0.5 or lower, just pass your Skype username and password as msEmail and msPwd instead.

06/09/2016

You may now notice that Skype.setPresence() now works, rather than throwing 400 errors! There was a missing call to configure a new endpoint, which has now been added.

Note that this doesn’t work when reading from a token file due to not storing the endpoint identifier. As a workaround, get a new endpoint by calling SkypeConnection.getRegToken() first.

05/09/2016

Switched to the newer v2 APIs for contacts, in line with Skype for Web. This will soon provide access to groups and blocked contacts.

04/09/2016

Searching the Skype directory with SkypeContacts.search() now returns instances of SkypeUser instead of raw dictionaries.

Meanwhile, server response test cases have appeared – check the new docs page for client and server tests for more info.

27/07/2016

Microsoft account authentication has arrived! If you normally access your Skype account using your email address rather than a username, you can now pass msEmail and msPass arguments to the Skype constructor, or use SkypeConnection.setMicrosoftAcc().

21/05/2016

Enum classes have been replaced with instances of SkypeEnum, which removes the integer values (each item from the enum is itself an instance of SkypeEnum). Enums support item access both by attribute name and by index.

The docs here show them as tuples with attributes.

20/05/2016

User availability is now represented using the Status enum, which appears in Skype.setPresence().

23/03/2016

Added support for some differing features in the registration token endpoint. If you can’t sign in on v0.1, try this instead.

18/03/2016

Initial release! Installation options:

  • download from GitHub

  • download from PyPI

  • pip install SkPy

16/03/2016

Basic support for guest accounts has been added, see SkypeConnection.guestLogin(). This requires connecting manually as per yesterday’s change, for example:

>>> from skpy import Skype
>>> sk = Skype(connect=False)
>>> sk.conn.guestLogin("https://join.skype.com/...", "Foo")
>>> sk
Skype(userId='guest:foo_...', connected=True)

As part of this, SkypeChats.urlToId() has been upgraded to use Skype’s v2 conversation API, and has been renamed to SkypeChats.urlToIds() in light of the method now returning three identifiers (thread, long, and blob).

15/03/2016

Authentication is now no longer required during initialisation of the Skype class. Previously, an exception would be raised if neither a token nor a username/password were valid.

The default behaviour requires a connection, but by passing connect=False, the SkypeConnection instance at Skype.conn remains in a disconnected state.

27/02/2016

Renamed from SkyPy to SkPy, due to several existing projects with the same name. Imports need changing from SkyPy to skpy (note also the change to lowercase). This means the project can now be added to PyPI too (which will hopefully happen soon).

25/02/2016

SkypeChat.sendContact() now handles multiple contacts, so has been renamed to SkypeChat.sendContacts(). Similarly, SkypeContactMsg now provides a list of embedded contacts under its contacts attribute.

16/02/2016

SkypeMsg.clientId replaces editId, providing the client-generated identifier for a particular message. When transmitting an edit, the server’s event has a new identifier, but the client identifier remains the same – this produces a chain of messages with a matching client identifier, forming an edit history.

22/01/2016

The helper method exhaust() now returns an iterable, and no longer takes an init parameter. Instead, an optional transform can be specified.

20/01/2016

SkypeFileMsg and subclasses now carry a SkypeFileMsg.File object with the file name and URLs.

18/01/2016

SkypeChats has replaced most of the chat-related functions on the Skype class. Conversations can now be retrieved using Skype.chats with key lookups, similar to Skype.contacts.

16/01/2016

SkypeContacts has replaced most of the user-related functions on the Skype class. This still lives at Skype.contacts and provides key lookups, so code using Skype.contacts["id"] should remain unaffected.

08/01/2016

All classes with auto-generated constructors now reject unrecognised keyword arguments (previously they were silently ignored).

The names of some SkypeImageMsg fields were changed for consistency.