2009년 4월 30일 목요일

Flickr-j를 이용한 플리커 이미지 검색하기

Flickr Open API를 각 언어별로 구현해 둔 오픈소스들이 많이 있다. 야후 플리커에서 소개하고 있는 킷 중에 Flickr-j 오픈소스를 이용해서 플리커의 이미지를 검색하는 예제소스를 구현해 보자.

플리커, 피카사, 아마존, 구글 API등을 이용한 새로운 서비스를 만드는 것을 매쉬업이라고 한다. 아마도 대부분은 이에 대한 것을 잘 알고 있으리라 생각하고 생략한다. 그냥 나도 이번 기회를 통해서 매쉬업 서비스를 중점적으로 연구해 볼까? 하는 생각을 해 본다. 물론 언제나 시간적 여건이 마련되어야 하지만...^^;;
암튼, 매쉬업 서비스를 위한 첫 발걸음을 본격적으로 내딛었다고 생각한다. 그럼 다음의 소스를 간략하게 실행해 보자.
컴파일, 실행 전에 반드시 flickrapi.jar 를 classpath에 포함시켜야 한다. 이클립스 환경에서 수행하면 쉽게 수행할 수 있다.

/**
 * FlickrSearch.java
 *
 * Flickr-j를 이용한 Flickr 검색 애플리케이션
 *
 */
package net.wiseant.flickr.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import com.aetrion.flickr.Flickr;
import com.aetrion.flickr.FlickrException;
import com.aetrion.flickr.REST;
import com.aetrion.flickr.RequestContext;
import com.aetrion.flickr.auth.Auth;
import com.aetrion.flickr.auth.Permission;
import com.aetrion.flickr.photos.Photo;
import com.aetrion.flickr.photos.PhotosInterface;
import com.aetrion.flickr.photos.SearchParameters;
import com.aetrion.flickr.util.IOUtilities;

/**
 * @author Sang Hyup Lee
 * @version 1.0
 *
 */
public class FlickrSearch {

    static String apiKey;
    static String sharedSecret;

    Flickr flickr;
    REST rest;
    RequestContext requestContext;
    Properties properties = null;

    public FlickrSearch() throws ParserConfigurationException, IOException {
        InputStream in = null;
        try {
            in = getClass().getResourceAsStream("/setup.properties");
            properties = new Properties();
            properties.load(in);
        } finally {
            IOUtilities.close(in);
        }

        flickr = new Flickr(properties.getProperty("apiKey"), properties.getProperty("secret"), new REST());
        requestContext = RequestContext.getRequestContext();
        requestContext.setSharedSecret(properties.getProperty("secret"));

        Auth auth = new Auth();
        auth.setPermission(Permission.READ);
        auth.setToken(properties.getProperty("token"));

        requestContext.setAuth(auth);
        Flickr.debugRequest = false;
        Flickr.debugStream = false;
    }

    public void search() throws FlickrException, IOException, SAXException {
        Map starredPhotos = new HashMap();
        Map blockedPhotos = new HashMap();

        PhotosInterface photosInterface = flickr.getPhotosInterface();

        SearchParameters params = new SearchParameters();

        // tag setter
        // params.setTags(new String[] {"java", "jsp"});
        params.setText("java");

        int perPage = 10;
        int pageIndex = 0;
        List photoList = photosInterface.search(params, perPage, pageIndex);
        List photos = new ArrayList();

        System.out.println("===== Search result =====");
        for ( Object object : photoList ) {
             Map photoMap = new HashMap();
             Photo photo = (Photo)object;

             System.out.println("Photo id : " + photo.getId());
             System.out.println("Photo title : " + photo.getTitle());
             System.out.println("Photo small square url : " + photo.getSmallSquareUrl());

             photoMap.put("url",    photo.getSmallSquareUrl());

            String id = photo.getId();
             photoMap.put("id", id);

             Boolean starred = (Boolean) starredPhotos.get(id);
             photoMap.put("starred", starred == null ? Boolean.FALSE : starred);
            if (blockedPhotos.get(id) == null) {
                 photos.add(photoMap);
            }
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        FlickrSearch flickrSearch = new FlickrSearch();
        flickrSearch.search();

        System.exit(0);
    }

}

위의 소스를 실행하기 전에 setup.properties를 properties로 설정해 두는 부분이 있다. setup.properties의 양식은 다음과 같다.

apiKey = your api key
secret = your secret
token = your token

setup.properties 에서 value 값으로 사용되는 것들은 플리커 API 키를 신청하면 얻을 수 있다. token은 flickr-j 의 examples 소스의 AuthExample.java 를 통해서 얻어올 수 있다.

특별히 설명이나 어려운 부분없다. 대부분은 flickr-j 에서 제공함으로 API를 호출하기만 하면 된다. example을 통해서 여러 가지 살펴보고 있는데, 블로그를 통해서 소개할 만한 부분들은 언제든지 소개할 것이다.

이것으로 첫 매쉬업 서비스를 런칭해 보았다^^
참, flickrj 는 다음의 주소에서 구할 수 있다.

댓글 2개:

핫독 :

token 얻기 위해 AuthExample.java 실행하면 아래의 오류가 나는데 뭘까요?

com.aetrion.flickr.FlickrException: 108: Invalid frob

at com.aetrion.flickr.auth.AuthInterface.getToken(AuthInterface.java:182)

at AuthExample.<init>(AuthExample.java:65)

at AuthExample.main(AuthExample.java:81)

Authentication failed

와이즈앤트 :

@핫독 - 2009/05/28 16:50
글쎄요... 단순하게 에러 메시지만 봐서는 아무래도 인증키를 잘 못 넣으신게 아닌가 하는 생각이 듭니다.

저도 몇 번의 시도 끝에 성공했던 기억이 나네요...

오래전 이야기 인지라 쉽게 생각나진 않군요^^;;

apiKey와 secret 값을 정확하게 기입하셨는지 확인해 보시길 바랍니다.

감사합니다.