Amazonの商品ページリンクの構成
Amazonの商品URIは「Amazon共通のURI」+「ASINコード」です。
このうち、書籍(紙の本)のASINコードは「『10桁の』ISBNコード」と等価です。
ISBNコードについて
ISBNコードはかつて10桁でしたが、2007年1月1日より13桁に変更されました。
よって、最近の販売されている本は全て13桁となっています。
このことから、13桁を10桁に変更する必要があります。
ISBNコードの構成
13桁(現行規格)
(上位3桁:接頭記号)+(9桁:書籍)+(1桁:チェックデジット)
10桁(旧規格)
(9桁:書籍)+(1桁:チェックデジット)
9桁部分は、実際の規格ではグループ記号だとか色々と分かれていますが、旧規格・現行規格ともに共通です(洋書はよくわからない)。
但し、チェックデジットは異なります。
つまり「接頭記号を外してチェックデジットを再計算して入れ替える」ことで13桁から10桁に変換できます。
チェックデジットの計算方法
10桁(モジュラス11 ウェイト10-2)
左から計9桁で操作。
- 左の桁から順に10,9,8,と掛けていき総和を取る。
- 総和を11で割り、出た余りを11から引く。
- 出た答えが10ならX、11なら0、それ以外はそのままでチェックデジット。
13桁(モジュラス10 ウェイト3・1)
左から計12桁で操作。
- 奇数桁、偶数桁を各々で総和をとる。
- 偶数桁の総和に対し、偶数桁に3を掛けた値を加える。
- 得られた値を10で割り、出た余りを10から引く。
- 出た答えが10なら0、それ以外はそのままでチェックデジット。
コード
- 下記のコードは13桁の誤りをチェックした上で10桁に変換しています。
- 誤りがある場合、falseを返します。
- リンク生成用に呼び出す関数として書いています。
- id は 13桁のISBNコード。
JavaScript
BOOK.isbn = function (id) {
'use strict';
var a, b, c, i;
if (id.length === 13) {
a = 0;
b = 0;
for (i = 0; i < 6; i = i + 1) {
a += Number(id.charAt(i * 2));
b += Number(id.charAt(i * 2 + 1));
}
c = (a + b * 3) % 10;
if (c === 10) {
c = 0;
}
if (c === Number(id.charAt(12))) {
c = 0;
id = id.slice(3, 12);
for (i = 0; i < 10; i = i + 1) {
c += Number(id.charAt(i)) * (10 - i);
}
c = 11 - c % 11;
if (c === 10) {
c = 'X';
} else {
if (c === 11) {
c = 0;
}
}
id = id + String(c);
return String('http://www.amazon.co.jp/dp/' + id + '/');
}
return false;
}
return false;
};