您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
小说详情页面点击【TXT下载】按钮开始下载
当前为
// ==UserScript== // @name 天天看小说TXT下载 // @namespace http://tampermonkey.net/ // @version 1.1.0 // @description 小说详情页面点击【TXT下载】按钮开始下载 // @author Nihaorz // @match https://www.ttkan.co/novel/chapters/* // @match https://cn.ttkan.co/novel/chapters/* // @match https://tw.ttkan.co/novel/chapters/* // @icon https://www.bg3.co/novel/imgs/apple-touch-icon-120x120.png // @require https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; let blacklist = [ '•', '▪', '●', '✿', 'щ', 'ш', 'ω', 'т', 'κ', 'д', 'ā', '¢', '℃', '○', 'Ο' ] let $ul = $('.novel_info ul:eq(0)'); let title = $ul.find('li:eq(0) h1').html(); let author = $ul.find('li:eq(1) a').html(); let filename = title + '-' + author + '.txt'; let href = window.location.href; let address = href.split('/novel/chapters/'); let novel_id = address[1]; if (novel_id.includes('\\')) { novel_id = novel_id.substring(0, novel_id.indexOf('/')); } let novel_chapters_url = address[0] + '/api/nq/amp_novel_chapters?language=cn&novel_id=' + novel_id; let wordCount = 0; let intervalId = null; let texts = []; let ajaxHtml = function(url, i) { let text; if (i == undefined) { i = 0; } $.ajax({ type: 'GET', url: url, async: false, success: function(response, status, xhr) { let contetType = xhr.getResponseHeader('Content-Type'); if (contetType.includes('json')) { i++; console.log(url + ' 请求异常,第' + i + '次重试'); text = ajaxHtml(url, i); } else { text = response; } } }); return text; } let getContents = function(html) { let arrays = $(html).find(".content p"); let contents = []; let name = $(html).find('.title h1').html(); contents.push(name); for (let i = 0; i < arrays.length; i++) { let content = $(arrays[i]).text().trim(); let flag = false; for (let j = 0; j < blacklist.length; j++) { let word = blacklist[j]; if (content.includes(word)) { flag = true; break; } } if(!flag) { contents.push(content); } } return contents; } let doDownloadAsync = function(items) { if (!intervalId) { clearInterval(intervalId); } intervalId = setInterval(function() { let count = 0; for (let i = 0; i < texts.length; i++) { let text = texts[i]; if (text && text.length > 0) { count++; } } let info = '(下载进度:' + (count / texts.length * 100).toFixed(2) + '%)'; console.log(info); $('#down-info').html(info); if (count == texts.length) { clearInterval(intervalId); intervalId = null; download(texts, filename); } }, 100); texts = new Array(items.length); for (let i = 0; i < items.length; i++) { let url = address[0] + '/novel/pagea/' + novel_id + '_' + items[i].chapter_id + '.html'; fillContent(texts, i, url); } } let fillContent = function(texts, index, url) { $.ajax({ type: 'GET', url: url, success: function(html) { let contents = getContents(html); texts[index] = contents.join('\n\n').trim() + '\n\n\n'; }, error: function() { fillContent(texts, index, url); } }); } let refersh = function(progress, wordCount) { $('#down-info').html(progress + "%"); } let download = function (strings, filename) { // 创建隐藏的可下载链接 var eleLink = document.createElement('a'); eleLink.download = filename; eleLink.style.display = 'none'; // 字符内容转变成blob地址 var blob = new Blob(strings); eleLink.href = URL.createObjectURL(blob); // 触发点击 document.body.appendChild(eleLink); eleLink.click(); // 然后移除 document.body.removeChild(eleLink); }; $('.bookmark').append('<a id="text-down" href="javascript:void(0);"> TXT下载 <span id="down-info"></span></a>'); $('#text-down').on('click', function(){ $.ajax({ type: 'GET', url: novel_chapters_url, async: false, success: function(data) { doDownloadAsync(data.items); } }); }); // Your code here... })();