SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Perl Tips

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

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

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

ダウンロード ソースコード (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情報を活用したサービスの作成にぜひチャレンジしてみてください。

参考資料

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Perl Tips連載記事一覧

もっと読む

この記事の著者

重田 崇嗣(シゲタ タカツグ)

1974年神奈川県生まれ。2006年からシックス・アパート株式会社に勤務。ブログ・サービスTypePadの開発を担当。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1468 2007/07/13 00:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング