środa, 14 listopada 2007

Czy flickr umie liczyć?

Flickr wyświetla liczbę że tak powiem odsłon pod każdym zdjęciem, zbiorczo dla każdego zbioru oraz łącznie dla całego albumu (zakreślone na czerwono na rysunkach poniżej). Wydawać by się mogło, że np. sumując odsłony dla wszystkich zdjęć otrzyma się łączną liczbę odsłon w albumie, to znaczy ile razy oglądano nasze zdjęcia. Już na pierwszy rzut oka widać, że tak nie jest. Po prostu nic nie jest sumowane a każdy licznik ,,liczy'' swoją stronę. Odzielnie jest sumowana ,,strona główna'', oddzielnie każda strona dla pojedynczego zdjęcia i oddzielnie strona główna każdego zbioru.

A jak obliczyć łączną liczbę odsłon dla wszystkich zdjęć? Wydawałoby się, że to pryszcz, bo flickr słynny jest ze swojego API. Akurat tego jednak nie da się ustalić -- nie ma takiej metody. Wprawdzie flickr.activity.userPhotos. zwraca m.in. liczbę wyświetleń każdej pojedynczej strony, ale tylko dla stron na których coś się stało: dodano komentarz, ktoś dodał taga albo dodał zdjęcie do swoich ulubionych. Do tego maksymalnie można ściągnąć 50 zdjęć na raz (maksymalna wartość per_page), parametr timeframe może przyjąć maksymalnie wartość jednego miesiąca (30d, większe wartości są ignorowane) a metodę można uruchomić powtórnie nie częściej niż co godzinę (czyli co godzinę można ściągnąć jedną stronę). Poddałem się...

Nie ustaliłem wprawdzie ile było odsłon zdjęć w moim albumie ale eksperymentując z API flickera odkryłem przynajmniej jak można obejść się bez perlowego pakietu Flickr-API (ale nie bez Perla). Otóż wystarczą moduły LWP::Simple oraz Digest::MD5:

Niektóre metody nie wymagają uwierzytelnienia. Ich wywołanie jest szczególnie proste -- nie jest potrzebny nawet moduł Digest::MD5 -- i sprowadza się do konstruowania adresów URL według następującego schematu (znak \ na końcu oznacza kontynuację wiersza):


http://www.flickr.com/services/rest/?method=metoda&parametr1=wartość1\
&parametr2=wartość2...

W metodach, które uwierzytelnienia wymagają sprawa się komplikuje. Trzeba podać api_key, auth_token oraz secret (poniżej nazwany shared_secret) opisane tutaj i/lub w dokumentacji modułu Flickr-Upload. Najpierw należy zbudować napis według schematu:


secretapi_keyapi_keyauth_tokenauth_tokenmethodmethodarg1wart1arg2wart2 ...

Następnie utworzyć jego skrót za pomocą funkcji MD5. W przypadku Perla może to wyglądać jak na poniższym przykładzie (metoda flickr.activity.userPhotos ma argumenty page, per_page oraz timeframe). Obliczony skrót dodajemy jako ostatnią część adresu URL:


Digest::MD5 qw(md5_hex);
my $method = 'flickr.activity.userPhotos';

## ...
## skrót MD5:
my $api_sig = md5_hex( "${shared_secret}api_key${api_key}auth_token${auth_token}method${method}" .
"page${page}" . "per_page${per_page}" . "timeframe${timeframe}" ) ;

my $url = "http://www.flickr.com/services/rest/?method=$method" .
"&api_key=$api_key" . "&auth_token=$auth_token" .
"&page=$page" . "&per_page=$per_page" .
"&timeframe=$timeframe" . "&api_sig=$api_sig" ; ## wstaw skrót tutaj

print $url;

Przy okazji -- jak to często bywa -- znalazłem ciekawą stronę dotyczącą języka Perl. Jest też na ww. stronie opis pakietu Flickr-Upload, z którego też korzystam. Norman Walsh zaimplementował nawet API flickra w XSLT -- ciekawe ale przydatność taka sobie.

Brak komentarzy:

Prześlij komentarz