#まえがき
少し前、とある事情で療養中のこと。
ツイッターを見ていると、アマゾンで目次を読むことが出来ないというツイートを目にしました。
以前はどうだったのか記憶が定かではありませんが、仕様が変更になったようです。
そこで、ブックマークレットを用いて簡単に目次(内容紹介)を確認できる方法を探りました。
#説明
その成果がこちらです。
javascript:location.href='https://www.hanmoto.com/bd/isbn/'+document.querySelector('link[rel="canonical"]').href.split('/').pop();
アマゾンの書籍ページには、
<link rel="canonical" href="https://www.amazon.co.jp/title/dp/ISBN">
という形式でURLが記述されているので、ここからISBNを取得します。それをもとに版元ドットコム(本の情報サービス)のサイトを開きます。これでOK。
何の問題もありませんが、単純過ぎてつまらないのでページ遷移がないタイプもつくりました。次のコードです。
fetchを使い、非同期的にデータをやり取りするやつです。
版元ドットコムは、カーリル(図書館の蔵書検索サービス)とともに書誌情報API(openBD)を提供しています。これを利用しました。
javascript:(()=>{const e=document.querySelector('link[rel="canonical"]').href.split("/").pop();fetch("https://api.openbd.jp/v1/get?isbn="+e).then(e=>e.json()).then(e=>{let t=!1;if(null!==e[0]){const n=e[0].onix.CollateralDetail;Object.keys(n).length>0&&Object.keys(n.TextContent).length>0&&(alert(n.TextContent.pop().Text),t=!0)}t||alert("目次は見つかりませんでした。")})})();
上記のコードは以下のコードを短縮したものです。
(()=>{
const asin = document.querySelector('link[rel="canonical"]').href.split('/').pop();
fetch('https://api.openbd.jp/v1/get?isbn=' + asin)
.then(response => response.json())
.then(data => {
let c_flag = false;
if (data[0] !== null) {
const d = data[0].onix.CollateralDetail;
if (Object.keys(d).length > 0) {
if (Object.keys(d.TextContent).length > 0) {
alert(d.TextContent.pop().Text);
c_flag = true;
}
}
}
if (!c_flag) alert('目次は見つかりませんでした。');
});
})();
openBDから返ってくるJSONの構造に注意しながら、必要なデータがカラでないことを確認して目的の値を取得します。
#注意点
- openBDに、すべての書籍が登録されているわけではありません。
- 目次といっても、ページ数を明記していないことがあります。
- iPhone版Chromeでは、alertが縦に長くなると、OKボタンをタップしづらいです。また、ブラウザによっては、alertで表示できる文字数に上限があります。気になるなら、alertを次のような感じに置き換えるといいです。
document.body.innerHTML = d.TextContent.pop().Text.replace(/\n/g, '<br>');
document.body.style.padding = '10px';
#あとがき
たくさんの情報を得られる、1つ目のブックマークレットをおすすめします。
openBDについては、他にも面白いことが出来そうです。
本日もありがとうございました。
#参考
お世話になりました。
https://togetter.com/li/1587135
https://www.hanmoto.com
https://openbd.jp
https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch
https://javascript-minifier.com/