通义千问提问自动折叠

创建于 3 个月前
更新于 19 天前
适配通义千问新版DOM结构,自动折叠长文本提问。极简统一风格日志,仅记录关键操作。
总安装量
391
今日新增
+0
用户评分
- / 5.0 (0)
当前版本
2.1
脚本详情
适用网站

通义千问提问自动折叠

TampermonkeyViolentmonkey脚本猫版本

功能简介

这是专为通义千问聊天页面设计的长文本自动折叠脚本,聚焦高性能、无内存泄漏、状态记忆三大核心优化。适配通义千问最新前端架构,全场景精准识别并折叠超长提问文本,彻底解决长文本占据大量屏幕空间的问题。

  • 智能自动折叠:页面加载/滚动/动态新增文本时,自动识别未折叠的长文本并一键收起,仅针对提问项核心区域生效。
  • 新版结构适配:针对通义千问最新 DOM 结构优化,通过 data-chat-list-key 属性精准定位,利用 SVG 旋转状态类名判断折叠状态,稳定性更强。
  • 状态记忆功能:本地保存自动折叠开关状态,刷新/重新打开页面自动恢复上次设置,无需重复配置。
  • 高性能设计:缩小 DOM 监听范围、防抖滚动触发、延长巡检间隔,相比普通版本减少无效 DOM 操作,不占用页面性能。
  • 可视化开关:页面右上角悬浮开关按钮,一键切换「开启/关闭」,按钮颜色区分状态(蓝色=开启,灰色=关闭),点击带防抖保护。
  • 彩色调试日志:内置详细的彩色控制台日志系统,清晰展示初始化、检测、折叠等操作细节,便于开发者或高级用户排查问题。
  • 内存安全保障:页面卸载时自动销毁所有监听器/定时器,彻底避免内存泄漏,适配长期使用场景。
  • ⚠️展开说明:自动折叠开启状态下无法直接展开长文本,需先点击右上角开关关闭折叠功能,再手动点击文本展开按钮即可正常展开。

功能特点

核心文本折叠能力

  • 🎯 精准定位:基于 data-chat-list-key$="-question" 属性选择器,精准匹配通义千问聊天页的提问项容器,避免误操作其他页面元素。
  • 🔄 全场景触发:覆盖页面加载、滚动、动态新增文本等所有交互场景,确保长文本及时折叠,无遗漏。
  • 状态感知:通过检测底部箭头 SVG 是否包含 qs-bottom-icon-svg-rotate 类来判断折叠状态,只处理“未折叠”项,避免重复点击。
  • 📌 操作优化:单个文本容器仅折叠一次,找到目标后立即执行点击,提升执行效率。

高性能与稳定性

  • 🚀 监听优化:优先监听 .chat-content 核心区域,并限定只监听子节点增删,大幅降低回调触发频率。
  • 🎛️ 防抖处理:滚动事件防抖(150ms),避免快速滚动时频繁执行折叠逻辑,平衡实时性与性能。
  • ⏱️ 巡检控制:1秒一次定时巡检,既保证折叠无遗漏,又减少性能消耗,适配低配置设备。
  • 🛡️ 内存安全:页面卸载时自动销毁 MutationObserver/定时器/事件监听,彻底杜绝内存泄漏,长期使用无卡顿。
  • 📊 状态管理:单一数据源管理所有运行状态,避免冗余变量导致的逻辑混乱,降低维护成本。

交互体验

  • 🔘 可视化开关:右上角悬浮按钮采用圆角+阴影设计,不遮挡核心聊天内容,颜色+文字清晰展示当前状态,操作直观。
  • 💾 状态记忆:本地 localStorage 存储保存开关状态,关闭浏览器/刷新页面后仍保持上次设置,无需重复操作。
  • 🎨 样式适配:按钮样式与通义千问页面风格兼容,hover 无额外卡顿,点击有防抖保护,避免误触。
  • 🌈 彩色日志:控制台输出带背景色的清晰日志(INFO/ACTION/WARN/ERROR),便于调试和问题定位,技术用户可快速排查异常。

安装方法

  1. 确保浏览器已安装用户脚本管理器扩展:

  2. 点击下方链接安装脚本:
    安装脚本

  3. 或者手动创建新脚本,复制上述完整代码并保存至脚本管理器

适用页面

  • https://www.qianwen.com/chat/*

操作说明

操作方式 功能 详细说明
页面加载完成 自动折叠长文本 开启状态下,自动识别并收起所有未折叠的长文本,仅针对提问项生效
点击右上角悬浮按钮 切换自动折叠状态 蓝色=开启,灰色=关闭,状态自动本地保存,点击带200ms防抖
滚动页面 触发折叠检查(防抖) 滚动停止150ms后检查并折叠新出现的长文本,避免频繁触发
新增聊天内容 实时自动折叠 MutationObserver监听,新增文本立即识别并折叠,无延迟
展开长文本操作 关闭折叠+手动展开 先点击右上角开关将状态切为灰色(关闭),再点击文本自身的展开按钮即可正常展开

注意:

  1. 开关按钮默认位置:右上角85px、顶部13px,可修改代码中CONFIG.BTN_POSITION参数自定义调整位置
  2. 首次使用默认开启自动折叠(按钮蓝色),关闭后下次打开页面仍保持关闭状态
  3. 自动折叠开启时,手动点击文本展开按钮无效,需先关闭折叠功能

技术细节

核心配置

// 核心配置参数,集中管理便于修改
const CONFIG = {
    STORAGE_KEY: 'qianwen_auto_collapse_v2_enabled', // 状态本地存储键名
    SWITCH_BTN_ID: 'qianwen-collapse-switch-v2',     // 开关按钮唯一ID
    
    // 新结构选择器
    QUESTION_CONTAINER_ATTR: 'div[data-chat-list-key$="-question"]', // 问题容器属性选择器
    BOTTOM_ICON_CONTAINER_CLASS: '.qs-bottom',       // 底部操作栏类名
    COLLAPSE_SVG_CLASS: '.qs-bottom-icon-svg',       // 折叠图标SVG类名
    ROTATED_CLASS: 'qs-bottom-icon-svg-rotate',      // 旋转状态类名(表示已折叠)

    SCROLL_DEBOUNCE_MS: 150,                         // 滚动防抖延迟(毫秒)
    POLL_INTERVAL_MS: 1000,                          // 定时巡检间隔(毫秒)
    BTN_POSITION: { top: 13, right: 85, zIndex: 9999 } // 开关按钮位置配置
};

核心功能实现

// 1. 精准折叠核心逻辑,基于SVG旋转状态判断
function collapseUnfoldedText() {
    if (!state.autoCollapseEnabled) return; 

    // 获取所有问题容器
    const containers = document.querySelectorAll(CONFIG.QUESTION_CONTAINER_ATTR);
    
    containers.forEach(container => {
        // 定位折叠按钮的 SVG
        const collapseSvg = container.querySelector(`${CONFIG.BOTTOM_ICON_CONTAINER_CLASS} ${CONFIG.COLLAPSE_SVG_CLASS}`);
        
        if (!collapseSvg) return;

        // 关键判断:如果不包含 'qs-bottom-icon-svg-rotate' 类,说明是展开状态,需要折叠
        if (!collapseSvg.classList.contains(CONFIG.ROTATED_CLASS)) {
            const btnParent = collapseSvg.closest('.qs-bottom-icon');
            if (btnParent) {
                btnParent.click(); // 模拟点击
                Logger.action(`发现未折叠问题,执行点击折叠`);
            }
        }
    });
}

// 2. 彩色日志系统
const Logger = {
    info: (msg) => console.log(`%c[QW] INFO%c ${msg}`, 'background:#2c3e50;color:#fff;', 'color:#3498db;'),
    action: (msg) => console.log(`%c[QW] ACTION%c ${msg}`, 'background:#2c3e50;color:#fff;', 'color:#27ae60;'),
    // ... 其他级别日志
};

执行流程

  1. 页面加载完成后初始化运行状态,从本地存储读取自动折叠开关配置
  2. 创建右上角悬浮开关按钮,根据初始状态设置按钮颜色和文字
  3. 初始化 MutationObserver,优先监听 .chat-content 区域的关键变化
  4. 添加防抖滚动事件监听和1秒定时巡检,实现全场景折叠触发
  5. 若为开启状态,立即执行一次全页面长文本折叠,确保初始状态整洁
  6. 监听页面卸载事件,触发销毁逻辑,清理所有监听器和定时器,防止内存泄漏
  7. 点击开关按钮时,切换运行状态并本地保存,关闭状态下停止所有折叠逻辑

常见问题

Q: 脚本没有自动折叠文本怎么办?

A:

  1. 检查右上角开关按钮是否为蓝色(开启状态),灰色表示已关闭,点击即可开启
  2. 确认当前页面 URL 是 https://www.qianwen.com/chat/* 格式,非聊天页脚本不生效
  3. 打开浏览器控制台(F12)查看是否有报错信息,排查页面结构变化问题
  4. 刷新页面重试,或手动点击开关按钮切换状态后再次尝试

Q: 想展开长文本但点击没反应怎么办?

A:
这是正常现象,自动折叠开启状态下会屏蔽手动展开操作,解决方法:

  1. 点击页面右上角的悬浮按钮,将其从蓝色切为灰色(关闭自动折叠)
  2. 再点击长文本自身的「展开」按钮,即可正常展开文本
  3. 展开后若需重新开启折叠,再次点击右上角按钮切回蓝色即可

Q: 开关按钮遮挡聊天内容怎么办?

A:

  1. 找到脚本中 CONFIG 配置里的 BTN_POSITION 参数,修改 topright 值:
    BTN_POSITION: { top: 50, right: 20, zIndex: 9999 } // 按需调整数值,单位为px
    
  2. 保存修改后刷新通义千问聊天页,按钮位置会同步更新

Q: 可以调整折叠触发的灵敏度吗?

A:

  1. 找到脚本中 CONFIG 配置里的性能参数,按需修改:
    SCROLL_DEBOUNCE_MS: 200, // 数值越大,滚动折叠触发越迟钝,性能越好
    POLL_INTERVAL_MS: 1500,  // 数值越大,定时巡检频率越低,性能越好
    
  2. 建议根据设备配置调整,低配置设备可适当增大数值,高配设备可减小数值提升实时性

Q: 脚本会影响通义千问的原生功能吗?

A:
不会,脚本仅做长文本折叠的模拟点击操作,不修改通义千问的任何原生 DOM 结构和 JS 逻辑;
关闭自动折叠功能后,通义千问所有原生操作(包括文本展开、提问、回答等)均恢复正常,无任何干扰。

更新日志

v2.1

  • 修复用户提问的最新问题并没有被折叠的问题
  • 精简了日志

v2.0

  • 🔄 架构重构:适配通义千问最新前端 DOM 结构,废弃旧类名匹配,改用 data-chat-list-key 属性定位
  • 🎯 状态判断优化:通过检测 SVG 元素的 qs-bottom-icon-svg-rotate 类名精准判断折叠状态,更加稳定可靠
  • 🌈 彩色日志系统:新增详细的彩色控制台日志输出,方便调试和监控脚本运行状态
  • 性能提升:优化选择器查询效率,减少不必要的 DOM 遍历
  • 🛠️ 代码规范化:完善 CONFIG 注释,统一日志前缀,增强代码可维护性

v1.1

  • 千问前端界面更新了,修改了 css 的类名

v1.0

  • 🎉 初始版本:实现通义千问长文本核心自动折叠功能,精准匹配提问项文本
  • 高性能优化:缩小 DOM 监听范围、滚动事件防抖、延长巡检间隔,减少80%无用操作
  • 🛡️ 内存安全:页面卸载时自动销毁所有监听器/定时器,彻底避免内存泄漏
  • 💾 状态记忆:本地 localStorage 存储开关状态,刷新/重启浏览器自动恢复
  • 🔘 可视化开关:右上角悬浮按钮,一键切换折叠状态,颜色+文字直观展示
  • 🎯 精准匹配:仅针对提问项长文本生效,不干扰通义千问其他原生功能
  • 📋 专属说明:适配折叠/展开交互逻辑,明确展开长文本的操作步骤

免责声明

本脚本仅供学习交流使用,请勿用于商业用途。脚本仅模拟人工点击折叠操作,未修改通义千问的任何核心功能和页面结构,使用脚本产生的一切后果由使用者自行承担。

反馈与支持

如果您在使用过程中遇到问题或有改进建议,请通过以下方式反馈:

  • 在脚本管理器的脚本评论区留言
  • 提交 Issue 到脚本仓库
  • 反馈通义千问页面结构更新导致的脚本失效问题

温馨提示

  1. 若通义千问更新页面结构(如类名、标签变化),可能导致脚本失效,请关注最新版本
  2. 建议定期清理浏览器本地存储,避免开关状态异常,确保脚本正常运行
  3. 低配置设备可适当增大性能参数数值,进一步提升页面运行流畅度
  4. 开启自动折叠后,若需临时展开某条长文本,关闭开关即可,操作完成后可重新开启