RkBlog

Hardware, programming and astronomy tutorials and reviews.

Flickr.com API - Wyszukiwarka zdjęć

Przykład integracji z zewnętrznymi serwisami za pomocą REST.

flickr.com to serwis, w którym można umieszczać własne zdjęcia. Obecnie jest ich bardzo dużo i łatwo znaleźć tam poszukiwane, ciekawe grafiki. Dodatkowej wyjątkowości temu serwisu przysparza pełne API (dokumentacja) umożliwiające integrację komponentów flickr.com ze stronami www czy zwykłymi aplikacjami komputerowymi.
By korzystać z API flickr.com musimy zarejestrować się i wygenerować klucz API (za darmo, tutaj). Gdy go mamy możemy przystąpić do dzieła.

Flickr Api w PHP

Istnieje kilka wrapperów w PHP:
- PEAR::Flickr_API
- phpflickr
- phickr - PHP5
- Flickr API Parser - PHP5, moja klasa
W poniższym warsztacie wykorzystam kod mojej klasy z wykorzystaniem funkcji simplexml_load_file dostępnej w PHP5.

Jak to działa?

z Flickr można rozmawiać poprzez trzy formaty: REST, XML-RPC i SOAP. Najprostszy to REST, który dla zapytań sprowadza się do skonstruowania linka zawierającego określone zmienne, a odpowiedzią są dane w postaci XML. Ten format wykorzystamy w naszej wyszukiwarce zdjęć.

Podstawy

Utwórz w CI konstruktor flickr.php o kodzie:
<?php
class Flickr extends Controller
{
private $api_key;
public function __construct()
     {
     parent::Controller();
     $this->response = array();
     $this->api_key = 'TWÓJ KLUCZ API';
     }
public function index()
     {
     echo '<pre>';
     print_r(Flickr::_search('kubica'));
     }
private function _search($query)
     {
     $x = simplexml_load_file('http://www.flickr.com/services/rest/?method=flickr.photos.search&text='.$query.'&per_page=20&api_key='.$this->api_key);
     $ret['total'] = (int)$x->photos['total'];
     foreach($x->photos->photo as $res)
          {
          $r[] = array('id' => (int)$res['id'], 'title' => (string)$res['title'], 'owner' => (string)$res['owner'], 'secret' => (string)$res['secret'], 'server' => (int)$res['server']);
          }
     $ret['img'] = $r;
     return $ret;
     }
}
Wprowadź swój klucz, a następnie wejdź na index.php/flickr a zobaczysz tablicę z danymi wyszukanych zdjęć. Klasa stosuje nieco modelu obiektowego PHP5 (jeżeli kod i tak wymaga PHP5 to warto używać reszty zalet tej wersji PHP). Różnice to nazwa konstruktora oraz dostępność metod public - metoda dostępna poza klasą, private - metoda dostępne tylko i wyłączenie wewnątrz klasy...
Metoda _search zwraca tablicę, która zawiera serię tablic z wynikami, oto jedna z nich:
[0] => Array
                (
                    [id] => 209252923
                    [title] => Robert Kubica
                    [owner] => 93661155@N00
                    [secret] => d83a760613
                    [server] => 60
                )
id to numer ID zdjęcia, title to jego tytuł, owner to identyfikator właściciela zdjęcia (osoby, która je dodała), server - numer serwera, na którym znajduje się to zdjęcie. Otwierany przez simplexml_load_file link:
'http://www.flickr.com/services/rest/?method=flickr.photos.search&text='.$query.'&per_page=20&api_key='.$this->api_key
To właśnie przykład żądanie w formacie REST. Wywołuje on metodę API o nazwie flickr.photos.search (dokumentacja) i przekazuje dodatkowe parametry. Odpowiedź to XML, który jest parsowany przez wspomnianą funkcję, tworzony jest obiekt, z którego wyciągane są interesujące nas dane. Otrzymujemy tablicę, na której łatwiej operować.

Jakie są struktury linków na flickr.com ?

Dla nas ważne jak dostać się do zdjęcia na podstawie tych danych. Bezpośredni link do "strony zdjęcia" wygląda tak:
http://www.flickr.com/photos/OWNER/ID/
Gdzie za "OWNER" i "ID" wstawiamy dane z powyższej tablicy. Oprócz tego mamy dostęp bezpośrednio do grafik. Dla nas potrzebne będą miniatury:
- 75x75: http://static.flickr.com/SERWER/ID_SECRET_s.jpg
- 100x75: http://static.flickr.com/SERWER/ID_SECRET_t.jpg
- 240x180: http://static.flickr.com/SERWER/ID_SECRET_m.jpg
Rozmiary mogą ulegać zmianom dla niektórych grafik.

Wyszukiwanie, linki i miniaturki

Gdy znamy postać linków oraz mamy tablicę z wynikami to trzeba to połączyć. Zmień metodę index konstruktora na:
<?php
public function index()
     {
     $ar = Flickr::_search('kubica');
     foreach($ar['img'] as $val)
          {
          echo '<a href="http://www.flickr.com/photos/'.$val['owner'].'/'.$val['id'].'/"><img src="http://static.flickr.com/'.$val['server'].'/'.$val['id'].'_'.$val['secret'].'_s.jpg" style="margin:5px;" border="0"></a>';
          }
     }
Odśwież stronę CI (index.php/flickr) a powinieneś zobaczyć coś takiego:
darmowy hosting obrazków
Każda miniaturka prowadzi do "strony zdjęcia". Do pełni szczęścia "wyszukiwarki" przydałby się formularz, w którym można podać frazę, ale to nie problem. Problemem może być powolność tego systemu, jako że łączymy się z innym serwerem, który musi przygotować dane i wysłać odpowiedź. Jeżeli stosujemy jakiś komponent Flick API na stronie to albo powinniśmy go keszować albo ładować asynchronicznie by nie blokować ładowania całej strony. Keszowanie polegałoby na zapisaniu wyniku i używania przez jakiś czas zapisanej kopii a nie wysyłania żądania do flickra. Metoda asynchroniczna to generalnie Ajax (lub ramka), którym zajmiemy się w najbliższym czasie.
RkBlog

Kurs Code Igniter, 14 July 2008,

Comment article