由 ISBN 取得書籍封面 – from amazon and 博客來

因為工作需要, 需求由 ISBN 去取得書籍的封面回來,
這種繁重的工作, 總不會用人工一本一本的掃瞄進去吧,
當然是到信任的單位去找回來囉…
我還是忍不住要唸唸, 號稱自己是做網路服務的, 連個 API 都不提供實在是很糟糕的事,
然而這卻是國內的網路服務商普遍的現象, 真是受不了呀!!!

首先我利用了 Amazon Web Service(AWS)E-Commerce Service(ECS) 去做這件事,
有個很好的範例在,
我使用的是最新的 ECS4, 先到相關網站尋找最新的 wsdl,
下載相關需要的 jar,
– activation.jar
– axis.jar
– axis-ant.jar
– commons-discovery-0.2.jar
– commons-logging-1.0.4.jar
– jaxrpc.jar
– log4j-1.2.8.jar
– mail.jar
– saaj.jar
– wsdl4j-1.5.1.jar
一般來說, 如果你下載 axis-bin 就幾乎全包了, 只缺 activation.jar 和 mail.jar,
分別到 JAFJavaMail 下載, 完成後,
使用以下指令產生 web service 程式, (以下請依個人環境做調整)
java -cp e:\tmp\axis.jar;e:\
tmp\axis-ant.jar;e:\tmp\commons-discovery-0.2.jar;e:\tmp\commons-logging-1.0.4.jar;
e:\tmp\jaxrpc.jar;e:\tmp\log4j-1.2.8.jar;e:\tmp\saaj.jar;e:\tmp\wsdl4j-1.5.1.jar;e:\tmp\mail.jar;e:\tmp\activation.jar org.apache.axis.wsdl.WSDL2Java http://ecs.amazonaws.com/AWSECommerceService/AWSECommerceService.wsdl -v -W -p com.amazon.aws.ecs -o E:\tmp\src

產生之後的 code 和 jar, 我會再包成一個 aws.jar (個人使用easyeclipse, 利用 fatjar plugin)
接下來就是開始寫程式了,

        AWSECommerceService locator = new AWSECommerceServiceLocator();
        AWSECommerceServicePortType service = null;
        try {
            service = locator.getAWSECommerceServicePort();
        } catch (ServiceException e) {
            logger.error(e);
        }

        // 設定 ISBN 的請求的AWS方法, ItemLookup 參考網址
        ItemLookup itemLookup = new ItemLookup();
        // 設定 SubscriptionId
        itemLookup.setAWSAccessKeyId(“1WRZC5TMC5YZGTHM75R2″);
        ItemLookupRequest request = new ItemLookupRequest();

        // 設定你需要 AWS 傳回的資訊(Response Group)
        request.setResponseGroup(new String[]{“Images"});
        // 設定查詢條件
        request.setSearchIndex(“Books");
        request.setIdType(ItemLookupRequestIdType.ISBN);
        request.setItemId(new String[]{isbn});

        itemLookup.setRequest(new ItemLookupRequest[]{request});

        return invokeItemLookup(service, itemLookup);

————-

    public static String invokeItemLookup(AWSECommerceServicePortType service, ItemLookup itemLookup){
        ItemLookupResponse response = null;
        try {
            response = service.itemLookup(itemLookup);
        } catch (RemoteException e) {
            logger.error(e);
        }

        Items[] itemsArray = response.getItems();
        for (Items items : itemsArray) {
            Item[] itemArray = items.getItem();
            if (itemArray != null){
                for (Item item : itemArray) {
                        Image  largeImage = item.getLargeImage();
                        return largeImage.getURL();
                }
            }
        }

        return SPACER_IMG;
    }

以上是從 amazon 的作法。

再來由於博客來沒有提供 API, 因此我是利用 RoboMaker 做的,
目前提供三種類型的機器人:RSS/AtomREST、Web Clip,
其中RSS/Atom市面上其實已經很多, 像之前我介紹過的 Feed43,
我想最好用的莫過於 REST 了, 應該實在太多應該提供 API 卻不提供的網站了,
RoboMaker的用法非常簡單, 只要看這篇 tutorial 就行,
而且連內文都不用看, 只要把每張圖打開一步一步照著做就行,
邊看就可以邊完成你需要的機器人,
我幫博客來和誠品做了兩個機器人, 分別是
    // from 博客來
    private static String BOOKS_URL = “http://service.openkapow.com/joanna/getbookimagebyisbn.xml?resultformat=xml&isbn=";
    // from 誠品
    private static String ESLITE_URL = “http://service.openkapow.com/joanna/getimagefromeslite.xml?resultformat=xml&ISBN=";

我是以 jdom 去解析, 所以需要有 jdom.jar, 程式如下:

        SAXBuilder sb = new SAXBuilder(false);
        Document doc = null;
        Element root;
        Element image = null;

        try {
            doc = sb.build(new URL(new StringBuffer(BOOKS_URL).append(isbn).toString()));
            root = doc.getRootElement();
            image = root.getChild(“image");
        } catch (MalformedURLException e) {
            logger.error(e);
        } catch (JDOMException e) {
            logger.error(e);
        } catch (IOException e) {
            logger.error(e);
        }

        return image != null ? image.getValue() : SPACER_IMG;
    }

最後再分享個 regexp, 我是利用書名去判斷是中文書或英文書,
若是中文書則從博客來去取, 英文書則從 amazon 去取,
會這樣做的原因是 amazon 有提供 API, API 是由 amazon 去維護,
而博客來是我們自己去寫的, 哪天博客來改了什麼東西, 我們可能就因此掛掉了,
加上博客來其實非常不穩定, 常常會掛掉,
為求穩定, 所以用以下程式做了中文或英文書名的判斷:

// 若為中文書名則去尋找 博客來 的圖片, 否則尋找 amazon 的圖片
        if (Pattern.compile(“[\u4e00-\u9fa5]+").matcher(bookname).find())
            return getChiBookImage(isbn.replaceAll(“-“, “"));
        else
            return getEngBookImage(isbn.replaceAll(“-“, “"));

如此一來就大功告成囉!!…

最後補充一下, tapestry 由 server end 設定圖片的做法,
html:

    <img jwcid="@Image" image="ognl:imageAsset"/>

java/class:

    public abstract String getImage();
    public abstract void setImage(String imageURL);

    public IAsset getImageAsset() {
        return new ExternalAsset(getImage(), null);
    }

technorati tags:, , , , , , , , ,

Blogged with Flock

廣告

9 responses to this post.

  1. Posted by Alan on 05/09/2007 at 9:04

    終於搞定啦 恭喜啦~~~
    要請我吃飯 XDDDDDDDD

    回應

  2. 我早就搞定了….我只不過沒時間寫Blog…

    回應

  3. 現在好像不能這麼搞了,博客來的圖片都上了面積比例龐大的浮水印!

    回應

  4. 其實也沒差啊….他們只不過是因為之前張天立事件….引發的經營權之爭….之後才加上了浮水印…
    之前跟博客來接洽過…他們說隨便我們引用…老實說…這些書封應該都是書商提供…
    所以基本上不太會有版權的問題…要不然你以為 Amazon 怎麼做到完全公開的…
    而且其實我們也剛好換了其它的合作夥伴…因為博客來實在是太不穩定了…

    回應

  5. Posted by maker on 02/01/2008 at 17:48

    您好,
    網站剛好需要比價功能,可以外包給你嗎?
    如果可以請回信,
    謝謝你,
    maker

    回應

  6. 呃…可以詳談呀…只不過我要怎麼跟你聯絡呢?

    回應

  7. Posted by bobju on 30/04/2008 at 1:06

    嗨, 您好:
    這個API真好用, 正好我用得著.
    感謝囉 ^_^
    有機會再來請教。

    回應

  8. Posted by GGD on 11/05/2012 at 18:13

    嗨,您好!
    請問這個 API 有辦法從書名去找博客來對應的書籍嗎?類似 anobii.com 的做法一樣,輸入部份書名就可以找書?

    回應

  9. Posted by 李文凱 on 03/10/2013 at 9:23

    你好,我需要根據ISBN去抓封面圖檔,可以請你做嗎?

    回應

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: