您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Improves readability and allows EBOOK DOWNLOADS!
// ==UserScript== // @name Fanfiction+ // @namespace DanielVestol.Fanfiction.net // @description Improves readability and allows EBOOK DOWNLOADS! // @include https://www.fanfiction.net/* // @include https://www.fictionpress.com/s/* // @version 1.20.0 // @grant GM_xmlhttpRequest // ==/UserScript== // SETTINGS const config = { ebookServer: "http://ebook.danielv.no", // ebookServer: "http://localhost", }; // END OF SETTINGS console.log("DOM fully loaded and parsed"); // Better change between mobile and desktop edition. // Credits to SirCxyrtyx for snippet var mobileVersion = 'location = "https://m.fanfiction.net' + document.location.pathname + '"'; // console.log(mobileVersion); document.getElementsByClassName('icon-kub-mobile')[0].setAttribute('onclick', mobileVersion); // run code depending on what subpage we are on // for main page if (document.location.pathname == "/") { // Changing some simple styles document.getElementById('content_wrapper').style.maxWidth = '800px'; // appending a style tag in HTML $('#top').append('<style>tr>td>div>ins{display:none !important;}.zmenu{display:none !important;}p{-webkit-touch-callout: text;-webkit-user-select: text;-khtml-user-select: text;-moz-user-select: text;-ms-user-select: text;user-select: text;}</style>'); } if (document.location.pathname.substr(0, 3) == "/s/") { // Changing some simple styles $('#top').append('<style>tr>td>div>ins{display:none !important;}.zmenu{display:none !important;}p{-webkit-touch-callout: text;-webkit-user-select: text;-khtml-user-select: text;-moz-user-select: text;-ms-user-select: text;user-select: text;}</style>'); document.getElementById('content_wrapper').style.maxWidth = '800px'; // OCD friendly review field var review = document.getElementById('review'); review.getElementsByTagName('TD')[0].remove(); review.getElementsByTagName('TD')[0].remove(); // Remove element 1 which is now 0 review.getElementsByTagName('DIV')[0].style.maxWidth = '765px'; review.getElementsByTagName('DIV')[0].style.margin = '10px'; document.getElementById('review_name_value').style.maxWidth = '780px'; document.getElementById('review_review').style.maxWidth = '780px'; // // Show whole book function // $('#content_wrapper_inner > span:nth-child(7)').append('<button id="myShit" class="btn" type="BUTTON">Show whole book</button>'); document.getElementById('myShit').addEventListener('click', function () { document.getElementById('storytextp').innerHTML = "<div id='topSuprSecret' style='position:fixed;top:100px;left:100px;width:auto;height:70px;padding-left:20px;padding-right:20px;background-color:#A2DEF2;'><h1>Loading book...</h1></div>"; $.ajaxSetup({ async: false }); setTimeout(function () { //timeout to let it get us a progress bar ish thing for (let i = chapter; i < document.getElementById('chap_select').options.length + 1; i++) { // chapter is variable used by fanfiction, it counts what chapter you are at starting at 1. // my own call to get chapter has +1 because it fetches a list starting at 0 instead. console.log("Downloading " + document.location.pathname.substr(3, 8).replace("/", "") + " chapter " + i); var $div = $('<div>'); $div.load('https://www.fanfiction.net/s/' + document.location.pathname.substr(3, 8).replace("/", "") + '/' + i + ' #storytext', function () { // now $(this)[0].innerHTML contains #storytext $("#storytextp").append($(this)[0].innerHTML); }); } document.getElementById('topSuprSecret').outerHTML = ''; }, 100); // end of timeout }); // // EBOOKS!!!!!!!!!!!!!!!!! // $('#content_wrapper_inner > span:nth-child(7)').append('<button id="getEbook" class="btn" type="BUTTON">ebook</button>'); document.getElementById('getEbook').addEventListener('click', function () { document.getElementById('storytextp').innerHTML = "<div id='topSuprSecret' style='position:fixed;top:100px;left:100px;width:auto;height:70px;padding-left:20px;padding-right:20px;background-color:#A2DEF2;'><h1>Loading book...</h1></div>"; $.ajaxSetup({ async: false }); getBookLegacy() // getBookWithLinks() function getBookLegacy() { let data = { ebookMethod: "legacy", title: document.querySelector("#profile_top > b").innerHTML, author: [document.querySelector("#profile_top > a").innerHTML], description: document.querySelector("#profile_top > div").innerHTML, publisher: "fanfiction.net", contents: [], bookID: document.location.pathname.substr(3, 8).replace("/", "") }; setTimeout(async function () { //timeout to let it get us a progress bar ish thing let downloaded = 0 for (let i = 1; i < document.getElementById('chap_select').options.length + 1; i++) { // chapter is variable used by fanfiction, it counts what chapter you are at starting at 1. // my own call to get chapter has +1 because it fetches a list starting at 0 instead. await sleep(0.1) console.log("Downloading " + document.location.pathname.substr(3, 8).replace("/", "") + " chapter " + i); var $div = $('<div>'); $div.load('https://www.fanfiction.net/s/' + document.location.pathname.substr(3, 8).replace("/", "") + '/' + i + ' #storytext', function () { // now $(this)[0].innerHTML contains #storytext data.contents.push({ title: document.getElementById('chap_select').options[i - 1].innerHTML, data: $(this)[0].innerHTML, }); downloaded++ document.querySelector("#topSuprSecret").innerHTML = `<h1>Downloaded ${downloaded}/${document.getElementById('chap_select').options.length}</h1>` }); } // Send request to server for ebook creation document.querySelector("#topSuprSecret").innerHTML = `<h1>Scrape complete, creating ebook...</h1>` GM_xmlhttpRequest({ method: "POST", url: config.ebookServer + "/epubify", data: JSON.stringify(data), headers: { "Content-Type": "application/json" }, onload: function (response) { let downloadURL = config.ebookServer + "/" + document.location.pathname.substr(3, 8).replace("/", "") + ".epub" console.log(response.responseText + " book is done"); if (response.responseText == "success") { // location.href = downloadURL; } else { console.log(response) alert("Could not contact ebook server. Please alert author."); } document.getElementById('topSuprSecret').outerHTML = ''; document.getElementById('storytextp').innerHTML = `<div style="margin-top: 50px;"> <h1>Ebook download links:</h1> <ol> <li><a href="${downloadURL}">${downloadURL}</a></li> <li><a href="${downloadURL.replace(".epub", ".epub.html")}">${downloadURL.replace(".epub", ".epub.html")}</a></li> <li><a href="${downloadURL.replace(".epub", "A4.pdf")}">${downloadURL.replace(".epub", "A4.pdf")}</a></li> <li><a href="${downloadURL.replace(".epub", "A5.pdf")}">${downloadURL.replace(".epub", "A5.pdf")}</a></li> </ol> <p>PDF versions will be ready in ~5 minutes.</p> </div>`; } }); }, 100); // end of timeout } function getBookWithLinks() { let data = { ebookMethod: "links", title: document.querySelector("#profile_top > b").innerHTML, author: [document.querySelector("#profile_top > a").innerHTML], description: document.querySelector("#profile_top > div").innerHTML, publisher: "fanfiction.net", contents: [], bookID: document.location.pathname.substr(3, 8).replace("/", "") }; setTimeout(function () { if (document.getElementById('chap_select')) { for (let i = 1; i < document.getElementById('chap_select').options.length + 1; i++) { data.contents[data.contents.length] = { url: 'https://www.fanfiction.net/s/' + document.location.pathname.substr(3, 8).replace("/", "") + '/' + i, dataSelector: "#storytextp", title: document.getElementById('chap_select').options[i - 1].innerHTML, }; } } else { data.contents[data.contents.length] = { url: 'https://www.fanfiction.net/s/' + document.location.pathname.substr(3, 8).replace("/", "") + '/1', dataSelector: "#storytextp", title: "Oneshot", }; } document.querySelector("#topSuprSecret").innerHTML = "<h1>Converting to epub...</h1>"; console.log(data); GM_xmlhttpRequest({ method: "POST", url: config.ebookServer + "/epubify", data: JSON.stringify(data), headers: { "Content-Type": "application/json" }, onload: function (response) { console.log(response.responseText + " book is done"); if (response.responseText == "success") { // location.href = config.ebookServer + "/" + document.location.pathname.substr(3, 8).replace("/", "") + ".epub"; } else { alert("Could not contact ebook server. Please alert author."); } document.getElementById('topSuprSecret').outerHTML = ''; } }); }, 100); // end of timeout } }); } var sleep = async s => new Promise(r => setTimeout(r, s * 1000))
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址