Amazonへのリンクの設定

このblogでも、あるいはそれ以外のこのサイトのコンテンツでも、書籍を参照する際にはAmazon.co.jpへのリンクを張っている。詳細なデータは書いてあるし、必要ならばそのまま注文できるし、便利であろうという思うので。まぁありがちな選択ではある。

で、bloggerたちはこういう作業を自動化するためにプラグインを開発していたりもするわけで、そのあたりの設定を本日行ったのでメモしておく。

目標はHyperNikkiSystem 用 ISBN タグ拡張リリースの様に、asinを指定するだけでamazonから情報を引っ張ってきて表示すること。

Amazonアソシエイトプログラムに登録

これは、こちらから張ったAmazonへのリンクによって売り上げがあった場合数パーセントの紹介料を貰えるというもの。まぁ、購入者の方に損させるわけじゃなし、どうせリンクを張るなら幾らかでも稼げる可能性がある形にしておきましょう、ということ。

セキュリティ周りの設定でも悪いのか、スクリプトにブラウザ依存があるのか知らないけれど、私の愛用のOperaではうまく登録できなかった。仕方なく、IEでやり直す。

一度登録した後、リンク生成などのサービスを利用するのはOperaでもできる模様。

MTAmazonのインストール

Movable Typeで、Amazon Web Serviceを利用するプラグイン

Alterate MTAmazonで上書き。

これはMTAmazonのi18namazon.comではなくて、amazon.co.jpに繋ぐにはこれが必要。

Amazon Web Service用ディベロッパー・トークンを取得

MTAmazonを利用するには自分用のディベロッパトークンが必要となるので、登録する。どのみち英語サイトで登録しなければならないので、http://www.amazon.com/gp/aws/registration/registration-form.htmlに直行するのが早い。

MTMacroをインストール

MovableTypeでテンプレート内でマクロを定義できるプラグイン。日本語資料としてMovableType/MTMacroを参照した。

マクロを設定

以上の各資料とAmazonアソシエイトプログラムとWebサービスを参考にしながらマクロを定義した。次のような感じのマクロを、MovableTypeのテンプレート・モジュールとして作成した。マクロ展開が必要な各テンプレートからは<$MTInclude$>を使って取り込む。

<MTMacroDefine name="amazon" ctag="amazon">
 <MTAmazon method="Asin" search="[MTMacroAttr name='asin']" locale="jp" debug="1">
  <div class="amazon">
   <h4 class="amazonImage">
    <a href="<MTAmazonLink>">
     <img src="<MTAmazonImage>" alt="" /><br />
     <MTMacroContent default="[MTAmazonTitle]">
    </a>
   </h4>
   <dl compact="compact" class="amazonInfo">
    <dt>著者:</dt><dd><MTAmazonAuthor glue=","></dd>
    <dt>出版社:</dt><dd><MTAmazonManufacturer></dd>
    <dt>ISBN:</dt><dd><MTAmazonASIN></dd>
    <dt>発行日:</dt><dd><MTAmazonReleaseDate></dd>
    <dt>定価:</dt><dd><MTAmazonListPrice></dd>
    <dt>アマゾン価格:</dt><dd><MTAmazonSalePrice></dd>
    <dt>発送可能時期:</dt><dd><MTAmazonField name="Availability"></dd>
    <dt>アマゾンから情報をダウンロードした時刻</dt><dd><MTAmazonCacheDateTime format="%x %X"></dd>
   </dl>
  </div>
 </MTAmazon>
</MTMacroDefine>
テスト

ここでテストしてみたが、この段階で3つミスをしていて躓いた。

  1. XML::Simpleがインストールされていなかった
  2. キャッシュ保存用のディレクトリを用意しておかなかったせいで open()に失敗していた
  3. 一部のテンプレートに肝心の <MTMacroApply> , </MTMacroApply>を書き忘れた。この開始/終了タグの内側でのみ、マクロ展開が有効になる。

エラーログを出すプラグインとか、探せばありそうだけれど直ぐには見つからなかったので、直接libs/MT/ErrorHandler.pmを触ってログファイルを生成するようにしてみた。ついつい調子に乗って、log4j風なメソッドを定義してみたけど、これ真面目にライブラリ化したら面白いかな……。log4mtとか。

EUCへの対応。

このサイトはEUC-JPで出力しているのにMTAmazonはUTF-8で出力するので激しく化けた。

extlib/MTPlugins/MTAmazon.pmの各メソッドの返り値にJcode.pmの変換を施して対処した(MTAmazon.pm)。とりあえずうちのサイトで動けばいいやっていうことで、エラー処理やら日本語以外のロケールの処理やらがいい加減なので、使う方は気を付けて下さい。オリジナルは2.22a04です。

mt-sukeroku-plus.plの対応

普段はmt-sukeroku-plus.plによるYukiWikiマークアップを主に使っているので、こちらからもAmazon参照ができるように改造した。元々、Amazonへのリンクを張るだけなら &amazon() でできるのだけど、上で定義したマクロを利用したかったので、<amazon asin="XXX">YYY</amazon>という形に出力する &amazon2() を定義した。これは $func_inlineLinkAnother に代入されている無名関数(259行目あたり)に次の条件マップを足しただけ。


($pluginName eq 'amazon2')  ? qq(<amazon asin="$pluginParam[0]">$pluginParam[1]</amazon>) : 

&amazon2()は第1引数にASINまたはISBNを、第2引数にリンク文字列を指定する。標準の&link()と引数の順序が逆なのがアレだけど、第2引数を省略可能にしたかったのでしょうがない。第2引数を省略すると自動的にASINを元にAmazonから引っ張ってきた書籍名を使用する。