Wykorzystujemy RESTowe zasoby mashape.com w Pythonie

mashape.com to zbiór RESTowych API z jakich możemy skorzystać w naszych aplikacjach. Niektóre są płatne, inne darmowe. Całość oparta jest o JSONa i może być obsługiwana z praktycznie dowolnego języka programistycznego, w tym Pythona.

W tym artykule zaprezentuję wybrane zasoby API dostępne poprzez mashape.com oraz bibliotekę unirest zalecaną do ich obsługi.

Unirest

Do obsługi API na mashape zalecana jest biblioteka unirest zaimplementowana dla różnych języków. Obsługuje żądania synchroniczne i asynchroniczne, przesyłanie plików, czy autoryzację - jej celem jest ułatwienie pracy na zasobach API.

W przypadku Pythona wystarczy zainstalować unirest za pomocą pip i gotowe. Biblioteka unirest pozwoli nam na wykonywanie żądań GET/POST/PUT/PATCH/DELETE pod wskazane endpointy zasobów API. Jako odpowiedź dostajemy obiekt z np. statusem odpowiedzi, czy gotowym sparsowanym do obiektów Pythona JSONem. Dokumentacja przedstawia możliwości tej biblioteki. Oto przykład jej wykorzystania do przeliczenia 1 BTC na złotówki za pomocą zasoby bitcointy:

import unirest

headers = {
    "X-Mashape-Authorization": "API_KEY_HERE"
}

response = unirest.get(
    "https://community-bitcointy.p.mashape.com/convert/1/PLN",
    headers=headers
)
print response.code, response.body

W chwili pisania artykułu 1 bitcoin to jakieś 1507 PLN.

W serwisie zasobów API jest bardzo dużo, niekoniecznie zawsze potężnych i przydatnych. Wystarczy przejrzeć katalog by znaleźć coś dla siebie. Jest też tam API docplannera, czyli w Polsce znanylekarz.pl.

Kilka ciekawych zasobów API

Yoda Speek

Jak sama nazwa wskazuje yoda-speek zamienia podaną frazę na mowę mistrza Yody.

import unirest

headers = {
    "X-Mashape-Authorization": "..."
}

params = {
    "sentence": "Luke, I'm your father."
}

response = unirest.get(
    "https://yoda.p.mashape.com/yoda",
    headers=headers,
    params=params,
)
print response.body

Co w odpowiedzi zwróci np. Luke, your father I am. Herh herh herh.

Text-to-speech

Kolejny przykład to konwersja tekstu na mowę. Do zasobu wysyłamy tekst, a otrzymujemy jako odpowiedź dane binarne - plik audio.

import unirest

headers = {
    "X-Mashape-Authorization": "..."
}

params = {
    "src": "Luke, I'm your father".split(' '),
    "hl": "en-us",
    "r": 0,
    "c": "mp3",
    "f": "8khz_8bit_mono",
    "key": "..."
}

response = unirest.post(
    "https://voicerss-text-to-speech.p.mashape.com",
    headers=headers,
    params=params,
)
print response.body
python skrypt.py > plik.mp3

Jako key podajemy klucz usługi, który pozyskamy z voicerss.org. Po wprowadzeniu kluczy zasób powinien zwrócić nam plik audio (o niezbyt powalającej jakości konwersji).

Wykrywanie nagości

Użytkownicy dodają do serwisu nieregulaminowe zdjęcia? :) Coś na to poradzić może zasób do wykrywania nagości. Zasób ten zwróci ocenę zdjęcia podanego w linku. Algorytm nie wydaje się być zbyt trywialny, ale niektóre zdjęcia (jak to poniższe) potrafią go zmylić.

import unirest

headers = {
    "X-Mashape-Authorization": "..."
}

params = {
    "url": "http://img4.demotywatoryfb.pl//uploads/201204/1335290612_by_NinjaAssasin_600.jpg"
}

response = unirest.get(
    "https://sightengine-nudity-and-adult-content-detection.p.mashape.com/nudity.json",
    headers=headers,
    params=params,
)
print response.body
{u'status': u'success', u'photo': u'http://img4.demotywatoryfb.pl//uploads/201204/1335290612_by_NinjaAssasin_600.jpg', u'nudity': {u'confidence': 100, u'result': False}}

nudity.confidence będzie procentowym wyznacznikiem z jakim usługa twierdzi że podane zdjęcie zawiera nagość. Planując wykorzystanie tego zasobu trzeba przyjąć jakąś minimalną wartość (np. 70-80) od której nasza aplikacja ma uznawać dane zdjęcie za niepoprawne. Z drugiej strony nie warto na ślepo ufać zasobowi i przechowywać zdjęcia / dodane treści do moderacji.

A mogło być tak pięknie...

Testowałem też kilka innych zasobów. Pomysł na serwis zbierający i udostępniający setki zasobów API jest świetny, ale same zasoby obecnie nie są już takie fajne. Nie każdy działa, jak i nie trzymają się żadnego wzorca. Jedne mają dane przekazywane w linku, inne w parametrach. Także dość często potrzebne są dodakowe klucze z serwisów trzecich wystawiających dane API. Czasami też dostaniemy URLError Name or service not known więc retry-loop by się przydał (umie to m.in. celery), jak i obsługa wyjątku. Dość często status zwracany jest jako 200 mimo iż API odpowiedziało jakimś błędem. Djangowskie generatory RESTowego API jak django rest framework, czy tastypie dość silnie używają statusu by oddać charakter błędu i jest to całkiem sensowne i przydatne.

Nie wiem jak z płatnymi zasobami, może są lepiej dopracowane. Może też te darmowe z czasem zostaną trochę uporządkowane. Mashape da się używać, ale bez fajerwerków.

RkBlog

Programowanie Sieciowe, 1 June 2014

Comment article
Comment article RkBlog main page Search RSS Contact