- // ==UserScript==
- // @name AI Fuck CC - Simplify Module
- // @version 1.3
- // @license MIT
- // @match *
- // @description 简化脚本
- // @namespace https://greasyfork.org/users/1462884
- // ==/UserScript==
-
- var SimplifyModule = (function() { // 使用 var 或 const/let 取决于你的环境和偏好
- 'use strict';
-
- // --- 配置 (可以设为默认值,允许外部覆盖) ---
- const DEFAULT_CONFIG = {
- tokenKey: 'console_token',
- convMapKey: 'conversationIdInfo',
- aiReplySelector: 'div#ai-chat-answer',
- contentContainerSelector: '.undefined.markdown-body',
- selectorsToRemoveLatest: 'details.thinking, details.statusbar',
- selectorsToRemoveSecondLatest: 'details.optionsarea, details.memoryarea, details.thinking, details.statusbar',
- apiBaseUrl: 'https://aifuck.cc/console/api/installed-apps/',
- tryVisualUpdate: false // 新增配置:是否尝试直接更新页面DOM
- };
-
- // --- 内部辅助函数 ---
- function logDebug(...args) { console.log('[SimplifyMod DEBUG]', ...args); }
- function logInfo(...args) { console.log('[SimplifyMod INFO]', ...args); }
- function logError(...args) { console.error('[SimplifyMod ERROR]', ...args); }
-
- // ... (getAuthToken, getAppId, getConversationId - 可能需要接收 config) ...
- // ... (fetchMessages - 可能需要接收 config) ...
- // ... (updateMessageApi - 可能需要接收 config) ...
- // ... (extractSimplifiedContent - 不变) ...
- // ... (updatePageElementVisuals - 如果保留,基本不变) ...
-
- // --- 核心处理函数 (修改自 processLastTwoReplies) ---
- async function simplifyReplies(userConfig = {}) {
- const config = { ...DEFAULT_CONFIG, ...userConfig }; // 合并配置
- logInfo('Starting simplification process with config:', config);
-
- let processedCount = 0;
- let failedCount = 0;
- let simplifiedResults = []; // 存储简化结果
-
- // --- 1. 获取必要信息 ---
- const authToken = getAuthToken(config.tokenKey); // 修改 getAuthToken 以接受 key
- const appId = getAppId();
- const conversationId = getConversationId(appId, config.convMapKey); // 修改 getConversationId
-
- if (!authToken || !appId || !conversationId) {
- const errorMsg = 'Missing essential info (Token, App ID, or Conv ID).';
- logError(errorMsg);
- // 返回一个 rejected Promise
- return Promise.reject({ success: false, message: errorMsg });
- }
-
- try {
- // --- 2. 获取消息和页面元素 ---
- logInfo('Fetching message list...');
- const apiMessages = await fetchMessages(appId, conversationId, authToken, config.apiBaseUrl); // 修改 fetchMessages
- const pageReplies = document.querySelectorAll(config.aiReplySelector);
- logInfo(`Found ${pageReplies.length} AI reply elements on page.`);
- // ... (处理消息数量不匹配的警告日志) ...
-
- if (pageReplies.length === 0) {
- logInfo('No AI replies found on page. Nothing to do.');
- return Promise.resolve({ success: true, message: 'No AI replies found on page.', processedCount: 0, failedCount: 0 });
- }
-
- // --- 3. 确定处理目标 ---
- const repliesToProcess = [];
- // ... (基本同原 processLastTwoReplies 确定 latest 和 second latest 逻辑) ...
- // 确保使用 config 中的选择器
-
- // --- 4. 依次处理 ---
- for (const target of repliesToProcess) {
- logInfo(`--- Processing ${target.label} Reply (Page Index: ${target.index}) ---`);
- const contentContainer = target.element.querySelector(config.contentContainerSelector);
- if (!contentContainer) {
- logError(` - Could not find content container for ${target.label} reply. Skipping.`);
- failedCount++;
- continue;
- }
-
- // 4.1 提取简化内容
- const originalHtml = contentContainer.innerHTML; // 保存原始HTML供返回
- const simplifiedHtml = extractSimplifiedContent(contentContainer, target.selectorsToRemove);
-
- if (simplifiedHtml !== null && simplifiedHtml !== "") {
- try {
- // 4.2 API 更新
- await updateMessageApi(appId, target.apiMessage.id, simplifiedHtml, authToken, config.apiBaseUrl); // 修改 updateMessageApi
-
- // 4.3 (可选) 尝试视觉更新
- if (config.tryVisualUpdate) {
- updatePageElementVisuals(target.element.querySelector(config.contentContainerSelector), simplifiedHtml); // 调用修改后的视觉更新函数
- }
-
- // 4.4 记录成功
- processedCount++;
- simplifiedResults.push({
- messageId: target.apiMessage.id,
- index: target.index,
- originalHtml: originalHtml,
- simplifiedHtml: simplifiedHtml
- });
- logInfo(` - Successfully processed ${target.label} reply.`);
-
- } catch (updateError) {
- logError(` - Failed to update ${target.label} reply (API or Visual):`, updateError);
- failedCount++;
- }
- } else {
- logError(` - Failed to extract valid content for ${target.label} reply. Skipping update.`);
- failedCount++;
- }
- await new Promise(resolve => setTimeout(resolve, 150)); // 保留延迟
- }
-
- // --- 5. 返回最终结果 ---
- const finalMessage = `Simplification finished. Success: ${processedCount}, Failed: ${failedCount}.`;
- logInfo(`--- Processing Finished --- ${finalMessage}`);
- return Promise.resolve({
- success: processedCount > 0 || failedCount === 0, // 至少处理成功一个算成功,或者没有失败也算成功
- message: finalMessage,
- processedCount: processedCount,
- failedCount: failedCount,
- simplifiedData: simplifiedResults,
- visualUpdateAttempted: config.tryVisualUpdate
- });
-
- } catch (error) {
- logError('An overall error occurred during simplification:', error);
- return Promise.reject({
- success: false,
- message: `An unexpected error occurred: ${error.message || error}`,
- error: error
- });
- }
- }
-
- // --- 返回模块的公共接口 ---
- return {
- // 提供简化函数
- simplify: simplifyReplies,
-
- // (可选)如果主脚本需要,可以暴露一些配置或内部函数,但不推荐
- // getConfigDefaults: () => ({ ...DEFAULT_CONFIG }),
- };
-
- })(); // 立即执行
-
- // 注意:在 Tampermonkey 中,如果主脚本使用 @require 引入这个文件,
- // 主脚本可以直接使用 SimplifyModule 这个变量。