GoogleのISBN検索結果から著者名とタイトルを取得するブックマークレット GetAuthorTitle

#1. はじめに

ISBNから著者名とタイトルを取得したいと思いましたが、Amazonは自動取得禁止、APIを利用すべしとのことですが、APIを使うのはアフィリエイト申請したりと大変そう(アフィリエイトサイトが必要？)。
自動でGoogle検索してその結果から取得も考えましたが、Googleも自動でクエリを投げるのは禁止です。
それならば、Google検索は人手で行い、検索結果から著者名とタイトルを見つけるところだけ
ブックマークレットにすればよいと考えました。

国立国会図書館オンライン版も作成しました。Google版と比べて長い著者名でも省略されませんが、マイナーな本が検索に引っかかりません。
[国立国会図書館オンラインのISBN検索結果から著者名とタイトルを取得するブックマークレット GetAuthorTitleNDL - Qiita](https://qiita.com/mayo00/items/0f3e57b76c3df5fcd04b)

あまり省力化できませんが同人誌用も作成しました。
[駿河屋の商品ページまたは買取商品ページから同人誌のサークル名とタイトルを取得するブックマークレット GetCircleTitle - Qiita](https://qiita.com/mayo00/items/556c2c3d7a14759d088f)

![GetAuthorTitle_kimetsu2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/2f9cfd3d-ad8f-ee1b-4c89-525cb0563f6f.png)

#2. ソース

ブックマークレット用1行版

```GetAuthorTitle.js
javascript:(function(){/*v1.09*/var i,div,a,h3,s1,sa="",st="",s="";for(i=0;div=document.getElementsByTagName("div")[i];i++){if(div.className=='g'){a=div.getElementsByTagName("a")[0];if(a.href.startsWith("https://adultcomic.dbsearch.net")){h3=div.getElementsByTagName("h3")[0];s1=/^(.+)：(.+)｜/.exec(h3.textContent);if(s1!==null){if(st==""||sa==""){st=s1[1];sa=s1[2];s="["+sa+"]%20"+st;continue;}}s1=/^(.+)：(.+)$/.exec(h3.textContent);if(s1!==null){if(st==""||sa==""){st=s1[1];sa=s1[2];s="["+sa+"]%20"+st;continue;}}}}};for(i=0;div=document.getElementsByTagName("div")[i];i++){if(div.className=='g'){a=div.getElementsByTagName("a")[0];if(a.href.startsWith("https://www.kinokuniya.co.jp")){h3=div.getElementsByTagName("h3")[0];s1=/(.+)\s*\/\s*(.+)\s+-/.exec(h3.textContent);if(s1!==null){if(st==""||sa==""){st=s1[1];sa=s1[2];s="["+sa+"]%20"+st;continue;}}}}}for(i=0;div=document.getElementsByTagName("div")[i];i++){if(div.className=='g'){a=div.getElementsByTagName("a")[0];if(a.href.startsWith("https://www.animate-onlineshop.jp")){h3=div.getElementsByTagName("h3")[0];s1=/】(.*)\(著:(.*)\)/.exec(h3.textContent);if(s1!==null){if(st==""||sa==""){st=s1[1];sa=s1[2];s="["+sa+"]%20"+st;continue;}}}}}for(i=0;div=document.getElementsByTagName("div")[i];i++){if(div.className=='g'){a=div.getElementsByTagName("a")[0];if(a.href.startsWith("https://shop.tsutaya.co.jp")||a.href.startsWith("http://shop.tsutaya.co.jp")||a.href.startsWith("http://sp.shop.tsutaya.co.jp")){h3=div.getElementsByTagName("h3")[0];s1=/^(.*)\/([^\s]*)\s/.exec(h3.textContent);if(s1!==null){if(st==""||sa==""){st=s1[1];sa=s1[2];s="["+sa+"]%20"+st;continue;}}}}}for(i=0;div=document.getElementsByTagName("div")[i];i++){if(div.className=='g'){a=div.getElementsByTagName("a")[0];if(a.href.startsWith("https://books.rakuten.co.jp")){h3=div.getElementsByTagName("h3")[0];s1=/([^-]+)-([^-]+)-/.exec(h3.textContent);if(s1!==null){if(st==""||sa==""){st=s1[1].trim();sa=s1[2].trim();s="["+sa+"]%20"+st;}continue;}s1=/楽天ブックス:([^-]+)-/.exec(h3.textContent);if(s1!==null){if(st==""||sa==""){st=s1[1].trim();s="[]%20"+st;continue;}}s1=/([^-]+)（/.exec(h3.textContent);if(s1!==null){if(st==""||sa==""){st=s1[1].trim();s="[]%20"+st;continue;}}}}};if(s==""){alert("none")}else{if(navigator.clipboard){navigator.clipboard.writeText(s).then(()=>alert(s),()=>alert(s+"%20をクリップボードにコピーできませんでした。"))}}})()```

整形版

```GetAuthorTitle.js
javascript:(function(){
  /* v1.09 */
  var i, div, a, h3, s1, sa="", st="", s="";
  for (i = 0; div=document.getElementsByTagName("div")[i]; i++) {
    if (div.className == 'g') {
      a = div.getElementsByTagName("a")[0];
      if (a.href.startsWith("https://adultcomic.dbsearch.net")) {
        h3 = div.getElementsByTagName("h3")[0];
        s1 = /^(.+)：(.+)｜/.exec(h3.textContent);
        if (s1 !== null) {
          if (st == "" || sa == "") {
            st = s1[1];
            sa = s1[2];
            s = "[" + sa + "]%20" + st;
            continue;
          }
        }
        s1 = /^(.+)：(.+)$/.exec(h3.textContent);
        if (s1 !== null) {
          if (st == "" || sa == "") {
            st = s1[1];
            sa = s1[2];
            s = "[" + sa + "]%20" + st;
            continue;
          }
        }
      }
    }
  };
  for (i = 0; div=document.getElementsByTagName("div")[i]; i++) {
    if (div.className == 'g') {
      a = div.getElementsByTagName("a")[0];
      if (a.href.startsWith("https://www.kinokuniya.co.jp")) {
        h3 = div.getElementsByTagName("h3")[0];
        s1 = /(.+)\/([^-]+)-/.exec(h3.textContent);
        if (s1 !== null) {
          if (st == "" || sa == "") {
            st = s1[1].trim();
            sa = s1[2].trim();
            s = "[" + sa + "]%20" + st;
            continue;
          }
        }
        s1 = /(.+)\/([^-]+)/.exec(h3.textContent);
        if (s1 !== null) {
          if (st == "" || sa == "") {
            st = s1[1].trim();
            sa = s1[2].trim();
            s = "[" + sa + "]%20" + st;
            continue;
          }
        }
      }
    }
  }
  for (i = 0; div=document.getElementsByTagName("div")[i]; i++) {
    if (div.className == 'g') {
      a = div.getElementsByTagName("a")[0];
      if (a.href.startsWith("https://www.animate-onlineshop.jp")) {
        h3 = div.getElementsByTagName("h3")[0];
        s1 = /】(.*)\(著:(.*)\)/.exec(h3.textContent);
        if (s1 !== null) {
          if (st == "" || sa == "") {
            st = s1[1];
            sa = s1[2];
            s = "[" + sa + "]%20" + st;
            continue;
          }
        }
      }
    }
  }
  for (i = 0; div=document.getElementsByTagName("div")[i]; i++) {
    if (div.className == 'g') {
      a = div.getElementsByTagName("a")[0];
      if (a.href.startsWith("https://shop.tsutaya.co.jp") || a.href.startsWith("http://shop.tsutaya.co.jp") || a.href.startsWith("http://sp.shop.tsutaya.co.jp")) {
        h3 = div.getElementsByTagName("h3")[0];
        s1 = /^(.*)\/([^\s]*)\s/.exec(h3.textContent);
        if (s1 !== null) {
          if (st == "" || sa == "") {
            st = s1[1];
            sa = s1[2];
            s = "[" + sa + "]%20" + st;
            continue;
          }
        }
      }
    }
  }
  for (i = 0; div=document.getElementsByTagName("div")[i]; i++) {
    if (div.className == 'g') {
      a = div.getElementsByTagName("a")[0];
      if (a.href.startsWith("https://books.rakuten.co.jp")) {
        h3 = div.getElementsByTagName("h3")[0];
        s1 = /([^-]+)-([^-]+)-/.exec(h3.textContent);
        if (s1 !== null) {
          if (st == "" || sa == "") {
            st = s1[1].trim();
            sa = s1[2].trim();
            s = "[" + sa + "]%20" + st;
          }
          continue;
        }
        s1 = /楽天ブックス: ([^-]+)-/.exec(h3.textContent);
        if (s1 !== null) {
          if (st == "" || sa == "") {
            st = s1[1].trim();
            s = "[]%20" + st;
            continue;
          }
        }
        s1 = /([^-]+)（/.exec(h3.textContent);
        if (s1 !== null) {
          if (st == "" || sa == "") {
            st = s1[1].trim();
            s = "[]%20" + st;
            continue;
          }
        }
      }
    }
  };
  if(s == "") {
    alert("none")
  } else {
    if(navigator.clipboard) {
      navigator.clipboard.writeText(s).then(
        ()=>alert(s),
        ()=>alert(s + "%20をクリップボードにコピーできませんでした。")
      )
    }
  }
})()
```

#3. 使用方法

まずブックマークレットとしてブラウザのお気に入りに登録して下さい。

GoogleでISBNで検索し、結果が表示されたらブックマークレットを実行して下さい。
「[著者名] タイトル」の形でアラートを表示しつつクリップボードにコピーされます。
どのサイトも引っかからない場合、「none」とアラートを表示します。
どうしても引っかからない場合、「紀伊國屋書店 ISBN」等で検索すると、引っかかるかもしれません。

#4. 解説

Google検索結果内のサイトに合わせて著者名とタイトルを正規表現で取得します。
現在5サイト登録しています。

タイトルと著者名が長いと、Google検索結果が「...」で省略されて、そのまま出力されてしまいます。

Windows 10＋Google Chrome 92で動作確認しています。

#5. 改版履歴

2022/01/03 v1.09 クリップボードにコピーされなくなっていたのを修正。(Promiseを受けていなかったのを修正)
2021/08/04 v1.08 紀伊國屋書店で著者名の途中から省略されている場合に、タイトルと省略著者名を取得するように変更。蔦屋のスマートフォン向けサイトを追加。
2021/08/04 v1.07 一部上書きが残っていたのと処理順が違っていた部分を修正。
2021/08/04 v1.06 楽天ブックス対応。著者名がない結果で上書きしないように変更。サイト記述順に全検索結果を確認するように変更。バージョン番号コメントを追加。
2021/08/04 v1.05 蔦屋のhttp対応、著者名にジャンルが入るのを除去。
2021/08/04 v1.04 紀伊國屋書店で著者名の最後に半角スペースが入るのを修正。
2021/08/04 v1.03 v1.02で見つけたら処理を打ち切るようにしていたのを、打ち切らずに最後まで行うように変更。
2021/08/04 v1.02 MAMGA-DBで著者名の途中から省略されている場合に、タイトルと省略著者名を取得するように変更。
2021/08/04 v1.01 紀伊國屋書店の取得方法を変更
2021/08/04 v1.00 初版

#6. 参考

[JAVASCRIPT::BOOKMARKLET](http://bookmarklet.daa.jp/) Google検索結果の番号表示