仕事で本のデータを管理するDBを制作することになって、Amazonのサービスを利用してデータを取得する方法を調査して、FileMaker ProのDBに組み込んだ。
そのメモ。
まず、Amazonの商品データを取得するためにはAmazonのAPIを利用する。
Product Advertising APIがそれ。
そのためにはアカウント作成が必要。
その前提としてAmazonのアソシエイト・プログラムに参加する必要があります。
このあたりの説明は、下記のサイトが参考になります。
Amazon Web サービス入門
データ利用に必要なもの
・Amazonアソシエイト・プログラムのアソシエイトID
・Product Advertising API アカウントの2種類の認証用キー(Access Key IDとSecret Access Key)
私のPC環境はMacなのでMacOS XのAppleScriptを利用して上記APIからFileMaker Proへxmlデータを取り込んで、
そのデータから必要な情報をフィールドに登録するという流れになります。
これをFileMaker Proのスクリプトで実行します。
まずはAppleScript単体でデータにアクセスできるかをテスト。
こちらのページ「FileMakerとApplescriptでAWS」を参考にAppleScriptを作成。
参考にさせていただいたページの記述から一部追加、修正して無事取得できることを確認。取得したURLをWebブラウザで表示させて正常にXMLフォーマットで表示。
あと、Product Advertising APIの説明PDFも参考にしました。
■追加した点
・AssociateTagの追加
■変更した箇所
・読みに行くURL
webservices.amazon.co.jp → ecs.amazonaws.jp
■AppleScriptのコード
set aCode to "
require 'date'
require 'openssl'
require 'base64'
require 'cgi'
gmt = DateTime.now.new_offset.strftime('%Y-%m-%dT%XZ')
key = '●●●●●●●●●●●●●●●●●●●●●'
req = [
'AWSAccessKeyId=●●●●●●●●●●●●●●●',
'AssociateTag=●●●●●●●●●',
'ItemId=●●●●●●●●●●',
'Operation=ItemLookup',
'ResponseGroup=Medium',
'Service=AWSECommerceService',
'Timestamp=' + CGI.escape(gmt),
'Version=2011-08-01'].join('&')
message = ['GET', 'ecs.amazonaws.jp', '/onca/xml', req].join('
')
hash = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA256.new, key, message)
sig = CGI.escape(Base64.encode64(hash).chomp)
aURL = 'http://ecs.amazonaws.jp/onca/xml?' + req + '&Signature=' + sig
print aURL"
do shell script "/usr/bin/ruby -e " & quoted form of aCode
さて、こちらをFileMaker Proのスクリプトで利用するために組み込み。
記述はFileMaker日本語フォーラムのこのページを参考にさせていただきました。
●●●部分をDBのフィールドデータから設定するように記述。
"set aCode to \"" & "¶" &
"require 'date'" & "\n" &
"require 'openssl'"& "\n" &
"require 'base64'"& "\n" &
"require 'cgi'"& "\n" &
"require 'net/http'" & "\n" &
"gmt = DateTime.now.new_offset.strftime('%Y-%m-%dT%XZ')"& "\n" &
"key = '" & AWS::SecretKey & "'" & "\n" &
"req = ["& "\n" &
"'AWSAccessKeyId=" & AWS::AccessKey & "', "& "\n" &
"'AssociateTag=tezutaku-22', "& "\n" &
"'ItemId=" & AWS::ASIN & "',"& "\n" &
"'Operation=ItemLookup',"& "\n" &
"'ResponseGroup=Medium',"& "\n" &
"'Service=AWSECommerceService',"& "\n" &
"'Timestamp=' + CGI.escape(gmt),"& "\n" &
"'Version=2011-08-01'].join('&')"& "\n" &
"message = ['GET', 'ecs.amazonaws.jp', '/onca/xml', req].join('"& "\n" &
"')"& "\n" &
"hash = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA256.new, key, message)"& "\n" &
"sig = CGI.escape(Base64.encode64(hash).chomp)"& "\n" &
"address = 'ecs.amazonaws.jp'" & "\n" &
"path = '/onca/xml?' + req + '&Signature=' + sig" & "\n" &
"body = Net::HTTP.get( address , path )" & "\n" &
"print body" & "\n" & "\"¶" &
"do shell script \"/usr/bin/ruby -e \" & quoted form of aCode" & "¶" &
"set aXML to result" & "¶" &
"tell application \"FileMaker Pro Advanced\" " & "¶" &
" set cell \"XML\" of current record to aXML " & "¶" &
"end tell"
最終の「set cell \”XML\” of current record to aXML」でXMLデータがXMLフィールドに入ります。
このデータを一旦エクスポートして、改めてインポートするという処理を行っています。
■エクスポート:
XMLフィールドをtemp.xmlというファイルでDBフォルダに保存
■インポート:
データソースを「XMLデータ」にして「temp.xml」を指定。別途作成したXSLスタイルシートを使用してインポートを実行します。
XSLスタイルシートは、取り込む項目に応じて記述します。
利用しているのはこんな感じ。
取り込むフィールド名を
のように記述して、それに対応したAmazonデータの項目名を
記述するという形式です。
これでスクリプトを実行するだけで、AmazonのASINやSBN-10:を[AWS::ASIN]フィールドに入力するだけで、書誌データを登録できるようになりました。
ただ、EANを指定しての取込がなぜかうまく動作していません。
EANを指定するためには、req[]内に、IdTypeにEANを指定してSearchIndex=Allにすれば良いとマニュアルに記載されているのですが、正常に取り込めないです。
Amazonで配布されているマニュアルに記載のテストページでクエリURL生成してもダメなんで原因わからず。マニュアルには「EANでは正常に取り込めないばあいがあります」とか記載してあるし・・・
とりあえず、本のカテゴリに関してはISBN-10で取り込めるので、利用はできるのですが。他のカテゴリでもAmazonのASINコードで取り込むことはできますが、製品についているJANコードで指定したいですからね。これは、また調べてみよう。
[2015.3.29追記]
作成したスクリプトを利用してiPhone上のFileMaker GOでバーコードをスキャンして書誌データ登録できるようにしました。とっても便利。