[可能失效]番茄全文在线免费读

番茄小说免费网页阅读 不用客户端 可下载小说

安装此脚本?
作者推荐脚本

您可能也喜欢七猫全文在线免费读

安装此脚本
  1. // ==UserScript==
  2. // @name [可能失效]番茄全文在线免费读
  3. // @namespace https://shequ.codemao.cn/user/2856172
  4. // @namespace https://github.com/ibxff
  5. // @version 4...2.8.4.3+
  6. // @description 番茄小说免费网页阅读 不用客户端 可下载小说
  7. // @description:zh-cn 番茄小说免费网页阅读 不用客户端 可下载小说
  8. // @description:en Fanqien Novel Reading, No Need for a Client, Novels Available for Download
  9. // @author ibxff
  10. // @license MIT License
  11. // @match https://fanqienovel.com/*
  12. // @require https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js
  13. // @icon data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0zNS40Mjg2IDQuODg0MzVDMzkuNjQ2MyA0Ljg4NDM1IDQzLjA4MTYgOC4zMTk3MyA0My4wODE2IDEyLjUzNzRWMzUuNDI4NkM0My4wODE2IDM5LjY0NjMgMzkuNjQ2MyA0My4wODE2IDM1LjQyODYgNDMuMDgxNkgxMi41Mzc0QzguMzE5NzMgNDMuMDgxNiA0Ljg4NDM1IDM5LjY0NjMgNC44ODQzNSAzNS40Mjg2VjEyLjUzNzRDNC44ODQzNSA4LjMxOTczIDguMzE5NzMgNC44ODQzNSAxMi41Mzc0IDQuODg0MzVIMzUuNDI4NlpNMzUuNDI4NiA0SDEyLjUzNzRDNy44MDk1MiA0IDQgNy44MDk1MiA0IDEyLjUzNzRWMzUuNDI4NkM0IDQwLjE1NjUgNy44MDk1MiA0My45NjYgMTIuNTM3NCA0My45NjZIMzUuNDI4NkM0MC4xNTY1IDQzLjk2NiA0My45NjYgNDAuMTU2NSA0My45NjYgMzUuNDI4NlYxMi41Mzc0QzQ0IDcuODA5NTIgNDAuMTU2NSA0IDM1LjQyODYgNFoiIGZpbGw9IiMzMzMiLz48cGF0aCBkPSJNMjkuMTAxNiA0VjEyLjQwMTRMMzIuMzMyOSAxMC41NjQ2TDM1LjU2NDEgMTIuNDAxNFY0SDI5LjEwMTZaIiBmaWxsPSIjMzMzIi8+PHBhdGggZD0iTTI0LjAzNCAxOC4yODU4QzE1LjgzNjcgMTguMjg1OCA4LjU1NzgyIDIxLjg1NzIgNCAyNy4zNjc0VjM1LjQyODZDNCA0MC4xNTY1IDcuODA5NTIgNDMuOTY2IDEyLjUzNzQgNDMuOTY2SDM1LjQyODZDNDAuMTU2NSA0My45NjYgNDMuOTY2IDQwLjE1NjUgNDMuOTY2IDM1LjQyODZWMjcuMjY1NEMzOS40MDgyIDIxLjc4OTIgMzIuMTk3MyAxOC4yODU4IDI0LjAzNCAxOC4yODU4Wk0xNC42MTIyIDM3LjY3MzVDMTMuMTE1NiAzNy42NzM1IDEyLjQwMTQgMzcuMTI5MyAxMi40MDE0IDM2LjQxNUMxMi40MDE0IDM1LjcwMDcgMTMuMDgxNiAzNS4xMjI1IDE0LjU3ODIgMzUuMTIyNUMxNi4wNzQ4IDM1LjEyMjUgMTcuODc3NiAzNi4zODEgMTcuODc3NiAzNi4zODFDMTcuODc3NiAzNi4zODEgMTYuMTA4OCAzNy42NzM1IDE0LjYxMjIgMzcuNjczNVpNMTUuODM2NyAzMS4yMTA5QzE0Ljc0ODMgMzAuMTU2NSAxNC42NDYzIDI5LjI3MjIgMTUuMTU2NSAyOC43NjJDMTUuNjY2NyAyOC4yNTE4IDE2LjU1MSAyOC4zMTk4IDE3LjYzOTUgMjkuNDA4MkMxOC43Mjc5IDMwLjQ2MjYgMTkuMDY4IDMyLjYwNTUgMTkuMDY4IDMyLjYwNTVDMTkuMDY4IDMyLjYwNTUgMTYuODkxMiAzMi4yNjU0IDE1LjgzNjcgMzEuMjEwOVpNMjQuMDM0IDMwLjQ2MjZDMjQuMDM0IDMwLjQ2MjYgMjIuNzQxNSAyOC43Mjc5IDIyLjcwNzUgMjcuMTk3M0MyMi43MDc1IDI1LjcwMDcgMjMuMjUxNyAyNC45ODY0IDIzLjk2NiAyNC45ODY0QzI0LjY4MDMgMjQuOTg2NCAyNS4yNTg1IDI1LjY2NjcgMjUuMjU4NSAyNy4xNjMzQzI1LjI5MjUgMjguNjkzOSAyNC4wMzQgMzAuNDYyNiAyNC4wMzQgMzAuNDYyNlpNMzAuMzYwNSAyOS4zNzQyQzMxLjQ0OSAyOC4zMTk4IDMyLjMzMzMgMjguMjUxOCAzMi44NDM1IDI4LjcyNzlDMzMuMzUzNyAyOS4yMzgxIDMzLjI1MTcgMzAuMTIyNSAzMi4xNjMzIDMxLjE3NjlDMzEuMDc0OCAzMi4yMzEzIDI4LjkzMiAzMi41Mzc1IDI4LjkzMiAzMi41Mzc1QzI4LjkzMiAzMi41Mzc1IDI5LjI3MjEgMzAuNDI4NiAzMC4zNjA1IDI5LjM3NDJaTTMzLjM1MzcgMzcuNjczNUMzMS44NTcxIDM3LjY3MzUgMzAuMDg4NCAzNi4zNDcgMzAuMDg4NCAzNi4zNDdDMzAuMDg4NCAzNi4zNDcgMzEuODU3MSAzNS4wODg1IDMzLjM4NzggMzUuMDg4NUMzNC44ODQ0IDM1LjA4ODUgMzUuNTk4NiAzNS43MDA3IDM1LjU2NDYgMzYuMzgxQzM1LjU2NDYgMzcuMTI5MyAzNC44NTAzIDM3LjY3MzUgMzMuMzUzNyAzNy42NzM1WiIgZmlsbD0iIzMzMyIvPjwvc3ZnPg==
  14. // @grant GM_xmlhttpRequest
  15. // ==/UserScript==
  16. const styleElement = document.createElement("style");
  17. const cssRule = `
  18. @keyframes hideAnimation {
  19. 0% {
  20. opacity: 1;
  21. }
  22. 50% {
  23. opacity: 0.75;
  24. }
  25. 100% {
  26. opacity: 0;
  27. display: none;
  28. }
  29. }
  30. option:checked {
  31. background-color: #ffb144;
  32. color: white;
  33. }
  34. `;
  35. styleElement.innerHTML = cssRule;
  36. document.head.appendChild(styleElement);
  37. function hideElement(ele) {
  38. ele.style.animation = "hideAnimation 1.5s ease";
  39. ele.addEventListener("animationend", function () {
  40. ele.style.display = "none";
  41. });
  42. }
  43. function sleep(ms) {
  44. return new Promise(resolve => setTimeout(resolve, ms));
  45. }
  46. const mark=(ele)=>ele.style.boxShadow = "0px 0px 50px rgba(0, 0, 0, 0.2)";
  47. (function() {
  48. 'use strict';
  49. switch(window.location.href.match(/\/([^/]+)\/\d/)[1]){
  50. case 'reader':
  51. const div=document.querySelector("#app > div > div > div > div.reader-toolbar > div > div.reader-toolbar-item.reader-toolbar-item-download")
  52. const text=div.querySelector('div:nth-child(2)')
  53. mark(div)
  54. div.querySelector('div:nth-child(2)').innerHTML='处理中'
  55. document.title=document.title.replace(/在线免费阅读_番茄小说官网$/, '')
  56. var currentURL=window.location.href
  57. setInterval(() => window.location.href !== currentURL ? location.reload() : null, 1000);
  58. const cdiv=document.getElementsByClassName('muye-reader-content noselect')[0]
  59. cdiv.classList=cdiv.classList[0]
  60. const url = window.location.href;
  61. const regex = /\/(\d+)/;
  62. const match = url.match(regex);
  63. const extractedId = match[1];
  64. const apiUrl = `http://fq.travacocro.com/content?item_id=${extractedId}`;//`https://novel.snssdk.com/api/novel/book/reader/full/v1/?device_platform=android&parent_enterfrom=novel_channel_search.tab.&aid=2329&platform_id=1&group_id=${extractedId}&item_id=${extractedId}`;
  65. GM_xmlhttpRequest({
  66. method: "GET",
  67. url: apiUrl,
  68. onload: function(response) {
  69. if (response.status === 200) {
  70. const data = JSON.parse(response.responseText);
  71. //const content = data.data.content;
  72. let content = data.data.data.content;
  73. console.log(content);
  74. document.getElementsByClassName('muye-to-fanqie')[0] ?. remove()
  75. /*
  76. const regex = /<article>([\s\S]*?)<\/article>/;
  77. const match = content.match(regex)[1]
  78. cdiv.innerHTML=match
  79. */
  80. cdiv.innerHTML=content.replace(/\n/g, "</p>").replace(/  /g,"<p>");
  81. div.style.backgroundColor='#B0E57C'
  82. text.innerHTML='成功'
  83. hideElement(div)
  84. }
  85. },
  86. onerror: function(error) {
  87. div.style.backgroundColor='pink'
  88. text.innerHTML='失败'
  89. hideElement(div)
  90. console.error(`Fetch error: ${error}`);
  91. }
  92. });
  93. break;
  94. case 'page':
  95. const title = document.querySelector("#app > div > div.muye.muye-page > div > div.page-wrap > div > div.page-header-info > div.info > div.info-name > h1").innerHTML
  96. var content='使用油猴插件(番茄小说读或下全文)下载\n'+
  97. +document.querySelector("#app > div > div.muye.muye-page > div > div.page-wrap > div > div.page-header-info > div.info > div.info-name > h1").innerHTML+'\n'
  98. +document.getElementsByClassName('page-header-info')[0].textContent
  99. .replace('继续阅读').replace('下载番茄小说').replace('开始阅读').replace('*下载全本')
  100. +'\n'+document.querySelector("#app > div > div.muye.muye-page > div > div.page-body-wrap > div > div.page-abstract-content > p").innerHTML
  101. content=content.replace(/undefined|null|NaN/g,'')
  102. console.log(content)
  103. sleep(1500).then(()=>{
  104. document.querySelector("#app > div > div.muye.muye-page > div > div.page-wrap > div > div.page-header-info > div.info > div.download-icon.muyeicon-tomato").remove()
  105. const download=document.querySelector("#app > div > div.muye.muye-page > div > div.page-wrap > div > div.page-header-info > div.info > a")
  106. download.querySelector('button > span').innerHTML='*下载全本'
  107. download.href='javascript:void 0'
  108. const parentElement = document.querySelector("#app > div > div.muye.muye-page > div > div.page-wrap > div > div.page-header-info > div.info");
  109. const selectElement = document.createElement("select");
  110. selectElement.className = "byte-btn byte-btn-primary byte-btn-size-large byte-btn-shape-square muye-button";
  111. const options = [
  112. {text: "UTF-8" },
  113. {text: "GBK" },
  114. {text: "UNICODE" },
  115. {text:'UTF-16'},
  116. {text:'ASCII'}
  117. ];
  118. options.forEach(function(optionData) {
  119. var option = document.createElement("option");
  120. option.text = optionData.text;
  121. option.value= optionData.text
  122. selectElement.appendChild(option);
  123. });
  124. selectElement.style.position = "absolute";
  125. selectElement.style.left = "320px";
  126. selectElement.style.bottom = "0px";
  127. selectElement.style.height = "32px";
  128. selectElement.style.width = "80px";
  129. selectElement.style.fontSize = "15px";
  130. parentElement.appendChild(selectElement);
  131. const books=Array.from(document.getElementsByClassName('chapter-item'))
  132. //books.shift()
  133. //var index=0
  134. var accomplish=false
  135. function next(){
  136. const ele=books[0].querySelector('a')
  137. ele.style.border = "3px solid navajowhite"
  138. ele.style.borderRadius = "5px"
  139. ele.style.backgroundColor = "navajowhite"
  140. const url = ele.href;
  141. console.log(url)
  142. const regex = /\/(\d+)/;
  143. const match = url.match(regex);
  144. const extractedId = match[1];
  145. const apiURL = `http://fq.travacocro.com/content?item_id=${extractedId}`;//`https://novel.snssdk.com/api/novel/book/reader/full/v1/?device_platform=android&parent_enterfrom=novel_channel_search.tab.&aid=2329&platform_id=1&group_id=${extractedId}&item_id=${extractedId}`;
  146. const charset=selectElement.value
  147. content+='\n\n'+ele.innerHTML+'\n'
  148. GM_xmlhttpRequest({
  149. method: "GET",
  150. url: apiURL,
  151. 'Content-Type': "application/json; charset="+charset,
  152. onload: function(response) {
  153. if (response.status === 200) {
  154. try{
  155. const data = JSON.parse(response.responseText);
  156. content += data.data.data.content;
  157. /*
  158. const rcontent = data.data.content;
  159. const regex = /<article>([\s\S]*?)<\/article>/;
  160. const match = rcontent.match(regex)[1]
  161. content+=match.replace(/<\/p>/g,'\n').replace(/<\w+>/g,'').replace(/<[^>]*>/g , '')
  162. */
  163. ele.style.backgroundColor='#D2F9D1'
  164. ele.style.border = "2px solid #D2F9D1"
  165. //index+=1
  166. books.shift()
  167. console.log(books)
  168. if(!books.length){
  169. console.log('执行完成 开始保存')
  170. console.log(charset)
  171. const blob = new Blob([new TextEncoder(charset).encode(content)], { type: `text/plain;charset=`+charset });
  172. saveAs(blob, title+".txt");
  173. return
  174. }
  175. else{
  176. next()
  177. }
  178. }
  179. catch(e){
  180. ele.style.backgroundColor='pink'
  181. ele.style.border = "2px solid pink"
  182. next()
  183. }
  184. }
  185. },
  186. onerror: function(error) {
  187. hideElement(div)
  188. console.error(`Fetch error: ${error}`);
  189. ele.style.backgroundColor='pink'
  190. ele.style.border = "2px solid pink"
  191. //index+=1
  192. next()
  193. }
  194. ,
  195. ontimeout : function(error) {
  196. hideElement(div)
  197. console.error(`Fetch error: ${error}`);
  198. ele.style.backgroundColor='pink'
  199. ele.style.border = "2px solid pink"
  200. //index+=1
  201. next()
  202. }
  203. });
  204. }
  205. download.addEventListener('click',next)
  206. download.addEventListener('click',()=>{download.style.display='none';selectElement.style.display='none'})
  207. })
  208. break;
  209. }
  210. }
  211. )();

QingJ © 2025

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