![]()
Давно у меня уже была мысль о том, что фотогалерею надо бы было организовать при помощи веб-сервиса. Причин этому много. Во-первых это идеалогически правильно. Web 2.0, mash-ups и т.д. Во-вторых – помогает экономить место на хостинге. В-третьих – не стоит забоиться об организации БД, хранилища файлов, безопасности, аплоаде, а так же большой групповой загрузке фотографий на сервер.
В этом деле главное – выбрать сервис. Я вообще большой любитель Google, по этому, в первую очередь я подумал о Picasa. Пикаса, конечно, хороша, но ограничения на место мне явно не хватает. Хотелось чего-нибудь динамического и бесплатного. Flickr в бесплатном варианте не очень удобен – только 3 альбома, 100мб в месяц. Еще посоветовали некий Яндекс.Фотки, но уж простите, но Яндекс для меня как раз идеалогически неверен.
В общем я на время эту идею оставил, как вдруг в Интернетных Штучках наткнулся на не очень информативный, но в последствии оказавшийся очень полезным пост про ipernity.
Ipernity это такая социальная сеть для распостранения файлов. Принцип прост – создаёте альбомы, загружаете туда файлы какие хотите, а потом ваши друзья (или все кто хотите) может их загружать или просматривать. Все это дело, как я уже сказал, полито толстым слоем социальности и веб 2.0-сти. К счастью это включает еще и вполне широкий API для работы с альбомами и его содержимым. В бесплатной форме он даёт 200мб ежемесячно на ваши нужды. Не очень много, но лучше чем 100.
Хватит слов, пора приступить к делу! :)
Во-первых вам надо получить ключ. Это такой набор символов, который авторизирует ваш скрипт (приложение) к подключению к API. Для начала его стоит получить. Вот тут.
Теперь скачаем их PHP API Kit. Там же, кстати, можно почитать описания методов и два примера. Кстати, для его работы нужен PHP5 и CURL.
Кидаем файл в /app/vendors и подключаем как было описано пару постов назад.
Теперь лёгким движением руки получаем список альбомов:
1 2 3 4 5 6 7 8 9 10 11 12 | function index() { App::import('Vendor','Iper_API',array('file'=>'ipernity/api.php')); $api = new Iper_API(array('api_key'=>'<em>Tут ваш API_KEY</em>', 'secret'=>'<em>Тут ваш SECRET</em>', 'format'=>'json')); $r = $api->request('album.getList',array('user_id'=>"<em>Тут ваш User_id</em>",'thumbsize'=>'560')); $this->set('albums',$r['albums']['album']); $this->set('title','Album list'); } |
Итак, что же мы делаем? Сначала – создаём объект который будет общаться с сервером и передаём в него наши ключи и указываем что тип данных будет json. Это приведёт к тому, что мы получим в ответ – обычный php-объект. Теперь делаем запрос. Метод Request выполняет один из методов API и передаёт в него параметры. Тут вотможно просмотреть весь список доступных методов. В данном примере, мы получаем список альбомов пользователя по его ID. Размер уменьшенных копий – 560пх. Это максимальный размер. Вообще, ширина картинок тут очень дискретна: 75x, 100, 240, 500 или 560. 75х – по-умолчанию.
В ответ мы получаем объект. Добавте вид по-вкусу и получите список альбомов.
1 2 3 4 5 6 7 8 | <?foreach($albums as $item):?> <div class='photo-frame'> <a href="/pho/album/<?php echo $item['album_id']?>" title="<?php echo $item['title']?>" ><img src="<?php echo $item['cover']['url']?>"/></a> <h2><?php echo $item['title']?></h2> <p><?php echo date("d F, y",$item['dates']['created_at'])?></p> </div> <?endforeach;?> |
Получается такое.
Таким же образом получаем список изображений в альбоме:
function album($id = null) { if ($id == null) { $this->flash("Wrong album","/pho/"); } $this->layout = "photo"; App::import('Vendor','Iper_API',array('file'=>'ipernity/api.php')); $api = new Iper_API(array('api_key'=>'Ваш API-ключ', 'secret'=>'Ваш Secret-ключ', 'format'=>'json')); $r = $api->request('album.docs.getList',array('album_id'=>$id,'thumbsize'=>'75','per_page'=>'500')); $this->set('albums',$r['album']['docs']['doc']); $r = $api->request('album.get',array('album_id'=>$id)); $this->set('album_title',$r['album']['title']); $this->set('title',$r['album']['title']); } |
Получается, к примеру, такое.
Идея такая же, за исключением того, что мы используем метод album.docs.getList, указываем количество фоток на страницу (максимально – 500), а так же отдельным вызовом получаем название альбома (да, ребята могли бы его добавить в ответ на запрос о содержании альбома… но чего нет, того нет).
И тут возникает самая большая проблема: мы получаем уменьшенные копии изображения в заданном размере. Скажем 75пх. Чтобы получить увеличенную фотку, надо делать еще один запрос. По-этому, либо нужно делать аякс-запрос при выборе картинки (запрашивать ссылку на более большой вариант), либо создать еще один метод, который будет показывать картинки.
Я выбрал второй вариант:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | function image($id = null) { if ($id == null) { $this->flash("Wrong photo","/pho/"); } App::import('Vendor','Iper_API',array('file'=>'ipernity/api.php')); $api = new Iper_API(array('api_key'=>'...ваш ключ', 'secret'=>'...ваш ключ', 'format'=>'json')); $r = $api->request('doc.get',array('doc_id'=>$id)); $url = $r['doc']['thumbs']['thumb'][4]['url']; //header("Location:".$url); header('Content-Type: image/jpeg'); header("Cache-Control: must-revalidate"); header("Expires: " . gmdate("D, d M Y H:i:s", time() + 259200) . " GMT"); $f = fopen($url,'r'); echo(stream_get_contents($f)); fclose($f); die(); } |
Используем метод doc.get который возвращает нам всю информацию о файле.
У меня было два варианта – редирект, или замещение. Пришлось выбрать второй вариант, чтобы менять хедеры и заставлять браузер кешировать картинки. В примере вы можете увидеть закомментированный вариант с редиректом.
Пока что существует одна проблема – для получения картинки оригинального размера необходима сложная авторизация. Сейчас я выясняю как с этим бороться, как только разузнаю – сразу вам всё расскажу.


А есть возможность добавлять комментарии, оценки к фотографиям?
Нет, это лишь способ работы с Ipernity API