BlipPy - biblioteka pythonowa do Blipa
Parę dni temu postanowiłem pouczyć się czegoś nowego. Padło na polecanego mi przez wielu znajomych Pythona. Ale jak to ze mną bywa nie umiałem uczyć się “na sucho” i musiałem znaleźć sobie jakiś cel. Postanowiłem zatem napisać prostą bibliotekę komunikacyjną, która umożliwia interakcję z serwisem Blip.pl. Dlaczego akurat Blip? Po pierwsze go używam, a po drugie dowiedziałem się, że ma API. I tak oto powstała biblioteka obsługująca Blipa dla Pythona. Nazywa się BlipPy.
Z czym to się je?
Jedzenie należy zacząć od zassania samej biblioteki. Aktualna wersja, czyli 0.1, jest dostępna w repozytorium subversion. Póki co zawiera jedynie jedną klasę o nazwie Communicator, która zapewnia komunikację z Blipem poprzez API. W planach wersji 0.2 jest napisanie innej klasy, która będzie zarządzała danymi zasysanymi z Blipa. Będzie ona najprawdopodobniej użyta do napisania klienta desktopowego Blipa (kolejny etap mojej nauki). Narazie jest tylko komunikacja - powiedzmy - niskopoziomowa.
Aby pobrać bibliotekę należy mieć zainstalowanego klienta subversion i wydać następującą komendę:
svn co https://blippy.svn.sourceforge.net/svnroot/blippy blippy
Biblioteka jest mała i zawiera się w jednym pliku o nazwie blippy.py. Wystarczy go umieścić w katalogu naszej aplikacji i zaimportować. Należy także doinstalować moduł cjson, który jest używany przez bibliotekę do obsługi formatu JSON. W dalszej części pokrótce opiszę, jak używać BlipPy’ego. Nie będzie to syntetyczny opis wszystkich metod, gdyż do tego lepsze będą komentarze opisujące metody. Tutaj tylko parę przykładów obrazujących jak zacząć biblioteki używać. Zaczynamy…
Inicjalizacja
Do komunikacji z Blipem, jak wspomniałem, służy klasa Communicator. Tak tworzymy jej instancję:
import blippy
com = blippy.Communicator("user", "password")
Za pomocą powyższego kodu zostanie utworzony komunikator uwierzytelniony, czyli działający w kontekście danego użytkownika serwisu Blip.pl. Jako trzeci parametr można podać tzw. user-agent (czyli jak się przedstawiamy serwerowi Blipa). Można także w ogóle pominąć parametry i wtedy komunikator będzie anonimowy. Pamiętajcie jednak, że wiele operacji na zasobach Blipa wymaga podania użytkownika i hasła.
Pobranie bliposfery
Najprostszą czynnością na Blipie jest chyba pobranie bliposfery, czyli n-ostatnich statusów użytkowników. Gdy już mamy obiekt Communicator możemy pobrać tę informację w taki oto sposób:
bliposphere = com.GetBliposphere(10)
Spowoduje to pobranie ostatnich 10 statusów bliposfery. Zmienna bliposphere będzie zawierała tablicę 10 słowników. W każdym słowniku znajduje się para klucz->wartość. Oto przykładowa zawartość pojedynczego słownika:
{
'body': u'Ha, nowiutki statusik :)',
'user_path': '\\/users\\/bayger',
'created_at': '2008-03-29 12:00:00',
'type': 'Status',
'id': 123456789,
'transport': {'name': 'sms', 'id': 2}
}
Z nazw kluczy słownika możemy wywnioskować ich zawartość. Po szczegóły zapraszam do oficjalnej dokumentacji API Blipa, gdzie podane są przykłady zwracanych wartości przez API.
Wysłanie nowego statusu
Równie prostą czynnością jest wysłanie nowego statusu na Blipa. Potrzebujemy do tego uwierzytelnionego Communicatora, a robimy to tak:
com.SendStatus("Oh hai! I iz tryng to blip somtink")
Po wykonaniu się powyższej operacji powinniśmy na kokpicie użytkownika i bliposferze zaobserwować nowy status. Dodam tylko, że metody klasy Communicator oczekują łańcuchów znaków w kodowaniu UTF-8.
Wysłanie wiadomości do użytkownika
Kolejną rzeczą, jaką udostępnia API Blipa jest wysyłanie tzw. wiadomości skierowanych do użytkownika. Nie są one tak naprawdę prywatne (każdy może je zobaczyć), ale ukazują się tylko na kokpicie adresata. Tak wysyła się wiadomość skierowaną:
com.SendMessage("nick_adresata", "wiadomość_do_adresata")
Jeśli wszystko pójdzie dobrze to adresat powinien dostać wiadomość.
Obsługa błędów
Błędy obsługiwane są standardowo, czyli za pomocą wyjątków. Jeśli coś pójdzie nie tak to dana metoda rzuci jednym z następujących wyjątków:
- NotFoundException - gdy brak szukanego zasobu na serwerze
- BadArgumentsException - gdy źle podaliśmy argumenty wywołania (np. w niedozwolonym formacie)
- BadCredentialsException - gdy próbujemy zrobić coś, co wymaga uwierzytelnienia a podaliśmy zły login/hasło (lub nie podaliśmy)
- ServerBusyException - gdy serwer jest bardzo zajęty i nie może obsłużyć naszego żądania; należy spróbować ponownie
- BadOperationException - gdy wystąpił bliżej nieokreślony błąd
Update: Dodatkowo metody mogą rzucić wyjątkami, gdy coś na linii protokołu HTTP będzie nie tak.
Co innego udostępnia BlipPy?
Ponieważ wszystkie przykłady użycia biblioteki są dość proste wymienię tylko możliwości jakie daje w obecnym kształcie BlipPy:
- pobieranie bliposfery i kokpitu użytkownika
- wysyłanie i kasowanie statusów i wiadomości skierowanych
- pobieranie informacji o obrazkach, nagraniach, linkach, filmach
- pobieranie informacji o avatarch i tłach użytkowników
- ustawianie avatara i tła użytkownika
- dodawanie i usuwanie obserwowanych użytkowników
- pobieranie informacji o użytkownikach
Co dalej?
Kolejna wersja biblioteki (0.2) będzie najprawdopodobniej udostępniała klasę zarządzającą komunikacją z Blipem. Innymi słowy będzie to podstawa do napisania klienta desktopowego dla Blipa. Jego kształt dopiero rodzi się w mojej głowie. Poza tym muszę zbadać co oferuje Python jeśli chodzi o programowanie UI. O postępach nie omieszkam powiadomić na łamach bloga. Poza tym dodam do Communicatora obsługę offsetów, które umknęły mi w czasie lektury API.
Przypominam także, że jest to mój pierwszy kod w Pythonie i, być może, nie jest on najlepszy. Starałem się wpasować w język jak tylko na daną chwilę umiałem. Chętnych proszę o testowanie i wysyłanie ewentualnych uwag, bugów, sugestii na mój adres email (patrz: strona O mnie) lub po prostu w komentarzach poniżej. Z góry za nie dziękuję!


Szybka notka o tym, jak skonfigurować myszkę Logitech MX600 pod Linuksem. Dodam tylko, że myszka ta znajduje się między innymi w zestawie Cordless Desktop MX3000. Wszyscy jej posiadacze cierpiący na niedziałające klawisze Back/Forward znajdą tutaj na to lekarstwo.
Jakiś czas temu na forum 