GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 45|回复: 2
收起左侧

[实用工具] 【垃圾圣女】TT1069帖子提取工具

[复制链接] |关注本帖

GM活动员

组件大师

『召唤好运的角笛』河豚寿司荧光水母

     楼主| 咸鱼鱼 发表于 2 小时前 | 显示全部楼层 |阅读模式 <
    本帖最后由 咸鱼鱼 于 2025-12-27 05:31 编辑

    最近在TT1069看小说,有些喜欢的文想复制存下来

    但是直接复制有乱码,于是看了一下代码
    乱码以白色文字的形式出现在以下地方
    <font class="jammer">.*?<\/font>
    <span style="display:none">.*?<\/span>
    全局替换一下即可

    又因为有些帖子好几页,于是弄了一个直接下载所有页数的
    记得点击只看作者下载,
    不过因为作者可能还会聊天互动什么的,下载完了还是要删一删
    如果你还需要修改其他功能
    找AI改比我快

    @Name
    @name
    @match
    @match

    1. // ==UserScript==
    2. // @name         多页帖子提取器
    3. // @namespace    http://tampermonkey.net/
    4. // @version      1.1
    5. // @description  提取多页postmessage内容,过滤乱码,使用页面标题
    6. // @author       You
    7. // @match        https://www.tt1069.com/bbs/forum.php?mod=viewthread*
    8. // @match        https://www.tt1069.com/bbs/thread-*
    9. // @grant        GM_xmlhttpRequest
    10. // ==/UserScript==

    11. (function() {
    12.     'use strict';

    13.     // 创建按钮
    14.     const btn = document.createElement('button');
    15.     btn.innerHTML = '提取全部内容';
    16.     btn.style.cssText = `
    17.         position: fixed;
    18.         top: 20px;
    19.         right: 20px;
    20.         z-index: 9999;
    21.         padding: 10px;
    22.         background: #2196F3;
    23.         color: white;
    24.         border: none;
    25.         border-radius: 5px;
    26.         cursor: pointer;
    27.     `;
    28.     document.body.appendChild(btn);

    29.     // 获取标题
    30.     function getTitle() {
    31.         const titleElement = document.querySelector("#thread_subject");
    32.         return titleElement ? titleElement.textContent.trim() : document.title;
    33.     }

    34.     // 过滤乱码
    35.     function cleanText(text) {
    36.         return text
    37.             .replace(/<font class="jammer">.*?<\/font>/g, '')
    38.             .replace(/<span style="display:none">.*?<\/span>/g, '')
    39.             .replace(/<[^>]*>/g, '')
    40.             .replace(/&lt;/g, '<')
    41.             .replace(/&gt;/g, '>')
    42.             .replace(/&nbsp;/g, ' ')
    43.             .trim();
    44.     }

    45.     // 获取总页数
    46.     function getTotalPages() {
    47.         const pageElement = document.querySelector("#pgt > div > div > label > span");
    48.         if (pageElement) {
    49.             const title = pageElement.getAttribute('title');
    50.             if (title && title.includes('頁')) {
    51.                 const match = title.match(/(\d+)/);
    52.                 return match ? parseInt(match[1]) : 1;
    53.             }
    54.         }
    55.         return 1;
    56.     }

    57.     // 获取当前页面内容
    58.     function getCurrentPageContent() {
    59.         const elements = document.querySelectorAll('[id^="postmessage"]');
    60.         let content = '';

    61.         elements.forEach((el, i) => {
    62.             const cleanContent = cleanText(el.innerHTML);
    63.             if (cleanContent) {
    64.                 content += `=== 第${i + 1}楼 ===\n${cleanContent}\n\n`;
    65.             }
    66.         });

    67.         return content;
    68.     }

    69.     // 获取其他页面内容
    70.     function getPageContent(pageNum, currentTotalPosts) {
    71.         return new Promise((resolve) => {
    72.             const currentUrl = window.location.href;
    73.             const baseUrl = currentUrl.split('&page=')[0];
    74.             const pageUrl = `${baseUrl}&page=${pageNum}`;

    75.             GM_xmlhttpRequest({
    76.                 method: "GET",
    77.                 url: pageUrl,
    78.                 onload: function(response) {
    79.                     const parser = new DOMParser();
    80.                     const doc = parser.parseFromString(response.responseText, "text/html");
    81.                     const elements = doc.querySelectorAll('[id^="postmessage"]');
    82.                     let content = '';

    83.                     elements.forEach((el, i) => {
    84.                         const cleanContent = cleanText(el.innerHTML);
    85.                         if (cleanContent) {
    86.                             const floorNumber = currentTotalPosts + i + 1;
    87.                             content += `=== 第${floorNumber}楼 ===\n${cleanContent}\n\n`;
    88.                         }
    89.                     });

    90.                     resolve({
    91.                         content: content,
    92.                         postCount: elements.length
    93.                     });
    94.                 },
    95.                 onerror: function() {
    96.                     resolve({ content: '', postCount: 0 });
    97.                 }
    98.             });
    99.         });
    100.     }

    101.     // 点击事件
    102.     btn.addEventListener('click', async function() {
    103.         btn.innerHTML = '提取中...';
    104.         btn.disabled = true;

    105.         const title = getTitle();
    106.         const totalPages = getTotalPages();
    107.         let allContent = `标题:${title}\n总页数:${totalPages}\n\n`;

    108.         // 获取当前页面内容
    109.         const currentPageContent = getCurrentPageContent();
    110.         allContent += currentPageContent;

    111.         // 计算当前页面已处理的帖子数量
    112.         const currentPagePosts = document.querySelectorAll('[id^="postmessage"]').length;
    113.         let totalProcessedPosts = currentPagePosts;

    114.         // 获取其他页面内容
    115.         for (let page = 2; page <= totalPages; page++) {
    116.             const result = await getPageContent(page, totalProcessedPosts);
    117.             allContent += result.content;
    118.             totalProcessedPosts += result.postCount;
    119.         }

    120.         // 添加统计信息
    121.         allContent += `\n=== 统计 ===\n总楼层数:${totalProcessedPosts}\n提取时间:${new Date().toLocaleString()}`;

    122.         // 下载文件
    123.         const blob = new Blob([allContent], { type: 'text/plain;charset=utf-8' });
    124.         const a = document.createElement('a');
    125.         a.href = URL.createObjectURL(blob);
    126.         a.download = `${title}.txt`;
    127.         a.click();

    128.         btn.innerHTML = '提取全部内容';
    129.         btn.disabled = false;
    130.     });
    131. })();
    复制代码
    回复

    使用道具 举报

    荧光水母百相千面-戏艾吉奥岛田半藏诺克提斯·路西斯·伽拉姆萨菲罗斯岛田源氏BIG BOSS康纳/ConnorDoc

      2302594 发表于 1 小时前 | 显示全部楼层 <
      回复

      使用道具 举报

        wsnbb250 发表于 半小时前 | 显示全部楼层 <
        回复

        使用道具 举报

        您需要登录后才可以回帖 登录 | 立即注册

        本版积分规则

        关闭

        站长公告上一条 /1 下一条

        文字版|手机版|小黑屋|GameMale

        GMT+8, 2025-12-27 07:42 , Processed in 0.059953 second(s), 41 queries , Redis On.

        Copyright © 2013-2025 GameMale

        All Rights Reserved.

        快速回复 返回列表