応急処置:内容紹介込みでAmazon書籍ページをScrapboxに取り込むブックマークレット 2020年10月版

応急処置:内容紹介込みでAmazon書籍ページをScrapboxに取り込むブックマークレット 2020年10月版のサムネイル

読んだ本の記録にScrapboxを使用しています。Amazon書籍ページを内容紹介(=目次)込みでScrapboxに取り込むことができるブックマークレットを愛用していたのですが、いつの間にか動かなくなっていました。

付け焼き刃ではあるものの、なんとか修正することができたので、応急処置用として記録します。

2020/10/28 追記

Twitterにて『うまく取り込めない』とあったので確認したところ、公開初期のコードは、Google Chromeの場合、タイトル取得の際に無駄な改行コードを拾ってきてしまい、うまくScrapboxへ送ることができないという不具合がありました。そのため、該当箇所を修正し、10/28に再公開いたしました。当環境ではGoogle Chrome、Firefox、Vivaldiにて動作することを確認済です。

当方、Firefox、Vivaldiを利用しており、同じエンジンを積んでいるVivaldiで動くなら大丈夫だろうと、Google Chromeでの確認を怠ってしまっていました。応急処置とはいえあってはならないことです。本当に申し訳ありませんでした。

なお、同日の時点で、元コードの作者の方が更新版のブックマークレットを公開してくださっています。

当ページの役目は終わったと考え、冒頭のツイッターアカウントの方とコンタクトを取った後、コードの公開を終了する予定です。参考にしてくださった方、使用してくださった方に感謝いたします。また、試して使えなかった方に改めて謝罪いたします。ありがとうございました、そして、大変申し訳ありませんでした。

参考にしたブックマークレット

修正後のブックマークレット

素人がなんとか動くように改造したものです。このブックマークレットを利用したことで何らかの問題が起こったとしても、作成者であるハドニシは一切責任を負いません。

使い方に関するメモ

  • https://scrapbox.io/projectid/の部分を、使っているプロジェクトのURLと差し替えてご利用ください。
  • Kindle版ページではうまく動かないことがあります。単行本ページでご利用ください。

標準ブックマークレット用

javascript:(function(){var p=document.getElementById("productTitle");if(!p)var p=document.getElementById("ebooksProductTitle");var d=document.getElementById("productDescription");if(!d){var subdoc=document.getElementById("bookDesc_iframe").contentWindow.document;var d1=subdoc.getElementById("iframeContent")}if(!d1)var d1=d.getElementsByClassName("bookDesc_iframe_wrapper")[0];var d2=d1.innerText.replace(/\n/g,'\n>');var title=window.prompt('Scrap "Amazon" to your scrapbox.',p.innerHTML.trim());if(!title)return;title='『'+title+'』';var imagecontainer=document.getElementById("imageBlockContainer");if(!imagecontainer)var imagecontainer=document.getElementById("ebooksImageBlockContainer");let image=imagecontainer.getElementsByTagName("img")[0];let imageurl=image.getAttribute("src");let pub=[];var c=document.getElementsByClassName('author');for(g=0;g<c.length;g++){var at=c[g].innerText.replace(/,/,'');var pu=at.match(/\(.+\)/);var ct=at.replace(/\(.+\)/,'').replace(/ /g,'');pub.push(pu+' ['+ct+']')}var lines='['+imageurl+' '+window.location.href+']\n'+pub.join(' ')+'\n>'+d2+'\n#本';var body=encodeURIComponent(lines);window.open('https://scrapbox.io/projectid/'+encodeURIComponent(title.trim())+'?body='+body)})();

ソースコード

javascript:(function(){
    var p = document.getElementById("productTitle");
    if (!p) var p = document.getElementById("ebooksProductTitle");
    var d = document.getElementById("productDescription");
    if (!d)  {
    	var subdoc = document.getElementById("bookDesc_iframe").contentWindow.document;
    	var d1 = subdoc.getElementById("iframeContent");
    }
    if (!d1) var d1 = d.getElementsByClassName("bookDesc_iframe_wrapper")[0];
    var d2 = d1.innerText.replace(/\n/g,'\n>');
    var title=window.prompt('Scrap "Amazon" to your scrapbox.', p.innerHTML.trim());
    if (!title) return;
    title = '『'+ title +'』';
    var imagecontainer=document.getElementById("imageBlockContainer");
    if (!imagecontainer) var imagecontainer = document.getElementById("ebooksImageBlockContainer");
    let image = imagecontainer.getElementsByTagName("img")[0];
    let imageurl = image.getAttribute("src");
    let pub = [];
  	var c = document.getElementsByClassName('author');
  	for (g = 0; g < c.length ;g++){
  		var at = c[g].innerText.replace(/,/,'');
  		var pu = at.match(/\(.+\)/);
  		var ct = at.replace(/\(.+\)/,'').replace(/ /g,'');
  		pub.push(pu + ' [' + ct + ']');
  	}
  	var lines='['+imageurl+' '+window.location.href+']\n'  + pub.join(' ') + '\n>' + d2 + '\n#本';  
    var body=encodeURIComponent(lines);
    window.open('https://scrapbox.io/projectid/'+encodeURIComponent(title.trim())+'?body='+body)
})();

元のコードから変更したところ

6行目
product-description-iframebookDesc_iframe
7行目
var d = subdoc.getElementById("productDescription");
var d1 = subdoc.getElementById("iframeContent");
8行目と9行目の間
var d1 = d.getElementsByTagName("p")[0];を削除
9行目
if (!d1) var d1 = d.getElementsByClassName("productDescriptionWrapper")[0];
if (!d1) var d1 = d.getElementsByClassName("bookDesc_iframe_wrapper")[0];
11行目(2020/10/28追記)
p.innerHTMLp.innerHTML.trim()

蛇足

Kindle版のみ、『試し読み』アイコンがある場合は書影画像でなくそちらを拾ってきてしまいます。16行目のlet image = imagecontainer.getElementsByTagName("img")[0];の部分をlet image = imagecontainer.getElementsByTagName("img")[1];にすればよさそうだったので、最初に取得した画像URLが『試し読み』アイコンであれば[1]番目をとってくる、という具合に改造したら動きました。知識のある方へのバトンとして、一応書いて残しておきます。

javascript:(function(){
     var p = document.getElementById("productTitle");
     if (!p) var p = document.getElementById("ebooksProductTitle");
     var d = document.getElementById("productDescription");
     if (!d)  {
     	var subdoc = document.getElementById("bookDesc_iframe").contentWindow.document;
     	var d1 = subdoc.getElementById("iframeContent");
     }
     if (!d1) var d1 = d.getElementsByClassName("bookDesc_iframe_wrapper")[0];
     var d2 = d1.innerText.replace(/\n/g,'\n>');
     var title=window.prompt('Scrap "Amazon" to your scrapbox.', p.innerHTML.trim());
     if (!title) return;
     title = '『'+ title +'』';
     var imagecontainer=document.getElementById("imageBlockContainer");
     if (!imagecontainer) var imagecontainer = document.getElementById("ebooksImageBlockContainer");
     let image = imagecontainer.getElementsByTagName("img")[0];
     let imageurl = image.getAttribute("src");
     if( ~imageurl.indexOf( 'sitb-sticker-v3' ) ) {
     	image = imagecontainer.getElementsByTagName("img")[1];
     	imageurl = image.getAttribute("src");
     }
     let pub = [];
    var c = document.getElementsByClassName('author');
    	for (g = 0; g < c.length ;g++){
   		var at = c[g].innerText.replace(/,/,'');
   		var pu = at.match(/\(.+\)/);
   		var ct = at.replace(/\(.+\)/,'').replace(/ /g,'');
   		pub.push(pu + ' [' + ct + ']');
   	 }
   	 var lines='['+imageurl+' '+window.location.href+']\n'  + pub.join(' ') + '\n>' + d2 + '\n#本';  
     var body=encodeURIComponent(lines);
     window.open('https://scrapbox.io/projectid/'+encodeURIComponent(title.trim())+'?body='+body)
  })();

『なんか動いた』程度の知識しかないので迷ったのですが、困っているから一時的にでもなんとかしたいという方のために公開することにしました。もしおかしなところがありましたら、ツイッターやコメント欄などでアドバイスいただければと思います。