豆瓣读书助手

为豆瓣读书页面添加微信读书、多看阅读、京东读书、当当云阅读、喜马拉雅等直达链接; 为微信读书增加豆瓣评分及链接。

  1. // ==UserScript==
  2. // @name eBooks Assistant
  3. // @name:zh-CN 豆瓣读书助手
  4. // @namespace https://github.com/caspartse/eBooksAssistant
  5. // @version 24.07.2
  6. // @description eBooks Assistant for douban.com, weread.qq.com
  7. // @description:zh-CN 为豆瓣读书页面添加微信读书、多看阅读、京东读书、当当云阅读、喜马拉雅等直达链接; 为微信读书增加豆瓣评分及链接。
  8. // @icon https://ebooks-assistant.oss-cn-guangzhou.aliyuncs.com/ebooks_assistant_logo_256.png
  9. // @author Caspar Tse
  10. // @license MIT License
  11. // @supportURL https://github.com/caspartse/eBooksAssistant
  12. // @match https://book.douban.com/subject/*
  13. // @match https://weread.qq.com/web/bookDetail/*
  14. // @match https://weread.qq.com/web/reader/*
  15. // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js
  16. // @connect 127.0.0.1
  17. // @connect api.youdianzishu.com
  18. // @run-at document-end
  19. // @grant GM_xmlhttpRequest
  20. // ==/UserScript==
  21.  
  22. const version = "24.07.2";
  23. // 如果自己部署服务,这里修改成你的服务器地址
  24. const REST_URL = "https://api.youdianzishu.com/v2";
  25.  
  26. // Base64 icons
  27. const base64_icon_weread = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABMlBMVEU4tP83tP8ysf8xsf8ysP8xsP8xr/8xrv8xrf8xrf4xrP8xrP4wrP4wq/4wqv4wqf4wqP4vqP4vp/4up/4rpv4rpf4tpv5Arf53xP6X0v6Fy/5Utv4upv4vpv4tpf5Utf7Q6v/8/v/////s9/+Mzf4wpv40p/7C5P/W7f+T0P7+/v/L6P+a0//z+v9lvP4rpP4vpf4tpP5Hr/7o9f/q9v/H5//+///k8//K6P8qo/4upP46qf7T7P/9/v94xP4vpP4so/52w/7v+P/B5P88qf4to/4uo/4tov6g1f7S6//d8P+X0f5Aq/4sov5DrP42pv4+qv43p/4rof4roP0roPwrof0uov4qoP0qoPyWzvmWzfmTzPlsu/ozo/z3+/73/P7t9v2IyPv0+v72+/7k8v31+v52qLiyAAAAAWJLR0QiXWVcrAAAAAd0SU1FB+QKERMSBxvkIzYAAAFFSURBVDjLhYqHUsJAFEWfcWMQNRQFayyxYsWuawk2ELsiKKFI/f9fcN9uZtgENGfuK3PmAvxFn3OVfoaiiAhcAhSFOJ5dQviWBRCiElVVCcGt4nYLGPDBv6D5AFogoGkifDSPgAAyyCPRERAcQoJOxJUFDCNBZ8RyCRjxgRV059X5o3sE6D5ACNFDHjoCQj5AWCbC4xIQQaKRzgnzd3QsFovjD9GexMcnJqemZ9gHhpso37Nz8wumubi0bBjegmBldS2xvrG5tb1jQLIHu3v7B4dHxydm4jTZs0DPzk3k4pIVLItSi0HxUkskdXWNhZvbOwvSHMpCnQfJ3Gcfso9Pz+m0U+ji5fXt/SPDHsghnzyMfKGQ5+Ir981FDoq2bRdx4SmVK5VySRJFG6oSP9VavV5jRwIaLpqtVtNtPIVGu934v9DFL75RivuAiiVCAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIwLTEwLTE3VDExOjI2OjE5KzA4OjAwmsnyVQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMC0xMC0xN1QxMToxODowNyswODowMPAqZ5gAAAAASUVORK5CYII=";
  28. const base64_icon_duokan = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABUFBMVEXtkC/tkC/tkC/tkC/tkC/tkC/tkC/tkC/tkC/tjy7tjiztjyztkC7vnUjzs3Hyq2LulDbvmUDysGrulzztjy3wpVb76NT//fz++fT3y57tkzXzuHn++PLyr2r3zaL////+9u7xpln0u4H//Przs3D406zxqmDysWz99u353b/ulz3ysW3869nxql/tkTHyrmf3zKD1w47vnUftkzTvnEXtkjPuljvyrmj75c775MzyrGPulTntkDDulDf638P63b/xqFv517PumT/98+nwo1L2xpX75tH1wIj//v3tkTDvnkn87Nr3zJ/vnEb86df+9/D0uHv517X98ujxplfzt3j++fP+9+/2ypvwolDulTjumD7638T+/Pj1xJDtkjL98+j64sn63sD76NX++vX3zqTzt3f86tf//v787+H0un741K764cb64sj517T1v4bwoEzN5UsNAAAACHRSTlMcnfP0nh388p6FZyYAAAABYktHRB8FDRC9AAAAB3RJTUUH5AoRExEwiHTV+gAAAUFJREFUOMu9k9dTAkEMxg9E3L2LekoUsEXFXk4RFAuIYgHsXbFg7+3/f/NmnGt7A/fimLfN/ia7+fJFknx+VjFqArWSL8iqRDAg1bGq4ZeYR/wnwGUFrDSXQQCgvqFRNQloag6BA8CW1nAk2mYAcntHp+ys0EVE3T1oAL2xPgHo14HIgFIRwMEhouER4xPK6Ni44qygTUzGp7jZRSI5LbaJKFv3ep8uHSA0Y9OBgQjw1OzcvFVCW0g7AcgsEmVV872l5Rx3VlB1YGXV0AHX1gUlGeYLRNHibxY3NrfEWfDtHaLdvTSCPqjc/sEhCgDDo2Oik9OzUuI8dXF5ZfzR5odyPEJUuL65vbuPPZTADUD58SmsT4SeX/IZq2G7ozD5+vb+8fn1DTbJHJbjclHNaAracy5PgnD+A1d7rp7n8nqt/w9oaTwtTt+bTAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMC0xMC0xN1QxMToyNjoyNCswODowMHWRlHYAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjAtMTAtMTdUMTE6MTc6NDgrMDg6MDBzI0IGAAAAAElFTkSuQmCC";
  29. const base64_icon_jd = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAE9GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuZWRhMmIzZmFjLCAyMDIxLzExLzE3LTE3OjIzOjE5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjMuMSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDItMTJUMTA6MTY6MTErMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTAyLTEyVDEwOjIwOjMwKzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTAyLTEyVDEwOjIwOjMwKzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpkMTI3ZDdmNi0wZjJlLTRmZGEtOTgxZS0yYzc1MWIxN2M4MzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ZDEyN2Q3ZjYtMGYyZS00ZmRhLTk4MWUtMmM3NTFiMTdjODMxIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZDEyN2Q3ZjYtMGYyZS00ZmRhLTk4MWUtMmM3NTFiMTdjODMxIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpkMTI3ZDdmNi0wZjJlLTRmZGEtOTgxZS0yYzc1MWIxN2M4MzEiIHN0RXZ0OndoZW49IjIwMjItMDItMTJUMTA6MTY6MTErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMy4xIChNYWNpbnRvc2gpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pkcx3wkAAALuSURBVFiFzZfNS1RhFMZ/7zv3js6oZdpMarYQUqSFolIpLRIKtCiotWTmPxAWtOgvcBMFQcvatQoyjT5Q84M+cCUJSi10YcUwVkIzzjhz5360uNrHzL02o6P2wOXCeQ/neS73vIfniHCgmjUcB/qAdsDP9iAOjAO3gSkAsSbgCnB/m0jd0As8EOFAdQPwfofJ19GoAP0ZYSFACMxwCJMUYpPVLUCiIg9UgmXZz9/oF+FAdQQoSVOA+W0JtakJ5Ug9Vkq3q+UCAUJV0Oc+kJqeRu4P4lAkqgBqetRcDuNta6NsYgQUJUfmNOg6yydPo029Q5YF009VCaTSo4ah4e3s2Do5gKLg7ezAMDSn05QjgwCsWOyftc1QiNWhpyjBCgounHfNs2Ix1z5y/0TTdAwbi4tow2MkBp+QGHzMKlBSVUNgAwFutTYWkE48v0Ck7zqJoQFSgAQKauoJXDyH73J3tmU2LyB26w6RoQH8hw5T3NNF4dlO1NbWTRPnLMBKJJFA6aOHqMeObpl4HTLbRKGqCEAonryR5yQAYfextZrYJQHbhKwFWJpmD9JUxtzaGQGYJiaAP79WIetbUHTzBt5T7agtzbsjQKmrRamrzSs5/NdNKDZrQ3Kr5SpAFBflj9/ny02AQKBP588m6rNzrmfOlswwMKMRfJe6UBsbsJIa1soKsrICX083orAgS2qL+N17RK5eQ+4pBa83PSHqLEB6QNcxvn/55eLW38HXb1FPtLlTxmNoYxMkX46gvRonNTuNLClHFBWDYWQIcL6GpgFS4Pm9tNiT8McyeDIbygyH0UbHSY6Mok1Moi98XHPECp7yg6B4nMgBew5kmFJHCIGFgfDZk9CYX0AbHSM5PIw2+QZ96TMAkkI8ZVU26boNd3dEqostd4aViKM2tyCDAZIvhjGiXwHwqCWIvXtASifvvxGiIhyofgacySZbKCpG6BMWOtK/z/6vglxJ/8TzXV/NJDCDvSjuNHqBGbHb6/lP9kL8xeX2i5QAAAAASUVORK5CYII=";
  30. const base64_icon_dangdang = "data:image/png;base64,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";
  31. const base64_icon_ximalaya = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABvFBMVEUAAAD7KAD6KAD6KQH7KAD6KAD6KAD6KAD6KAD7KQD6KAD6KAD7KQH7KAD6KAD6KAD6KAD6JwD6JgD6KwX6Pxv7QyD6PRj6KgP6KQL6PBf7QB36LAT6Lwj8lID93tn+5eD929X8hW/6KwP8gGj92tP+5OD+5+P9vbH6NhH6JQD7VDT+7+z++/v908v93tj+/v36RCH6Phr939r+/v7939n91Mz9x737a1D7YEL++Pf9w7j6PRn6Mw36Mgz7RCH90sr+8O77TSz6RiT+7Oj92dL7SCb6MAn6JwH++fj9rJ76KAH6LAf9v7P+8e/+7On6MAr9rZ76KQH6Lgf9v7T9yL76MQr6Lwr+6+f8nYv8mIb8mYb8moj8iXT6Mw7+6eX+///+/Pv8qZn+6+j929T7dl37cFX7cFb7blP8n43+/v/9sqT6LQr6JAD6IQD7bFP8m4n7blT8nIr9taj7Wz3+9fP+7uv8qpr8k3/7RSL6LQj9xbv7SSf6MQv6ORT9vrL7c1n9sKL6SCb+7er9xLn8l4T6Oxj7Z0v7ZEj6OBT7Vjb7ZUj6NxL6SCf93df8g2z7XkD7VDX6Lgj7Ti3///+bcN/WAAAAEHRSTlMAAAAAC1u87P0Vl/MVCv7ykU8bAQAAAAFiS0dEk+ED37YAAAAHdElNRQfkCgcIIAF69pagAAABeUlEQVQ4y2NgYGRhZWPnEMAAHOxsrCyMDAxMnFzcAjgANxcPMwMvF58ATsDHxcvAyi+AB/CzMrBBWIJCQCAIZ4EBiMfGwA4WFBYRBQIxcQEBCUlRKJCSBsqwM4DdLyMrJw8ECopKEsoqqvJgoKauATSRgwEkr6mlraOgq6unL29gaGRsogsCpmbmYLshCiwsraxtbO3sHRydnF1cbW1AwM0dWYGHp5egoLePr6OTn5m/IAQIoCgICBQQCAoGKQgJFUT2KKYCszCoLwWxKwiXj4iMAoHomFhBbAri4qEgITEIqwlJySmpaWnpGZlZYAOwuSE7JycnN884PwefLzQLjAs1h56CImEhoSAfnAqKS0rLyisqq7SrgQpqMBUI1tbpxHvUF8s3uDU2NcsIgBW0QBWAk5xga1t6e0dnV7dmT28fKIQ10436wYmWA5JoBQQ1czQFhTQFBW0mTATzRSZJgCXYYckeBgSFUGk2whmHYNbDn3k5mRgIZX8AAQWVTx3DBdsAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjAtMTAtMDdUMDA6MzI6MDErMDg6MDBq1jCmAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIwLTEwLTA3VDAwOjMyOjAxKzA4OjAwG4uIGgAAAABJRU5ErkJggg==";
  32. const base64_icon_douban = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAABIUExURQB3EQB3EQB3EQB3EQB3EQB3EeDu4v///9Dm09jq24C7iLDVtbjZveLw5CCIL2SsbieMNRyGK3CzetLn1bnavonAkfj7+Ap8GhrTEDEAAAAFdFJOU0nm50rkZcBlpgAAAAFiS0dEBxZhiOsAAAAHdElNRQfnCR0IDiYqa5ViAAAAi0lEQVQ4y8WTSw6AIAxE8VNHRUVF5f43FYMLDQgaSJzVhD7SpgOMZeRRxvz1g6CA3gEVnKoSAvFDEtV2g/oz0LQXNQ6AXzvzf4DgkJF7IOqAfjjVA52VhdCXRmNHbYUFTPp0NnbWdrLTlMBi3AJIR9wrsKnDqA1Y7wAelBB48eRigMDnzVmR++plsQM+sxg4Ezfy+QAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMy0wOS0yOVQwODoxNDozOCswMDowMM3mLSUAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjMtMDktMjlUMDg6MTQ6MzgrMDA6MDC8u5WZAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDIzLTA5LTI5VDA4OjE0OjM4KzAwOjAw6660RgAAAABJRU5ErkJggg==";
  33. const base64_icon_douban_rating = "data:image/png;base64,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";
  34.  
  35. let x_unique_id = Math.random().toString(36).substring(2, 12);
  36. console.log(x_unique_id);
  37.  
  38. // 信息查询:微信读书
  39. const queryWeread = (isbn, title, subtitle, author, translator, publisher) => {
  40. const handleResponse = (responseDetail) => {
  41. const result = JSON.parse(responseDetail.responseText);
  42. console.log(result);
  43. if (result.errmsg === "") {
  44. const { url, price } = result.data;
  45.  
  46. let html_template_purchase = `<li><div class="cell price-btn-wrapper"><div class="vendor-name"><img class="eba_vendor_icon" src="${base64_icon_weread}">&nbsp;
  47. <a target="_blank" href="${url}"><span>微信读书</span></a></div><div class="cell impression_track_mod_buyinfo"><div class="cell price-wrapper">
  48. <a target="_blank" href="${url}"><span class="buylink-price"> ${price}元 </span></a></div><div class="cell">
  49. <a target="_blank" href="${url}" class="buy-book-btn e-book-btn"><span>购买电子书</span></a></div></div></div></li>`;
  50.  
  51. if ($("#buyinfo .current-version-list").length) {
  52. $("#buyinfo .current-version-list").prepend(html_template_purchase);
  53. } else {
  54. let elm_buyinfo_printed = `<div class="buyinfo-printed" id="buyinfo-printed"><h2><span>当前版本有售</span> &nbsp;·&nbsp;·&nbsp;·&nbsp;·&nbsp;·&nbsp;·</h2><ul class="bs current-version-list"></ul></div>`;
  55. $("#buyinfo").prepend(elm_buyinfo_printed);
  56. $("#buyinfo .current-version-list").prepend(html_template_purchase);
  57. }
  58. }
  59. }
  60. GM_xmlhttpRequest({
  61. method: "GET",
  62. url: `${REST_URL}/weread?isbn=${isbn}&title=${title}&subtitle=${subtitle}&author=${author}&translator=${translator}&publisher=${publisher}&version=${version}&r=${Math.random()}`,
  63. headers: {
  64. "User-agent": window.navigator.userAgent,
  65. "X-Referer": window.location.href,
  66. "X-Unique-ID": x_unique_id
  67. },
  68. onload: handleResponse
  69. });
  70. }
  71.  
  72. // 信息查询:多看阅读
  73. const queryDuokan = (isbn, title, subtitle, author, translator, publisher) => {
  74. const handleResponse = (responseDetail) => {
  75. const result = JSON.parse(responseDetail.responseText);
  76. console.log(result);
  77. if (result.errmsg === "") {
  78. const { url, price } = result.data;
  79.  
  80. let html_template_purchase = `<li><div class="cell price-btn-wrapper"><div class="vendor-name"><img class="eba_vendor_icon" src="${base64_icon_duokan}">&nbsp;
  81. <a target="_blank" href="${url}"><span>多看阅读</span></a></div><div class="cell impression_track_mod_buyinfo"><div class="cell price-wrapper">
  82. <a target="_blank" href="${url}"><span class="buylink-price"> ${price}元 </span></a></div><div class="cell">
  83. <a target="_blank" href="${url}" class="buy-book-btn e-book-btn"><span>购买电子书</span></a></div></div></div></li>`;
  84.  
  85. if ($("#buyinfo .current-version-list").length) {
  86. $("#buyinfo .current-version-list").prepend(html_template_purchase);
  87. } else {
  88. let elm_buyinfo_printed = `<div class="buyinfo-printed" id="buyinfo-printed"><h2><span>当前版本有售</span> &nbsp;·&nbsp;·&nbsp;·&nbsp;·&nbsp;·&nbsp;·</h2><ul class="bs current-version-list"></ul></div>`;
  89. $("#buyinfo").prepend(elm_buyinfo_printed);
  90. $("#buyinfo .current-version-list").prepend(html_template_purchase);
  91. }
  92. }
  93. }
  94. GM_xmlhttpRequest({
  95. method: "GET",
  96. url: `${REST_URL}/duokan?isbn=${isbn}&title=${title}&subtitle=${subtitle}&author=${author}&translator=${translator}&publisher=${publisher}&version=${version}&r=${Math.random()}`,
  97. headers: {
  98. "User-agent": window.navigator.userAgent,
  99. "X-Referer": window.location.href,
  100. "X-Unique-ID": x_unique_id
  101. },
  102. onload: handleResponse
  103. });
  104. }
  105.  
  106. // 信息查询:京东读书
  107. const queryJingdong = (isbn, title, subtitle, author, translator, publisher) => {
  108. const handleResponse = (responseDetail) => {
  109. const result = JSON.parse(responseDetail.responseText);
  110. console.log(result);
  111. if (result.errmsg === "") {
  112. const { url, price } = result.data;
  113.  
  114. let html_template_purchase = `<li><div class="cell price-btn-wrapper"><div class="vendor-name"><img class="eba_vendor_icon" src="${base64_icon_jd}">
  115. <a target="_blank" href="${url}"><span>&nbsp;京东读书</span></a></div><div class="cell impression_track_mod_buyinfo"><div class="cell price-wrapper">
  116. <a target="_blank" href="${url}"><span class="buylink-price"> ${price}元 </span></a></div><div class="cell">
  117. <a target="_blank" href="${url}" class="buy-book-btn e-book-btn"><span>购买电子书</span></a></div></div></div></li>`;
  118.  
  119. if ($("#buyinfo .current-version-list").length) {
  120. $("#buyinfo .current-version-list").prepend(html_template_purchase);
  121. } else {
  122. let elm_buyinfo_printed = `<div class="buyinfo-printed" id="buyinfo-printed"><h2><span>当前版本有售</span> &nbsp;·&nbsp;·&nbsp;·&nbsp;·&nbsp;·&nbsp;·</h2><ul class="bs current-version-list"></ul></div>`;
  123. $("#buyinfo").prepend(elm_buyinfo_printed);
  124. $("#buyinfo .current-version-list").prepend(html_template_purchase);
  125. }
  126. }
  127. }
  128. GM_xmlhttpRequest({
  129. method: "GET",
  130. url: `${REST_URL}/jd?isbn=${isbn}&title=${title}&subtitle=${subtitle}&author=${author}&translator=${translator}&publisher=${publisher}&version=${version}&r=${Math.random()}`,
  131. headers: {
  132. "User-agent": window.navigator.userAgent,
  133. "X-Referer": window.location.href,
  134. "X-Unique-ID": x_unique_id
  135. },
  136. onload: handleResponse
  137. });
  138. }
  139.  
  140. // 信息查询:当当云阅读
  141. const queryDangdang = (isbn, title, subtitle, author, translator, publisher) => {
  142. const handleResponse = (responseDetail) => {
  143. const result = JSON.parse(responseDetail.responseText);
  144. console.log(result);
  145. if (result.errmsg === "") {
  146. const { url, price } = result.data;
  147.  
  148. let html_template_purchase = `<li><div class="cell price-btn-wrapper"><div class="vendor-name"><img class="eba_vendor_icon" src="${base64_icon_dangdang}">&nbsp;
  149. <a target="_blank" href="${url}"><span>当当阅读</span></a></div><div class="cell impression_track_mod_buyinfo"><div class="cell price-wrapper">
  150. <a target="_blank" href="${url}"><span class="buylink-price"> ${price}元 </span></a></div><div class="cell">
  151. <a target="_blank" href="${url}" class="buy-book-btn e-book-btn"><span>购买电子书</span></a></div></div></div></li>`;
  152.  
  153. if ($("#buyinfo .current-version-list").length) {
  154. $("#buyinfo .current-version-list").prepend(html_template_purchase);
  155. } else {
  156. let elm_buyinfo_printed = `<div class="buyinfo-printed" id="buyinfo-printed"><h2><span>当前版本有售</span> &nbsp;·&nbsp;·&nbsp;·&nbsp;·&nbsp;·&nbsp;·</h2><ul class="bs current-version-list"></ul></div>`;
  157. $("#buyinfo").prepend(elm_buyinfo_printed);
  158. $("#buyinfo .current-version-list").prepend(html_template_purchase);
  159. }
  160. }
  161. }
  162. GM_xmlhttpRequest({
  163. method: "GET",
  164. url: `${REST_URL}/dangdang?isbn=${isbn}&title=${title}&subtitle=${subtitle}&author=${author}&translator=${translator}&publisher=${publisher}&version=${version}&r=${Math.random()}`,
  165. headers: {
  166. "User-agent": window.navigator.userAgent,
  167. "X-Referer": window.location.href,
  168. "X-Unique-ID": x_unique_id
  169. },
  170. onload: handleResponse
  171. });
  172. }
  173.  
  174. // 信息查询:喜马拉雅
  175. const queryXimalaya = (isbn, title, subtitle, author, translator, publisher) => {
  176. const handleResponse = (responseDetail) => {
  177. const result = JSON.parse(responseDetail.responseText);
  178. console.log(result);
  179. if (result.errmsg === "") {
  180. const { url } = result.data;
  181.  
  182. const constructHtmlTemplatePartner = (type) => {
  183. let template = `<div class="online-read-or-audio">
  184. <div class="vendor-info">
  185. <img class="vendor-icon" src="${base64_icon_ximalaya}">
  186. <a class="vendor-name impression_track_mod_buyinfo" target="_blank" href="${url}">
  187. 喜马拉雅
  188. </a>
  189. </div>
  190. <a class="vendor-link" target="_blank" href="${url}">
  191. 去试听
  192. </a>
  193. </div>`;
  194.  
  195. if (type === 'header') {
  196. template = `<div class="online-type" data-ebassistant="audio"><h2>在线试听:</h2>${template}</div>`;
  197. }
  198.  
  199. if (type === 'parent') {
  200. template = `<div class="gray_ad online-partner"><h2>在线试听:</h2>${template}</div>`;
  201. }
  202.  
  203. return template;
  204. }
  205.  
  206. let html_template_partner;
  207. if ($('.online-type[data-ebassistant="audio"]').length) { // 如果有试读听条目
  208. html_template_partner = constructHtmlTemplatePartner();
  209. $('.online-type[data-ebassistant="audio"] h2').after(html_template_partner);
  210. } else if ($('.online-type[data-ebassistant="read"]').length) { // 如果没有试读听条目,但有试读条目
  211. html_template_partner = constructHtmlTemplatePartner('header');
  212. $('.online-type[data-ebassistant="read"]').after(html_template_partner);
  213. } else { // 如果既没有试读听条目,也没有试读条目
  214. if ($('.gray_ad.online-partner').length) { // 如果有 <div class="gray_ad online-partner"> 节点,插入元素
  215. html_template_partner = constructHtmlTemplatePartner('header');
  216. $('.gray_ad.online-partner').after(html_template_partner);
  217. } else { // 如果没有 <div class="gray_ad online-partner"> 节点,创建节点
  218. html_template_partner = constructHtmlTemplatePartner('parent');
  219. $('#buyinfo').append(html_template_partner);
  220. }
  221. }
  222.  
  223. }
  224. }
  225. GM_xmlhttpRequest({
  226. method: "GET",
  227. url: `${REST_URL}/ximalaya?isbn=${isbn}&title=${title}&subtitle=${subtitle}&author=${author}&translator=${translator}&publisher=${publisher}&version=${version}&r=${Math.random()}`,
  228. headers: {
  229. "User-agent": window.navigator.userAgent,
  230. "X-Referer": window.location.href
  231. },
  232. onload: handleResponse
  233. });
  234. }
  235.  
  236. // 同步图书元数据
  237. const syncMetadata = (isbn, metadata) => {
  238. GM_xmlhttpRequest({
  239. method: "POST",
  240. url: `${REST_URL}/sync_metadata?isbn=${isbn}&version=${version}&r=${Math.random()}`,
  241. headers: {
  242. "Content-Type": "application/json",
  243. "User-agent": window.navigator.userAgent,
  244. "X-Referer": window.location.href,
  245. "X-Unique-ID": x_unique_id
  246. },
  247. data: JSON.stringify(metadata),
  248. onload: (responseDetail) => {
  249. const result = JSON.parse(responseDetail.responseText);
  250. console.log(result);
  251. }
  252. });
  253. }
  254.  
  255. // 样式调整:添加新样式
  256. const addNewStyle = () => {
  257. const new_style = `<style type="text/css" media="screen">
  258. /* 豆瓣读书页面 */
  259. .eba_vendor_icon {
  260. text-decoration: none;
  261. display: inline-block;
  262. vertical-align: middle;
  263. width: 15px;
  264. height: 15px;
  265. margin-top: -2px;
  266. border: 0;
  267. border-radius: 50%;
  268. box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.6);
  269. }
  270.  
  271. /* 微信读书页面 */
  272. .douban_rating {
  273. width: 75px;
  274. height: 15px;
  275. display: inline-block;
  276. background-image: url("${base64_icon_douban_rating}");
  277. background-size: 75px 165px;
  278. background-repeat: no-repeat;
  279. }
  280. .douban_rating_star_0 {
  281. background-position: 0 -150px;
  282. }
  283. .douban_rating_star_1 {
  284. background-position: 0 -135px;
  285. }
  286. .douban_rating_star_2 {
  287. background-position: 0 -120px;
  288. }
  289. .douban_rating_star_3 {
  290. background-position: 0 -105px;
  291. }
  292. .douban_rating_star_4 {
  293. background-position: 0 -90px;
  294. }
  295. .douban_rating_star_5 {
  296. background-position: 0 -75px;
  297. }
  298. .douban_rating_star_6 {
  299. background-position: 0 -60px;
  300. }
  301. .douban_rating_star_7 {
  302. background-position: 0 -45px;
  303. }
  304. .douban_rating_star_8 {
  305. background-position: 0 -30px;
  306. }
  307. .douban_rating_star_9 {
  308. background-position: 0 -15px;
  309. }
  310. .douban_rating_star_10 {
  311. background-position: 0 0;
  312. }
  313. </style>`;
  314. $("html").append(new_style);
  315. }
  316.  
  317. // 豆瓣读书页面主函数
  318. const doubanMain = () => {
  319. try {
  320. const types = ['在线试读', '在线试听'];
  321. const data = ['read', 'audio'];
  322. types.forEach((type, index) => {
  323. $('.online-partner .online-type h2:contains("' + type + '")').parent('.online-type').attr("data-ebassistant", data[index]); // 添加 data-ebassistant 属性
  324. });
  325. } catch(e) {
  326. console.log(e);
  327. }
  328.  
  329. let _doc = document.documentElement.innerHTML;
  330. const regex_linked_data = /<script type="application\/ld\+json">([\s\S]+?)<\/script>/gi;
  331. let linked_data = JSON.parse(regex_linked_data.exec(_doc)[1].trim());
  332. const { isbn, name: title, url } = linked_data;
  333. const author = linked_data.author.map(author => author.name).join(', ');
  334.  
  335. _doc = _doc.replace(/&nbsp;/gi, " ");
  336.  
  337. // 豆瓣评分 rating_score
  338. let rating_score = extractData(_doc, /<strong class="ll rating_num " property="v:average">([\s\S]+?)<\/strong>/gi);
  339. // 出版社 publisher
  340. let publisher = extractData(_doc, /<span class="pl">\s*出版社:?<\/span>\s*:?\s*<a[^>]+>([\s\S]+?)<\/a>/gi);
  341. if (!publisher) {
  342. publisher = extractData(_doc, /<span class="pl">\s*出版社:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi);
  343. }
  344. // 出品方 producer
  345. let producer = extractData(_doc, /<span class="pl">\s*出品方:?<\/span>\s*:?\s*<a[^>]+>([\s\S]+?)<\/a>/gi);
  346. if (!producer) {
  347. producer = extractData(_doc, /<span class="pl">\s*出品方:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi);
  348. }
  349. // 副标题 subtitle
  350. let subtitle = extractData(_doc, /<span class="pl">\s*副标题:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi);
  351. // 原作名 original_title
  352. let original_title = extractData(_doc, /<span class="pl">\s*原作名:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi);
  353. // 译者 translator
  354. let translator = extractData(_doc, /<span class="pl">\s*译者:?<\/span>\s*:?\s*<a[^>]+>([\s\S]+?)<\/a>/gi);
  355. if (!translator) {
  356. translator = extractData(_doc, /<span class="pl">\s*译者:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi);
  357. }
  358. // 出版年 published
  359. let published = extractData(_doc, /<span class="pl">\s*出版年:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi);
  360. // 页数 pages
  361. let pages = extractData(_doc, /<span class="pl">\s*页数:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi);
  362. // 定价 price
  363. let price = extractData(_doc, /<span class="pl">\s*定价:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi);
  364. // 装帧 binding
  365. let binding = extractData(_doc, /<span class="pl">\s*装帧:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi);
  366. // 丛书 series
  367. let series = extractData(_doc, /<span class="pl">\s*丛书:?<\/span>\s*:?\s*<a[^>]+>([\s\S]+?)<\/a>/gi);
  368. if (!series) {
  369. series = extractData(_doc, /<span class="pl">\s*丛书:?<\/span>\s*:?\s*([\s\S]+?)<br\/?>/gi);
  370. }
  371. // 内容简介 description
  372. let description = extractData(_doc, /<meta property="og:description" content="([^"]+?)"/gi);
  373. description = description.replace(/<[^>]+>|\n/g, "");
  374. // 封面图片 cover_url
  375. let cover_url = extractData(_doc, /<meta property="og:image" content="([^"]+?)"/gi);
  376. // 🚀🎉🎊🥳 图书元数据开放接口已上线,可前往 https://forms.gle/91z4wrtQngrbkK1g9 申请使用。
  377. const metadata = {
  378. isbn, rating_score, url, title, author, publisher, producer, subtitle, original_title, translator, published, pages, price, binding, series, description, cover_url
  379. };
  380. console.log(metadata);
  381.  
  382. queryWeread(isbn, title, subtitle, author, translator, publisher);
  383. queryDuokan(isbn, title, subtitle, author, translator, publisher);
  384. queryJingdong(isbn, title, subtitle, author, translator, publisher);
  385. queryDangdang(isbn, title, subtitle, author, translator, publisher);
  386. queryXimalaya(isbn, title, subtitle, author, translator, publisher);
  387. syncMetadata(isbn, metadata);
  388. };
  389. const extractData = (doc, regex) => {
  390. try {
  391. return regex.exec(doc)[1].trim();
  392. } catch(e) {
  393. console.log(e);
  394. return "";
  395. }
  396. };
  397.  
  398. // 微信读书页面主函数
  399. const wereadMain = () => {
  400. let vbookid = "";
  401. const locationHref = window.location.href;
  402. const match = locationHref.match(/(?:bookDetail|reader)\/([0-9a-zA-Z]+)/);
  403.  
  404. if (match && match[1].length <= 24) {
  405. vbookid = match[1];
  406. console.log(vbookid);
  407. } else {
  408. console.log('vbookid not match.');
  409. return;
  410. }
  411.  
  412. const handleResponse = (responseDetail) => {
  413. const result = JSON.parse(responseDetail.responseText);
  414. console.log(result);
  415. if (result.errmsg === "") {
  416. const { url, douban_rating_score, douban_rating_star } = result.data;
  417. const book_ratings_container = $(".book_ratings_container");
  418. const douban_info = `
  419. <div id="eba_douban_rating" class="book_ratings_header" style="margin-bottom:24px;cursor:pointer!important;">
  420. <a style="text-decoration:none!important;color:#1b88ee!important;" target="_blank" href="${url}">
  421. <span style="display:flex;align-items:center;">
  422. <img src="${base64_icon_douban}" style="display:inline-block;height:15px;">
  423. <span style="display:inline-block;height:24px;padding:0 4px;">豆瓣评分&nbsp;${douban_rating_score}&nbsp;</span>
  424. <span class="douban_rating ${douban_rating_star}"></span>
  425. </span>
  426. </a>
  427. </div>`;
  428. $("#eba_douban_rating").remove();
  429. book_ratings_container.prepend(douban_info);
  430. }
  431. };
  432.  
  433. GM_xmlhttpRequest ({
  434. method: "GET",
  435. url: `${REST_URL}/weread/douban_info?vbookid=${vbookid}&version=${version}&r=${Math.random()}`,
  436. headers: {
  437. "User-agent": window.navigator.userAgent,
  438. "X-Referer": window.location.href,
  439. "X-Unique-ID": x_unique_id
  440. },
  441. onload: handleResponse
  442. });
  443. };
  444.  
  445. // 主函数
  446. (() => {
  447. 'use strict';
  448. addNewStyle();
  449. const hostname = window.location.hostname;
  450. if (/book\.douban\.com/.test(hostname)) {
  451. doubanMain();
  452. } else if (/weread\.qq\.com/.test(hostname)) {
  453. setTimeout(() => wereadMain(), 100);
  454. }
  455. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址