0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

#まえがき

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

#説明

その成果がこちらです。

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/

0
2
0

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
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?