豆瓣读书助手

为豆瓣读书页面添加亚马逊Kindle、图灵社区、喜马拉雅等链接

当前为 2020-10-08 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name eBooks Assistant
  3. // @name:zh-CN 豆瓣读书助手
  4. // @namespace https://github.com/caspartse/eBooksAssistant
  5. // @version 0.6.0
  6. // @description eBooks Assistant for douban.com
  7. // @description:zh-CN 为豆瓣读书页面添加亚马逊Kindle、图灵社区、喜马拉雅等链接
  8. // @author Caspar Tse
  9. // @license MIT License
  10. // @supportURL https://github.com/caspartse/eBooksAssistant
  11. // @match https://book.douban.com/subject/*
  12. // @require https://cdn.bootcdn.net/ajax/libs/jquery/1.10.0/jquery.min.js
  13. // @connect amazon.cn
  14. // @connect 106.52.138.60
  15. // @grant GM_xmlhttpRequest
  16. // ==/UserScript==
  17.  
  18. (function() {
  19. function queryAmazon(title, isbn) {
  20. GM_xmlhttpRequest({
  21. method: "GET",
  22. url: "https://www.amazon.cn/s?__mk_zh_CN=亚马逊网站&i=digital-text&k=" + isbn + "&ref=nb_sb_noss&url=search-alias%3Ddigital-text",
  23. headers: {
  24. 'User-agent': window.navigator.userAgent,
  25. },
  26. onload: function(responseDetail) {
  27. var doc = responseDetail.responseText;
  28. var errorFlag = /("totalResultCount"\:0)|(在Kindle商店中未找到)/.exec(doc);
  29. if (!errorFlag) {
  30. var regexAmazonUrl = /href="(\S+keywords=\d+[^"]+)"/gi;
  31. var amazonUrl = "https://www.amazon.cn" + regexAmazonUrl.exec(doc)[1];
  32. amazonUrl = amazonUrl.replace(isbn, title);
  33. var partnerTemplate = '';
  34. if ($(".online-partner").length) {
  35. partnerTemplate = '<div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="{templateUrl}"> <img src="https://s1.ax1x.com/2020/10/05/0JbHKI.jpg" width="16" height="16"> <span>Kindle</span> </a> </div>';
  36. $('.online-type[data-ebassistant="read"]').append(partnerTemplate.replace("{templateUrl}", amazonUrl));
  37. } else {
  38. partnerTemplate = '<div class="online-partner"> <div class="online-type" data-ebassistant="read"> <span>在线试读:</span> <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="{templateUrl}" one-link-mark="yes"> <img src="https://s1.ax1x.com/2020/10/05/0JbHKI.jpg" width="16" height="16"> <span>Kindle</span> </a> </div></div> </div>';
  39. $("#link-report").after(partnerTemplate.replace("{templateUrl}", amazonUrl));
  40. }
  41. var regexAmazonPrice = /<span class="a-offscreen">¥([0-9\.]+)<\/span>/gi;
  42. var amazonPrice = regexAmazonPrice.exec(doc)[1];
  43. console.log(amazonPrice);
  44. var buyItemTemplate = '<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="{templateUrl}"> <span style="color:#418FDE;"><img src="https://s1.ax1x.com/2020/10/05/0JbHKI.jpg" style="border-radius: 50%; box-shadow: 0 0 1px 0 rgba(0,0,0,0.6);" width="16" height="16" border="0">&nbsp;Kindle</span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper"> <a target="_blank" href="{templateUrl}"> <span class="buylink-price "> {templatePrice}元 </span> </a> </div> <div class="cell"> <a target="_blank" href="{templateUrl}" class="buy-book-btn e-book-btn"> <span>购买电子书</span> </a> </div> </div> </div> </li>';
  45. if (amazonPrice == 0.00 ) {
  46. buyItemTemplate = '<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="{templateUrl}"> <span > <img alt="Kindle Unlimited" src="https://s1.ax1x.com/2020/10/05/0tmjLn.png" width="75" height="10" border="0"> </span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper"> <a target="_blank" href="{templateUrl}"> <span class="buylink-price "> {templatePrice}元 </span> </a> </div> <div class="cell"> <a target="_blank" href="{templateUrl}" class="buy-book-btn e-book-btn"> <span>购买电子书</span> </a> </div> </div> </div> <div class="more-info"> <span class="buyinfo-promotion">KU可免费借阅</span> </div> </li>';
  47. regexAmazonPrice = /<span dir="auto">或者¥([0-9\.]+)购买<\/span>/gi;
  48. amazonPrice = regexAmazonPrice.exec(doc)[1];
  49. }
  50. buyItemTemplate = buyItemTemplate.replaceAll("{templateUrl}", amazonUrl);
  51. buyItemTemplate = buyItemTemplate.replace("{templatePrice}", amazonPrice);
  52. $("#buyinfo ul:nth-child(2)").prepend(buyItemTemplate);
  53. }
  54. return;
  55. }
  56. });
  57. return;
  58. }
  59.  
  60. function queryTuring(isbn) {
  61. GM_xmlhttpRequest({
  62. method: "GET",
  63. url: "http://106.52.138.60:8081/turing?isbn=" + isbn,
  64. headers: {
  65. 'User-agent': window.navigator.userAgent,
  66. },
  67. onload: function(responseDetail) {
  68. var result = JSON.parse(responseDetail.responseText);
  69. console.log(result);
  70. if (result.errmsg == '') {
  71. var turingUrl = result.data.url;
  72. var turingPrice = result.data.price;
  73. var partnerTemplate = '';
  74. if ($(".online-partner").length) {
  75. partnerTemplate = '<div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="{templateUrl}"> <img src="https://s1.ax1x.com/2020/10/06/0UsLZj.png" width="16" height="16"> <span>图灵社区</span> </a> </div>';
  76. $('.online-type[data-ebassistant="read"]').append(partnerTemplate.replace("{templateUrl}", turingUrl));
  77. } else {
  78. partnerTemplate = '<div class="online-partner"> <div class="online-type" data-ebassistant="read"> <span>在线试读:</span> <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="{templateUrl}" one-link-mark="yes"> <img src="https://s1.ax1x.com/2020/10/06/0UsLZj.png" width="16" height="16"> <span>图灵社区</span> </a> </div></div> </div>';
  79. $("#link-report").after(partnerTemplate.replace("{templateUrl}", turingUrl));
  80. }
  81. var buyItemTemplate = '<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="{templateUrl}"> <span style="color:#418FDE;"><img src="https://s1.ax1x.com/2020/10/06/0UsLZj.png" style="border-radius: 50%; box-shadow: 0 0 1px 0 rgba(0,0,0,0.6);" width="16" height="16" border="0">&nbsp;图灵社区</span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper"> <a target="_blank" href="{templateUrl}"> <span class="buylink-price "> {templatePrice}元 </span> </a> </div> <div class="cell"> <a target="_blank" href="{templateUrl}" class="buy-book-btn e-book-btn"> <span>购买电子书</span> </a> </div> </div> </div> </li>';
  82. buyItemTemplate = buyItemTemplate.replaceAll("{templateUrl}", turingUrl);
  83. buyItemTemplate = buyItemTemplate.replace("{templatePrice}", turingPrice);
  84. $("#buyinfo ul:nth-child(2)").prepend(buyItemTemplate);
  85. }
  86. return;
  87. }
  88. });
  89. return;
  90. }
  91.  
  92. function queryXimalaya(title, author) {
  93. GM_xmlhttpRequest({
  94. method: "GET",
  95. url: "http://106.52.138.60:8081/ximalaya?title=" + title + "&author=" + author,
  96. headers: {
  97. 'User-agent': window.navigator.userAgent,
  98. },
  99. onload: function(responseDetail) {
  100. var result = JSON.parse(responseDetail.responseText);
  101. console.log(result);
  102. if (result.errmsg == '') {
  103. var ximalayaUrl = result.data.url;
  104. var partnerTemplate = '';
  105. if ($(".online-partner .online-type").length == 2) {
  106. partnerTemplate = '<div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="{templateUrl}"> <img src="https://s1.ax1x.com/2020/10/07/0UbEuj.png" width="16" height="16"> <span>喜马拉雅</span> </a> </div>';
  107. $('.online-type[data-ebassistant="audio"]').append(partnerTemplate.replace("{templateUrl}", ximalayaUrl));
  108. } else if ($(".online-partner .online-type").length == 1) {
  109. partnerTemplate = '<div class="online-type" data-ebassistant="audio"> <span>在线试听:</span> <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="{templateUrl}" one-link-mark="yes"> <img src="https://s1.ax1x.com/2020/10/07/0UbEuj.png" width="16" height="16"> <span>喜马拉雅</span> </a> </div></div>';
  110. $('.online-type[data-ebassistant="read"]').after(partnerTemplate.replace("{templateUrl}", ximalayaUrl));
  111. } else {
  112. partnerTemplate = '<div class="online-partner"> <div class="online-type" data-ebassistant="audio"> <span>在线试听:</span> <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="{templateUrl}" one-link-mark="yes"> <img src="https://s1.ax1x.com/2020/10/07/0UbEuj.png" width="16" height="16"> <span>喜马拉雅</span> </a> </div></div> </div>';
  113. $("#link-report").after(partnerTemplate.replace("{templateUrl}", ximalayaUrl));
  114. }
  115. }
  116. return;
  117. }
  118. });
  119. return;
  120. }
  121.  
  122. function queryDuokan(isbn) {
  123. GM_xmlhttpRequest({
  124. method: "GET",
  125. url: "http://106.52.138.60:8081/duokan?isbn=" + isbn,
  126. headers: {
  127. 'User-agent': window.navigator.userAgent,
  128. },
  129. onload: function(responseDetail) {
  130. var result = JSON.parse(responseDetail.responseText);
  131. console.log(result);
  132. if (result.errmsg == '') {
  133. var duokanUrl = result.data.url;
  134. var duokanPrice = result.data.price;
  135. var partnerTemplate = '';
  136. if ($(".online-partner").length) {
  137. partnerTemplate = '<div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="{templateUrl}"> <img src="https://s1.ax1x.com/2020/10/08/0wylUH.png" width="16" height="16"> <span>多看阅读</span> </a> </div>';
  138. $('.online-type[data-ebassistant="read"]').append(partnerTemplate.replace("{templateUrl}", duokanUrl));
  139. } else {
  140. partnerTemplate = '<div class="online-partner"> <div class="online-type" data-ebassistant="read"> <span>在线试读:</span> <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="{templateUrl}" one-link-mark="yes"> <img src="https://s1.ax1x.com/2020/10/08/0wylUH.png" width="16" height="16"> <span>多看阅读</span> </a> </div></div> </div>';
  141. $("#link-report").after(partnerTemplate.replace("{templateUrl}", duokanUrl));
  142. }
  143. var buyItemTemplate = '<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="{templateUrl}"> <span style="color:#418FDE;"><img src="https://s1.ax1x.com/2020/10/08/0wylUH.png" style="border-radius: 50%; box-shadow: 0 0 1px 0 rgba(0,0,0,0.6);" width="16" height="16" border="0">&nbsp;多看阅读</span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper"> <a target="_blank" href="{templateUrl}"> <span class="buylink-price "> {templatePrice}元 </span> </a> </div> <div class="cell"> <a target="_blank" href="{templateUrl}" class="buy-book-btn e-book-btn"> <span>购买电子书</span> </a> </div> </div> </div> </li>';
  144. buyItemTemplate = buyItemTemplate.replaceAll("{templateUrl}", duokanUrl);
  145. buyItemTemplate = buyItemTemplate.replace("{templatePrice}", duokanPrice);
  146. $("#buyinfo ul:nth-child(2)").prepend(buyItemTemplate);
  147. }
  148. return;
  149. }
  150. });
  151. return;
  152. }
  153.  
  154. try {
  155. $(".online-partner .online-type:nth-child(1)").attr("data-ebassistant", "read");
  156. $(".online-partner .online-type:nth-child(2)").attr("data-ebassistant", "audio");
  157. } catch(e) {
  158. console.log(e);
  159. }
  160. var newStyle = `<style type="text/css" media="screen">
  161. .online-partner{flex-wrap:wrap;padding-top:5px;padding-bottom:5px}.online-type{flex-wrap:wrap}.online-read-or-audio{margin-top:5px;margin-bottom:5px}.online-partner .online-type:nth-child(1){margin-right:20px}.online-partner .online-type:nth-child(2){padding-left:0}
  162. </style>`;
  163. $("#content").append(newStyle);
  164.  
  165. var regexlinkedData = /<script type="application\/ld\+json">([\s\S]+?)<\/script>/g;
  166. var linkedData = regexlinkedData.exec(document.documentElement.innerHTML)[1].trim();
  167. linkedData = JSON.parse(linkedData);
  168. console.log(linkedData);
  169. var isbn = linkedData.isbn;
  170. console.log(isbn);
  171. var title = linkedData.name;
  172. console.log(title);
  173. var authorStr = "";
  174. for (var i=0, j=linkedData.author.length; i<j; i++) {
  175. authorStr += linkedData.author[i].name + " " ;
  176. }
  177. var author = authorStr;
  178. console.log(author);
  179.  
  180. queryAmazon(title, isbn);
  181. queryTuring(isbn);
  182. queryDuokan(isbn);
  183. queryXimalaya(title, author);
  184.  
  185. return;
  186. })();