|
|
本帖最后由 咸鱼鱼 于 2025-12-27 05:31 编辑
最近在TT1069看小说,有些喜欢的文想复制存下来
但是直接复制有乱码,于是看了一下代码
乱码以白色文字的形式出现在以下地方
<font class="jammer">.*?<\/font>
<span style="display:none">.*?<\/span>
全局替换一下即可
又因为有些帖子好几页,于是弄了一个直接下载所有页数的
记得点击只看作者下载,
不过因为作者可能还会聊天互动什么的,下载完了还是要删一删
如果你还需要修改其他功能
找AI改比我快
@Name
@name
@match
@match
- // ==UserScript==
- // @name 多页帖子提取器
- // @namespace http://tampermonkey.net/
- // @version 1.1
- // @description 提取多页postmessage内容,过滤乱码,使用页面标题
- // @author You
- // @match https://www.tt1069.com/bbs/forum.php?mod=viewthread*
- // @match https://www.tt1069.com/bbs/thread-*
- // @grant GM_xmlhttpRequest
- // ==/UserScript==
- (function() {
- 'use strict';
- // 创建按钮
- const btn = document.createElement('button');
- btn.innerHTML = '提取全部内容';
- btn.style.cssText = `
- position: fixed;
- top: 20px;
- right: 20px;
- z-index: 9999;
- padding: 10px;
- background: #2196F3;
- color: white;
- border: none;
- border-radius: 5px;
- cursor: pointer;
- `;
- document.body.appendChild(btn);
- // 获取标题
- function getTitle() {
- const titleElement = document.querySelector("#thread_subject");
- return titleElement ? titleElement.textContent.trim() : document.title;
- }
- // 过滤乱码
- function cleanText(text) {
- return text
- .replace(/<font class="jammer">.*?<\/font>/g, '')
- .replace(/<span style="display:none">.*?<\/span>/g, '')
- .replace(/<[^>]*>/g, '')
- .replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/ /g, ' ')
- .trim();
- }
- // 获取总页数
- function getTotalPages() {
- const pageElement = document.querySelector("#pgt > div > div > label > span");
- if (pageElement) {
- const title = pageElement.getAttribute('title');
- if (title && title.includes('頁')) {
- const match = title.match(/(\d+)/);
- return match ? parseInt(match[1]) : 1;
- }
- }
- return 1;
- }
- // 获取当前页面内容
- function getCurrentPageContent() {
- const elements = document.querySelectorAll('[id^="postmessage"]');
- let content = '';
- elements.forEach((el, i) => {
- const cleanContent = cleanText(el.innerHTML);
- if (cleanContent) {
- content += `=== 第${i + 1}楼 ===\n${cleanContent}\n\n`;
- }
- });
- return content;
- }
- // 获取其他页面内容
- function getPageContent(pageNum, currentTotalPosts) {
- return new Promise((resolve) => {
- const currentUrl = window.location.href;
- const baseUrl = currentUrl.split('&page=')[0];
- const pageUrl = `${baseUrl}&page=${pageNum}`;
- GM_xmlhttpRequest({
- method: "GET",
- url: pageUrl,
- onload: function(response) {
- const parser = new DOMParser();
- const doc = parser.parseFromString(response.responseText, "text/html");
- const elements = doc.querySelectorAll('[id^="postmessage"]');
- let content = '';
- elements.forEach((el, i) => {
- const cleanContent = cleanText(el.innerHTML);
- if (cleanContent) {
- const floorNumber = currentTotalPosts + i + 1;
- content += `=== 第${floorNumber}楼 ===\n${cleanContent}\n\n`;
- }
- });
- resolve({
- content: content,
- postCount: elements.length
- });
- },
- onerror: function() {
- resolve({ content: '', postCount: 0 });
- }
- });
- });
- }
- // 点击事件
- btn.addEventListener('click', async function() {
- btn.innerHTML = '提取中...';
- btn.disabled = true;
- const title = getTitle();
- const totalPages = getTotalPages();
- let allContent = `标题:${title}\n总页数:${totalPages}\n\n`;
- // 获取当前页面内容
- const currentPageContent = getCurrentPageContent();
- allContent += currentPageContent;
- // 计算当前页面已处理的帖子数量
- const currentPagePosts = document.querySelectorAll('[id^="postmessage"]').length;
- let totalProcessedPosts = currentPagePosts;
- // 获取其他页面内容
- for (let page = 2; page <= totalPages; page++) {
- const result = await getPageContent(page, totalProcessedPosts);
- allContent += result.content;
- totalProcessedPosts += result.postCount;
- }
- // 添加统计信息
- allContent += `\n=== 统计 ===\n总楼层数:${totalProcessedPosts}\n提取时间:${new Date().toLocaleString()}`;
- // 下载文件
- const blob = new Blob([allContent], { type: 'text/plain;charset=utf-8' });
- const a = document.createElement('a');
- a.href = URL.createObjectURL(blob);
- a.download = `${title}.txt`;
- a.click();
- btn.innerHTML = '提取全部内容';
- btn.disabled = false;
- });
- })();
复制代码 |
评分
-
查看全部评分
|