imayomi: 2008年6月アーカイブ
やっぱりブログパーツはFlashで作るべきかなどと書いておいてナンですが、iframeを使うと、なかなか安定したブログパーツが出来たのでリリースします。
まず第一弾はサイドバー用に、最近、今読ミでチェックした本が1〜5冊表示されるブログパーツです。
←このサイドバーにありますよ(・∀・)
今読ミにログインして、右上の「■ブログパーツ」リンクからどうぞ。
今読ミで著者の表示がおかしい事があるという件ですが、現象は分かりました。
今読ミでAmazonを検索する箇所は2カ所存在します。
- 「本を登録」ページで検索
- 自分の「ホーム」ページでISBNを入力
この二つはISBNを入力する場合、同じ動きをし、内部的にAmazon APIのItemLookupというリクエストを送ります。 対して前者でISBN以外を指定した場合はItemSearchというリクエストを送ります。
問題の「アンナ・カレーニナ (上巻)(ISBN 9784102060018)」をそれぞれ二つの方法で検索するプログラムを書いて、著者に関する情報がどういう風に返ってくるのか確かめてみます。
※コードは分かり易さ優先で愚直に書いてます
require 'net/http'
require 'cgi'
require 'rexml/document'
h = {
:Service => 'AWSECommerceService',
:AWSAccessKeyId => 'XXXXXXXXXXXXXXXXXXXX',
:Version => '2008-04-07',
:AssociateTag => 'imayomi-22',
:ResponseGroup => 'Medium',
:SearchIndex => 'Books',
:ItemPage => 1,
:Operation => 'ItemLookup',
:IdType => 'ISBN',
:ItemId => '9784102060018',
#:Operation => 'ItemSearch',
#:Title => 'アンナ・カレーニナ (上巻)',
}
arr = []
h.each do |key,val|
arr << key.to_s + "=" + CGI::escape(val.to_s)
end
paramString = arr.join('&')
url = URI.parse("http://webservices.amazon.co.jp/onca/xml?" + paramString)
xml = Net::HTTP.get(url)
doc = REXML::Document.new(xml)
doc.get_elements("ItemLookupResponse/Items/Item").each do |elm|
#doc.get_elements("ItemSearchResponse/Items/Item").each do |elm|
puts '[' + elm.text('ItemAttributes/Title') + ']'
puts ' ---Author'
elm.get_elements('ItemAttributes/Author').each do |author|
puts ' ' + author.to_s
end
puts ' ---Creator'
elm.get_elements('ItemAttributes/Creator').each do |creator|
puts ' ' + creator.to_s
end
end
まずはISBN指定のItemLookupResponseの場合。
[アンナ・カレーニナ (上巻) (新潮文庫)] ---Author <Author>トルストイ</Author> <Author>木村 浩</Author> ---Creator
著者と翻訳者が、この順番で返って来ます。今読ミは最初に返って来たAuthorタグを著者として(実は勝手に解釈して)扱うので、正しく表示されます。また、Creatorタグの情報は送られて来ません。
ところが書名を入力してItemSearchを実行してみると…
※前述プログラムの13〜15行目、28行目をコメントアウト、17〜18行目、29行目のコメントアウトを外します。
[アンナ・カレーニナ (上巻) (新潮文庫)] ---Author <Author>木村 浩</Author> <Author>トルストイ</Author> ---Creator <Creator Role='著'>トルストイ</Creator> [アンナ・カレーニナ〈上巻〉 (1968年) (角川文庫)] ---Author <Author>トルストイ</Author> ---Creator <Creator Role='著'>トルストイ</Creator> [アンナ・カレーニナ 上巻 縮約版 (1) (新潮カセットブック T- 5-1)] ---Author <Author>トルストイ</Author> ---Creator <Creator Role='著'>トルストイ</Creator> <Creator Role='翻訳'>木村 浩</Creator> [アンナ・カレーニナ〈上巻〉 (1948年)] ---Author <Author>レフ・トルストイ</Author> ---Creator <Creator Role='著'>レフ・トルストイ</Creator> <Creator Role='翻訳'>中村 白葉</Creator>
今度は検索なので複数データが送られて来ます。対象のデータは最初の [アンナ・カレーニナ (上巻) (新潮文庫)] のブロックですが、なぜか翻訳者が先に来ています。なので今読ミは最初のAuthorである「木村 浩」を著者として採用していたのでした。
今読ミで本を登録する場合、自分もですが、最も良く使うのは「本を登録」ページから書名の一部や著者名での検索結果から選択でしょうから、これは問題がありますね。
検索の場合、Creatorタグの情報も送られて来ていて、この例だけですと著者が先に来るので使えそうな雰囲気ですが、たまたまかも知れません。Amazonのページでは、CreatorをRole情報付きで全て表示しているように見えるので、順番に依存せず使うのが正しいのだと思います。
しかし今読ミは今のところ本1冊につき著者1名しか登録できない内部構造になっていて、誰か一人を選ばないといけない。
実験結果からすると当面の暫定対策としては、
- ItemLookupではCreatorが送られてこないがAuthorの順序が正しそうなのでそのまま
- ItemSearchの場合はCreatorの最初(本当はRole=’著’なんだろうが属性値がイマイチ信用できないので)のデータ を採用
するように変更しようと思います。
ItemLookupでCreator情報がなぜ取れないのだろう?これが取れれば、共著の本など一人に決められない事もあるので、複数の著者や翻訳者などを扱える様にし易いのだけど。もう一度APIリファレンスを読んでみる必要があるかも。
(ブログパーツ・Flashで作り直し中であります…)
これ、なんだかおかしいですね。
私はまだ読んでいませんが、これはトルストイ。トルストイ著。
う〜む、著者に翻訳者が表示されている(´・ω・`)
Amazon APIで著者の取り方を少し間違っているクサイ。
バグリストに登録するのであります。
追記
作成中の今読ミのブログパーツ、JavaScriptだとブラウザの互換性や、ブログシステムによっては設置が難しかったり、そもそも設置できなかったりと制約が多い。
それでも概ね出来たと思っていたのですが、サイトのプログラムと違って、ブログパーツの場合、何かバグがあった場合、ブログオーナーに迷惑をかけてしまうので、なかなかリリースしても大丈夫という気になれない。
色々と他のサイトのブログパーツを見てみても、多くはFlashで出来ていている。 動くパーツを作り易いのが一番の理由だと思うが、やはり安定性と自分で色々なプラットフォームに対応させなくても良いところが魅力的だ。
そんなわけでJavaScript版はしばらく寝かせておいて、Flex Builder 3の評価版でちょっとやってみようかと思います。Flashは初めてですが、まぁなんとかなるでしょう。
試用期間の間になんとか判断できるところまで進めるつもりです。良かったら買い。

