search
LoginSignup
2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

Amazonで本の目次を確認するブックマークレット【2020年版】

まえがき

少し前、とある事情で療養中のこと。
ツイッターを見ていると、アマゾンで目次を読むことが出来ないというツイートを目にしました。
以前はどうだったのか記憶が定かではありませんが、仕様が変更になったようです。
そこで、ブックマークレットを用いて簡単に目次(内容紹介)を確認できる方法を探りました。

説明

その成果がこちらです。

z_contents.js
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)を提供しています。これを利用しました。

alert_z_contents.min.js
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("目次は見つかりませんでした。")})})();

上記のコードは以下のコードを短縮したものです。

alert_z_contents.js
(()=>{
    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/

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2
Help us understand the problem. What are the problem?