Tombloo の「Amazon タイトル問題」を直すパッチ
現在、Tombloo で Amazon の商品を Postすると、タイトルが異常になります。
この問題を解決するパッチを書きました。次のページにある「raw」からインストールできます。
tombloo.service.extractors.amazon.extract.js – GitHub
パッチのインストール方法などは、下のページをご覧ください。ここのページにあるパッチも必携ですよ!
Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体
お困りの方は お試しくださいね。
──で終わりたいところですが、以下、メンドウな説明書きが続きます……。
(この記事を書き上げる直前に気がつきました。今回のパッチは Amazon.co.jp でしか動作を確認していません! もう疲れ切ったので、あとは だれか たのむ)
その原因は?
問題となっているのは、/chrome/content/library/31_Tombloo.Service.extractors.js の下記の部分ですね。
ctx.title = 'Amazon: ' + $x('id("prodImage")/@alt') + ': ' + ctx.document.title.split(/[::] */).slice(-2).shift();
これを日本語に訳すと、「特定の画像 (id="prodImage"
) の説明 (alt
) から商品名を、ページのタイトルから著作者名を、それぞれ取得する」といったところでしょうか。ほとんどの書籍では大丈夫なのですが──、
下記の場面で問題が起こります。
prodImage
という ID を持たないページ- 著書名などの情報がない商品(衣服・家電)
- 名前に「:」が付く著者(これは いま考えた)
具体的に例を挙げると、リボルテック ダンボー・ミニ Amazon.co.jpボックスバージョン では商品名が二重になり、OLYMPUS マイクロ一眼 PEN E-PL2 では 商品名の前に undefined が付きます。
解決方法を探す
ページ・タイトルから著作者の情報を取り出すのはキケンそうなので、ページの内容から取得するのはどうか? ある書籍のページでは、下のような構造になっています。
<div class="buying">
<h1 class="parseasinTitle">
<span id="btAsinTitle">{ 本のタイトル }<span style="/* ... */">[コミック]</span></span> <!--aoeui-->
</h1>
<a href="/s/ref=...">{ 著作者 }</a> <span class="byLinePipe">(著)</span>
<br>
</div>
──肝心の著作者名だけが class も ID も指定されていないという、これは素晴らしい HTML ですね! 設計者と一緒に、楽しく酒を飲みに行きたいところです(無礼講の場で──何をするつもり!?)。
おかげで慣れない Xpath 式を何度も試行錯誤しながら、なんとか精度の高いパッチができました。
幸いなことに、衣服や家電などは上とは違う HTML 構造のため、メーカ名が二重になったりは しません(確認した限りでは)。
ここまでやったら、[コミック] とか [ムック] といったメディア名を取り除きたくなりますが、誤爆が多そう([] や : のついたタイトル)なので、それはまた来世で……。
余談
上で例に挙げたカメラや、靴などの商品は、画像にカーソルを載せると拡大画像が表示されます。それはそれでステキですが、そのせいで HTML が何種類も存在する。Tombloo の「Amazon – Photo」が動作しないページも増えてきました。
この問題を解決するパッチも、いま書いているところです。なんとか多くの商品に対応できそうですが、きっとまた、ページのレイアウトが変わるのだろうな……。