豆瓣读书助手

为豆瓣读书页面添加亚马逊Kindle、微信读书、多看阅读、京东读书、当当云阅读、喜马拉雅等直达链接

目前为 2022-02-19 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name eBooks Assistant
  3. // @name:zh-CN 豆瓣读书助手
  4. // @namespace https://github.com/caspartse/eBooksAssistant
  5. // @version 0.17.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/3.6.0/jquery.min.js
  13. // @connect amazon.cn
  14. // @connect duokan.com
  15. // @connect 8.210.230.166
  16. // @connect 127.0.0.1
  17. // @grant GM_xmlhttpRequest
  18. // ==/UserScript==
  19.  
  20. (function() {
  21. var version = "0.17.0";
  22. // 如果自己部署服务,这里修改成你的服务器地址
  23. var domain = "http://8.210.230.166:8081";
  24. // for debug
  25. // var domain = "http://127.0.0.1:8082";
  26.  
  27. function adjustMargin() {
  28. if ($('[data-ebassistant="read"]').height() > 36) {
  29. $('[data-ebassistant="read"]').attr("style", "margin-right:0;");
  30. }
  31. }
  32.  
  33. // 客户端本地抓取,如有结果,结果共享给服务器
  34. function queryAmazon_Local(isbn, title, token="") {
  35. GM_xmlhttpRequest({
  36. method: "GET",
  37. url: `https://www.amazon.cn/s?__mk_zh_CN=亚马逊网站&i=digital-text&k=${isbn}&ref=nb_sb_noss&url=search-alias%3Ddigital-text`,
  38. headers: {
  39. "User-agent": window.navigator.userAgent,
  40. },
  41. onload: function(responseDetail) {
  42. var doc = responseDetail.responseText;
  43. var errorFlag = /("totalResultCount"\:0)/gi.exec(doc);
  44. if (!errorFlag) {
  45. var regexbookUrl = /href="(\S+keywords=\d+[^"]+)"[^>]*>Kindle电子书<\/a>/gi;
  46. var bookUrl = "https://www.amazon.cn" + regexbookUrl.exec(doc)[1];
  47. bookUrl = bookUrl.replace(isbn, title);
  48. var partnerTemplate = "";
  49. if ($('.online-type[data-ebassistant="read"]').length) {
  50. partnerTemplate = `<div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}">
  51. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_kindle.png" width="16" height="16"> <span>Kindle</span> </a> </div>`;
  52. $('.online-type[data-ebassistant="read"]').append(partnerTemplate);
  53. } else if ($('.online-type[data-ebassistant="audio"]').length) {
  54. partnerTemplate = `<div class="online-type" data-ebassistant="read"> <span>在线试读:</span> <div class="online-read-or-audio">
  55. <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  56. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_kindle.png" width="16" height="16"> <span>Kindle</span> </a> </div></div>`;
  57. $('.online-type[data-ebassistant="audio"]').before(partnerTemplate);
  58. } else {
  59. partnerTemplate = `<div class="online-partner"> <div class="online-type" data-ebassistant="read"> <span>在线试读:</span>
  60. <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  61. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_kindle.png" width="16" height="16"> <span>Kindle</span> </a> </div></div> </div>`;
  62. $("#link-report").after(partnerTemplate);
  63. }
  64. var regexbookPrice = /<span class="a-offscreen">[¥¥]([0-9\.]+)<\/span>/gi;
  65. var bookPrice = regexbookPrice.exec(doc)[1];
  66. var amazonKu = false;
  67. var buyItemTemplate = ""
  68. if (bookPrice == 0.00 ) {
  69. regexbookPrice = /(免费借阅)|(免费阅读此书)|(涵盖在您的会员资格中)|(或者[¥¥][0-9\.]+购买)/gi;
  70. bookPrice = regexbookPrice.exec(doc)[1];
  71. amazonKu = true;
  72. buyItemTemplate = `<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="${bookUrl}"> <span >
  73. <img alt="Kindle Unlimited" src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_ku.png" width="75" height="10" border="0">
  74. </span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper"> <a target="_blank" href="${bookUrl}">
  75. <span class="buylink-price "> ${bookPrice}元 </span> </a> </div> <div class="cell"> <a target="_blank" href="${bookUrl}" class="buy-book-btn e-book-btn">
  76. <span>购买电子书</span> </a> </div> </div> </div> <div class="more-info"> <span class="buyinfo-promotion">KU可免费借阅</span> </div> </li>`;
  77. } else {
  78. buyItemTemplate = `<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="${bookUrl}"> <span>
  79. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_kindle.png" style="border-radius: 50%; box-shadow: 0 0 1px 0 rgba(0,0,0,0.6);"
  80. width="16" height="16" border="0">&nbsp;Kindle</span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper">
  81. <a target="_blank" href="${bookUrl}"> <span class="buylink-price "> ${bookPrice}元 </span> </a> </div> <div class="cell">
  82. <a target="_blank" href="${bookUrl}" class="buy-book-btn e-book-btn"> <span>购买电子书</span> </a> </div> </div> </div> </li>`;
  83. }
  84. $("#buyinfo ul:nth-child(2)").prepend(buyItemTemplate);
  85. var amazonShortUrl = /(https:\/\/www\.amazon\.cn\/dp\/[0-9a-zA-Z]+\/)/gi.exec(bookUrl)[1];
  86. title = encodeURIComponent(title);
  87. GM_xmlhttpRequest({
  88. method: "POST",
  89. url: `${domain}/amazon/update?isbn=${isbn}`,
  90. data: `isbn=${isbn}&title=${title}&price=${bookPrice}&url=${amazonShortUrl}&ku=${amazonKu}&token=${token}&version=${version}`,
  91. headers: {
  92. "Content-Type": "application/x-www-form-urlencoded"
  93. }
  94. });
  95. }
  96. return;
  97. }
  98. });
  99. adjustMargin();
  100. return;
  101. }
  102.  
  103. // 为提升查询速度,服务器预先缓存了一批数据。
  104. // 但目前遇到一个问题是,难以保证数据最新的,因为请求量较大,屡屡触发亚马逊的反爬虫机制。
  105. // 因此,需要借助各位的力量,去中心化地对数据进行校验和更新。下面这个函数,只会更新当前页面书籍的信息(价格、是否KU)
  106.  
  107. function feedBackAmazon(isbn, url, token="") {
  108. GM_xmlhttpRequest({
  109. method: "GET",
  110. url: url,
  111. headers: {
  112. "User-agent": window.navigator.userAgent,
  113. },
  114. onload: function(responseDetail) {
  115. var doc = responseDetail.responseText;
  116. var regexbookPrice = /<span id="kindle-price"[^>]+>\s*[¥|¥]([0-9\.]+)\s*<\/span>/gi;
  117. var bookPrice = regexbookPrice.exec(doc)[1];
  118. var regexAmazonKu = /(免费借阅)|(免费阅读此书)|(涵盖在您的会员资格中)|(或者[¥¥][0-9\.]+购买)/gi;
  119. var amazonKu = regexAmazonKu.test(doc);
  120. GM_xmlhttpRequest({
  121. method: "POST",
  122. url: `${domain}/amazon/feedback?isbn=${isbn}`,
  123. data: `isbn=${isbn}&price=${bookPrice}&ku=${amazonKu}&token=${token}&version=${version}`,
  124. headers: {
  125. "Content-Type": "application/x-www-form-urlencoded"
  126. }
  127. });
  128. }
  129. });
  130. return;
  131. }
  132.  
  133. // 使用服务器上的资源
  134. function queryAmazon_Remote(isbn, title, subtitle, author, translator, publisher) {
  135. GM_xmlhttpRequest({
  136. method: "GET",
  137. url: `${domain}/amazon?isbn=${isbn}&title=${title}&subtitle=${subtitle}&author=${author}&translator=${translator}&publisher=${publisher}&version=${version}`,
  138. headers: {
  139. "User-agent": window.navigator.userAgent,
  140. },
  141. onload: function(responseDetail) {
  142. var result = JSON.parse(responseDetail.responseText);
  143. console.log(result);
  144. var token = result.token;
  145. if (result.errmsg == "") {
  146. var bookUrl = result.data.url;
  147. var bookPrice = result.data.price;
  148. var ku = result.data.ku;
  149. var partnerTemplate = "";
  150. if ($('.online-type[data-ebassistant="read"]').length) {
  151. partnerTemplate = `<div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}">
  152. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_kindle.png" width="16" height="16"> <span>Kindle</span> </a> </div>`;
  153. $('.online-type[data-ebassistant="read"]').append(partnerTemplate);
  154. } else if ($('.online-type[data-ebassistant="audio"]').length) {
  155. partnerTemplate = `<div class="online-type" data-ebassistant="read"> <span>在线试读:</span> <div class="online-read-or-audio">
  156. <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  157. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_kindle.png" width="16" height="16"> <span>Kindle</span> </a> </div></div>`;
  158. $('.online-type[data-ebassistant="audio"]').before(partnerTemplate);
  159. } else {
  160. partnerTemplate = `<div class="online-partner"> <div class="online-type" data-ebassistant="read"> <span>在线试读:</span>
  161. <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  162. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_kindle.png" width="16" height="16"> <span>Kindle</span> </a> </div></div> </div>`;
  163. $("#link-report").after(partnerTemplate);
  164. }
  165. var buyItemTemplate = `<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="${bookUrl}">
  166. <span><img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_kindle.png" style="border-radius: 50%; box-shadow: 0 0 1px 0 rgba(0,0,0,0.6);"
  167. width="16" height="16" border="0">&nbsp;Kindle</span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper">
  168. <a target="_blank" href="${bookUrl}"> <span class="buylink-price "> ${bookPrice}元 </span> </a> </div> <div class="cell">
  169. <a target="_blank" href="${bookUrl}" class="buy-book-btn e-book-btn"> <span>购买电子书</span> </a> </div> </div> </div> </li>`;
  170. if (ku === true) {
  171. buyItemTemplate = `<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="${bookUrl}"> <span >
  172. <img alt="Kindle Unlimited" src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_ku.png" width="75" height="10" border="0">
  173. </span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper"> <a target="_blank" href="${bookUrl}">
  174. <span class="buylink-price "> ${bookPrice}元 </span> </a> </div> <div class="cell"> <a target="_blank" href="${bookUrl}" class="buy-book-btn e-book-btn">
  175. <span>购买电子书</span> </a> </div> </div> </div> <div class="more-info"> <span class="buyinfo-promotion">KU可免费借阅</span> </div> </li>`;
  176. }
  177. $("#buyinfo ul:nth-child(2)").prepend(buyItemTemplate);
  178. var ext = result.ext;
  179. if (ext == "r") {
  180. feedBackAmazon(isbn, bookUrl, token);
  181. }
  182. } else {
  183. console.log("call queryAmazon_Local.");
  184. queryAmazon_Local(isbn, title, token);
  185. }
  186. return;
  187. }
  188. });
  189. adjustMargin();
  190. return;
  191. }
  192.  
  193. // 使用服务器上的资源
  194. function queryWeread_Remote(isbn, title, subtitle, author, translator, publisher) {
  195. GM_xmlhttpRequest({
  196. method: "GET",
  197. url: `${domain}/weread?isbn=${isbn}&title=${title}&subtitle=${subtitle}&author=${author}&translator=${translator}&publisher=${publisher}&version=${version}`,
  198. headers: {
  199. "User-agent": window.navigator.userAgent,
  200. },
  201. onload: function(responseDetail) {
  202. var result = JSON.parse(responseDetail.responseText);
  203. console.log(result);
  204. if (result.errmsg == "") {
  205. var bookUrl = result.data.url;
  206. var bookPrice = result.data.price;
  207. var partnerTemplate = "";
  208. if ($('.online-type[data-ebassistant="read"]').length) {
  209. partnerTemplate = `<div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}">
  210. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_weread.png" width="16" height="16"> <span>微信读书</span> </a> </div>`;
  211. $('.online-type[data-ebassistant="read"]').append(partnerTemplate);
  212. } else if ($('.online-type[data-ebassistant="audio"]').length) {
  213. partnerTemplate = `<div class="online-type" data-ebassistant="read"> <span>在线试读:</span> <div class="online-read-or-audio">
  214. <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  215. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_weread.png" width="16" height="16"> <span>微信读书</span> </a> </div></div>`;
  216. $('.online-type[data-ebassistant="audio"]').before(partnerTemplate);
  217. } else {
  218. partnerTemplate = `<div class="online-partner"> <div class="online-type" data-ebassistant="read"> <span>在线试读:</span>
  219. <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  220. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_weread.png" width="16" height="16"> <span>微信读书</span> </a> </div></div> </div>`;
  221. $("#link-report").after(partnerTemplate);
  222. }
  223. var buyItemTemplate = `<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="${bookUrl}"> <span>
  224. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_weread.png" style="border-radius: 50%; box-shadow: 0 0 1px 0 rgba(0,0,0,0.6);"
  225. width="16" height="16" border="0">&nbsp;微信读书</span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper">
  226. <a target="_blank" href="${bookUrl}"> <span class="buylink-price "> ${bookPrice}元 </span> </a> </div> <div class="cell">
  227. <a target="_blank" href="${bookUrl}" class="buy-book-btn e-book-btn"> <span>购买电子书</span> </a> </div> </div> </div> </li>`;
  228. $("#buyinfo ul:nth-child(2)").prepend(buyItemTemplate);
  229. }
  230. return;
  231. }
  232. });
  233. adjustMargin();
  234. return;
  235. }
  236.  
  237. // 使用服务器上的资源
  238. function queryDuokan_Remote(isbn, title, subtitle, author, translator, publisher) {
  239. GM_xmlhttpRequest({
  240. method: "GET",
  241. url: `${domain}/duokan?isbn=${isbn}&title=${title}&subtitle=${subtitle}&author=${author}&translator=${translator}&publisher=${publisher}&version=${version}`,
  242. headers: {
  243. "User-agent": window.navigator.userAgent,
  244. },
  245. onload: function(responseDetail) {
  246. var result = JSON.parse(responseDetail.responseText);
  247. console.log(result);
  248. if (result.errmsg == "") {
  249. var bookUrl = result.data.url;
  250. var bookPrice = result.data.price;
  251. var partnerTemplate = "";
  252. if ($('.online-type[data-ebassistant="read"]').length) {
  253. partnerTemplate = `<div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}">
  254. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_duokan.png" width="16" height="16"> <span>多看阅读</span> </a> </div>`;
  255. $('.online-type[data-ebassistant="read"]').append(partnerTemplate);
  256. } else if ($('.online-type[data-ebassistant="audio"]').length) {
  257. partnerTemplate = `<div class="online-type" data-ebassistant="read"> <span>在线试读:</span> <div class="online-read-or-audio">
  258. <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  259. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_duokan.png" width="16" height="16"> <span>多看阅读</span> </a> </div></div>`;
  260. $('.online-type[data-ebassistant="audio"]').before(partnerTemplate);
  261. } else {
  262. partnerTemplate = `<div class="online-partner"> <div class="online-type" data-ebassistant="read"> <span>在线试读:</span>
  263. <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  264. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_duokan.png" width="16" height="16"> <span>多看阅读</span> </a> </div></div> </div>`;
  265. $("#link-report").after(partnerTemplate);
  266. }
  267. var buyItemTemplate = `<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="${bookUrl}"> <span>
  268. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_duokan.png" style="border-radius: 50%; box-shadow: 0 0 1px 0 rgba(0,0,0,0.6);"
  269. width="16" height="16" border="0">&nbsp;多看阅读</span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper">
  270. <a target="_blank" href="${bookUrl}"> <span class="buylink-price "> ${bookPrice}元 </span> </a> </div> <div class="cell">
  271. <a target="_blank" href="${bookUrl}" class="buy-book-btn e-book-btn"> <span>购买电子书</span> </a> </div> </div> </div> </li>`;
  272. $("#buyinfo ul:nth-child(2)").prepend(buyItemTemplate);
  273. }
  274. return;
  275. }
  276. });
  277. adjustMargin();
  278. return;
  279. }
  280.  
  281. // 使用服务器上的资源
  282. function queryXimalaya_Remote(isbn, title, subtitle, author, translator, publisher) {
  283. GM_xmlhttpRequest({
  284. method: "GET",
  285. url: `${domain}/ximalaya?isbn=${isbn}&title=${title}&subtitle=${subtitle}&author=${author}&translator=${translator}&publisher=${publisher}&version=${version}`,
  286. headers: {
  287. "User-agent": window.navigator.userAgent,
  288. },
  289. onload: function(responseDetail) {
  290. var result = JSON.parse(responseDetail.responseText);
  291. console.log(result);
  292. if (result.errmsg == "") {
  293. var alubmUrl = result.data.url;
  294. var partnerTemplate = "";
  295. if ($(".online-partner .online-type").length == 2) {
  296. partnerTemplate = `<div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${alubmUrl}">
  297. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_ximalaya.png" width="16" height="16"> <span>喜马拉雅</span> </a> </div>`;
  298. $('.online-type[data-ebassistant="audio"]').append(partnerTemplate);
  299. } else if ($(".online-partner .online-type").length == 1) {
  300. partnerTemplate = `<div class="online-type" data-ebassistant="audio"> <span>在线试听:</span> <div class="online-read-or-audio">
  301. <a class="impression_track_mod_buyinfo" target="_blank" href="${alubmUrl}" one-link-mark="yes">
  302. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_ximalaya.png" width="16" height="16"> <span>喜马拉雅</span> </a> </div></div>`;
  303. $('.online-type[data-ebassistant="read"]').after(partnerTemplate);
  304. } else {
  305. partnerTemplate = `<div class="online-partner"> <div class="online-type" data-ebassistant="audio"> <span>在线试听:</span>
  306. <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${alubmUrl}" one-link-mark="yes">
  307. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_ximalaya.png" width="16" height="16"> <span>喜马拉雅</span> </a> </div></div> </div>`;
  308. $("#link-report").after(partnerTemplate);
  309. }
  310. }
  311. return;
  312. }
  313. });
  314. adjustMargin();
  315. return;
  316. }
  317.  
  318. // 使用服务器上的资源
  319. function queryJingdong_Remote(isbn, title, subtitle, author, translator, publisher) {
  320. GM_xmlhttpRequest({
  321. method: "GET",
  322. url: `${domain}/jd?isbn=${isbn}&title=${title}&subtitle=${subtitle}&author=${author}&translator=${translator}&publisher=${publisher}&version=${version}`,
  323. headers: {
  324. "User-agent": window.navigator.userAgent,
  325. },
  326. onload: function(responseDetail) {
  327. var result = JSON.parse(responseDetail.responseText);
  328. console.log(result);
  329. if (result.errmsg == "") {
  330. var bookUrl = result.data.url;
  331. var bookPrice = result.data.price;
  332. var partnerTemplate = "";
  333. if ($('.online-type[data-ebassistant="read"]').length) {
  334. partnerTemplate = `<div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}">
  335. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_jd.png" width="16" height="16"> <span>京东读书</span> </a> </div>`;
  336. $('.online-type[data-ebassistant="read"]').append(partnerTemplate);
  337. } else if ($('.online-type[data-ebassistant="audio"]').length) {
  338. partnerTemplate = `<div class="online-type" data-ebassistant="read"> <span>在线试读:</span> <div class="online-read-or-audio">
  339. <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  340. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_jd.png" width="16" height="16"> <span>京东读书</span> </a> </div></div>`;
  341. $('.online-type[data-ebassistant="audio"]').before(partnerTemplate);
  342. } else {
  343. partnerTemplate = `<div class="online-partner"> <div class="online-type" data-ebassistant="read"> <span>在线试读:</span>
  344. <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  345. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_jd.png" width="16" height="16"> <span>京东读书</span> </a> </div></div> </div>`;
  346. $("#link-report").after(partnerTemplate);
  347. }
  348. var buyItemTemplate = `<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="${bookUrl}"> <span>
  349. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_jd.png" style="border-radius: 50%; box-shadow: 0 0 1px 0 rgba(0,0,0,0.6);"
  350. width="16" height="16" border="0">&nbsp;京东读书</span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper">
  351. <a target="_blank" href="${bookUrl}"> <span class="buylink-price "> ${bookPrice}元 </span> </a> </div> <div class="cell">
  352. <a target="_blank" href="${bookUrl}" class="buy-book-btn e-book-btn"> <span>购买电子书</span> </a> </div> </div> </div> </li>`;
  353. $("#buyinfo ul:nth-child(2)").prepend(buyItemTemplate);
  354. }
  355. return;
  356. }
  357. });
  358. adjustMargin();
  359. return;
  360. }
  361.  
  362. // 使用服务器上的资源
  363. function queryDangdang_Remote(isbn, title, subtitle, author, translator, publisher) {
  364. GM_xmlhttpRequest({
  365. method: "GET",
  366. url: `${domain}/dangdang?isbn=${isbn}&title=${title}&subtitle=${subtitle}&author=${author}&translator=${translator}&publisher=${publisher}&version=${version}`,
  367. headers: {
  368. "User-agent": window.navigator.userAgent,
  369. },
  370. onload: function(responseDetail) {
  371. var result = JSON.parse(responseDetail.responseText);
  372. console.log(result);
  373. if (result.errmsg == "") {
  374. var bookUrl = result.data.url;
  375. var bookPrice = result.data.price;
  376. var partnerTemplate = "";
  377. if ($('.online-type[data-ebassistant="read"]').length) {
  378. partnerTemplate = `<div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}">
  379. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_dangdang.png" width="16" height="16"> <span>当当云阅读</span> </a> </div>`;
  380. $('.online-type[data-ebassistant="read"]').append(partnerTemplate);
  381. } else if ($('.online-type[data-ebassistant="audio"]').length) {
  382. partnerTemplate = `<div class="online-type" data-ebassistant="read"> <span>在线试读:</span> <div class="online-read-or-audio">
  383. <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  384. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_dangdang.png" width="16" height="16"> <span>当当云阅读</span> </a> </div></div>`;
  385. $('.online-type[data-ebassistant="audio"]').before(partnerTemplate);
  386. } else {
  387. partnerTemplate = `<div class="online-partner"> <div class="online-type" data-ebassistant="read"> <span>在线试读:</span>
  388. <div class="online-read-or-audio"> <a class="impression_track_mod_buyinfo" target="_blank" href="${bookUrl}" one-link-mark="yes">
  389. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_dangdang.png" width="16" height="16"> <span>当当云阅读</span> </a> </div></div> </div>`;
  390. $("#link-report").after(partnerTemplate);
  391. }
  392. var buyItemTemplate = `<li> <div class="cell price-btn-wrapper"> <div class="vendor-name"> <a target="_blank" href="${bookUrl}"> <span>
  393. <img src="https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/icon_dangdang.png" style="border-radius: 50%; box-shadow: 0 0 1px 0 rgba(0,0,0,0.6);"
  394. width="16" height="16" border="0">&nbsp;当当云阅读&nbsp;</span> </a> </div> <div class="cell impression_track_mod_buyinfo"> <div class="cell price-wrapper">
  395. <a target="_blank" href="${bookUrl}"> <span class="buylink-price "> ${bookPrice}元 </span> </a> </div> <div class="cell">
  396. <a target="_blank" href="${bookUrl}" class="buy-book-btn e-book-btn"> <span>购买电子书</span> </a> </div> </div> </div> </li>`;
  397. $("#buyinfo ul:nth-child(2)").prepend(buyItemTemplate);
  398. }
  399. return;
  400. }
  401. });
  402. adjustMargin();
  403. return;
  404. }
  405.  
  406. try {
  407. $(".online-partner .online-type:nth-child(1)").attr("data-ebassistant", "read");
  408. $(".online-partner .online-type:nth-child(2)").attr("data-ebassistant", "audio");
  409. } catch(e) {
  410. console.log(e);
  411. }
  412. var newStyle = `<style type="text/css" media="screen">.online-partner{flex-wrap:wrap;padding-top:5px;padding-bottom:5px}.online-type{flex-wrap:wrap}
  413. .online-read-or-audio{margin-top:5px;margin-bottom:5px}.online-partner .online-type:nth-child(1){margin-right:20px}
  414. .online-partner .online-type:last-child{margin-right:0}.online-partner .online-type:nth-child(2){padding-left:0}[data-ebassistant=read] div:last-child a{margin-right:0}</style>`;
  415. $("#content").append(newStyle);
  416.  
  417. var regexLinkedData = /<script type="application\/ld\+json">([\s\S]+?)<\/script>/gi;
  418. var linkedData = regexLinkedData.exec(document.documentElement.innerHTML)[1].trim();
  419. linkedData = JSON.parse(linkedData);
  420. console.log(linkedData);
  421. var isbn = linkedData.isbn;
  422. console.log(isbn);
  423. var title = linkedData.name;
  424. console.log(title);
  425. var subtitle = "";
  426. try {
  427. var regexSubtitle = /<span class="pl">\s*副标题:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi;
  428. subtitle = regexSubtitle.exec(document.documentElement.innerHTML.replace(/&nbsp;/gi, " "))[1].trim();
  429. } catch(e) {
  430. console.log(e);
  431. }
  432. console.log(subtitle);
  433. var authorStr = "";
  434. for (var i=0, j=linkedData.author.length; i<j; i++) {
  435. authorStr += linkedData.author[i].name + " " ;
  436. }
  437. var author = authorStr;
  438. console.log(author);
  439. var translator = "";
  440. try {
  441. var regexTranslator = /<span class="pl">\s*译者:?<\/span>\s*:?\s*<a[^>]+>([\s\S]+?)<\/a>/gi;
  442. translator = regexTranslator.exec(document.documentElement.innerHTML.replace(/&nbsp;/gi, " "))[1].trim();
  443. } catch(e) {
  444. console.log(e);
  445. }
  446. console.log(translator);
  447. var publisher = "";
  448. try {
  449. var regexPublisher = /<span class="pl">\s*出版社:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi;
  450. publisher = regexPublisher.exec(document.documentElement.innerHTML.replace(/&nbsp;/gi, " "))[1].trim();
  451. } catch(e) {
  452. console.log(e);
  453. }
  454. console.log(publisher);
  455.  
  456. queryWeread_Remote(isbn, title, subtitle, author, translator, publisher);
  457. queryAmazon_Remote(isbn, title, subtitle, author, translator, publisher);
  458. queryDuokan_Remote(isbn, title, subtitle, author, translator, publisher);
  459. queryXimalaya_Remote(isbn, title, subtitle, author, translator, publisher);
  460. queryJingdong_Remote(isbn, title, subtitle, author, translator, publisher);
  461. queryDangdang_Remote(isbn, title, subtitle, author, translator, publisher);
  462.  
  463. return;
  464. })();