Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

デジカメ写真と価格.com APIを使ってマッシュアップを作ろう

FlickrのAPIと価格.com商品検索APIをPerlでマッシュアップする

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/07/13 00:00

ダウンロード ソースコード (1.7 KB)

デジカメで撮った写真に含まれるメタデータフォーマットであるExifを利用してマッシュアップを作りたいと思います。デジカメ写真はFlickrにアップされているものを使用します。

はじめに

 デジカメで撮った写真に含まれるメタデータフォーマットであるExifを利用してマッシュアップを作りたいと思います。

完成画像
完成画像

対象読者

 マッシュアップに興味のある方や写真を利用したサービスを作成したい方に参考になると思います。

必要な環境

 Perl 5.8以上が動作する環境が良いと思います。基本動作の確認はMac OS Xを利用しました

解説内容

処理の流れ

 今回は写真共有サイトFlickrから写真を収集し、その写真のExif情報からカメラの型番を抽出して、価格.comの商品検索APIを利用して商品情報を取得し、最終的にHTMLを生成するマッシュアップです。流れとしては次のとおりです。

  1. FlickrのPublic photos feedから写真を抽出
  2. Image::ExifToolを使って抽出した写真のExif情報を取得
  3. 収集したExif情報を価格.com 商品検索APIに渡して、商品情報を取得
  4. 取得した商品情報の一覧をHTMLとして生成

ソースコード

 紙面の都合上、全体のソースコードはこちらからダウンロードしてください。

 今回は主に次のCPANモジュールを利用しました。

フィードの解析

 フィードの解析では、フィードの中にある写真へのURLを取得します。XMLパーサはXML::LibXMLやXML::RSSなどが代表的なCPANモジュールですが、今回は興味本位でWeb::Scraperモジュールを使ってみたいと思います。FlickrのPublic photosのフィードにはenclosureがありますので、これを利用して写真へのURLを取得します。

Web::Scraperでフィードからenclosureを抽出
my $enclosures = scraper {
    process 'link[rel="enclosure"]', 'url[]' => '@href';
    result 'url[]';
}->scrape($res->content);

Exif情報の抽出

 フィードから取得した写真へのURLを使って、LWP::UserAgentモジュールで写真をGETします。GETした写真をImage::ExifToolに渡してExif情報を取得します。

Image::ExifToolを使ってExif情報を取得
my $tool = Image::ExifTool->new();
my $info = $tool->ImageInfo(\$ua->get($uri)->content);
$info->{'Model'};#Modelタグ(機種や型番)の情報にアクセス

 Exif情報はタグと呼ばれる要素で構成されています。非常に多くのタグが存在します。基本的なタグのほかにメーカーが独自に定義したタグなもあります。Image::ExifToolのPODにタグ情報が掲載されていましたのでご参照ください。

価格.com 商品検索API

 価格.com WEBサービスの商品検索APIを利用して商品情報を取得します。リクエストパラメータは次のように設定します。

  • Keyword=Exif情報のModelタグ
  • ResultSet=medium (画像情報を取得するため)
  • CategoryGroup=ALL
  • SortOrder=pricerank (価格の昇順)
  • PageNum=1 (最初の5件のみ取得)

 上記のパラメータでURLを生成して価格.comから情報を取得します。

※価格.com WEBサービス使用上の注意
 価格.com WEBサービスはクレジット表示が必要になります(価格.com WEBサービス クレジット表示について)。

サンプルの表示

 表示するためにHTMLを生成します。単にHTMLだけ出力するのは面白くないので、マッシュアップらしく(?)、JSONを利用してみました。JSONならばJavaScriptを利用してデータを操作できますので多くのデータも柔軟に対処できます。JSON::AnyモジュールはJSONの扱いを簡単にしてくれるモジュールです。JSON::Any::objToJsonメソッドでPerlで使われるオブジェクトをJSON形式に変換してくれます。

JSON::Anyを使ってJSONを出力
my @json_data;
my $j = JSON::Any->new;
my $json = $j->objToJson(\@json_data);

まとめ

 今回はシンプルに1つの流れを追いかけるだけでしたが、写真を継続的に入手すればカメラのトレンドが分かるようになりますね。また今回はExif情報の中の機種や型番を表すModelタグを扱いましたが、Exif情報にはほかにも写真に関連する多くの情報があります。例えば解像度を表すXResolutionYResolutionタグを参照して解像度のトレンドを調べるのも面白いと思いますし、GPS情報を参照して地図サービスとのマッシュアップも面白いと思います。

 実は今回は写真と地図データを利用したFlickrVisionのようなマッシュアップを紹介しようと思っていましたが、GPS情報を持つ写真が非常に少なくて断念しました。もう少しGPS情報のある写真が普及してくればより面白いマッシュアップを作ることができると思います。

 皆さんも携帯電話やデジカメでたくさんの写真をお持ちでしょうから、Exif情報を活用したサービスの作成にぜひチャレンジしてみてください。

参考資料



  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:Perl Tips
All contents copyright © 2006-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5