// ==UserScript==
// @name 腾讯元宝自动切换模型(记忆版)
// @namespace http://tampermonkey.net/
// @version 1.6
// @description [带记忆功能]自动切换DeepSeek+智能同步用户设置+状态持久化
// @license MIT
// @author YourName
// @match https://yuanbao.tencent.com/*
// @icon https://cdn-bot.hunyuan.tencent.com/logo.png
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @run-at document-end
// ==/UserScript==
(function() {
'use strict';
// 增强配置系统
const CONFIG = {
TARGET_MODEL: 'DeepSeek',
DEFAULT_SETTINGS: {
DEEP_THINK: true,
WEB_SEARCH: true
},
RETRY_INTERVAL: 1000, // 增加等待时间
MAX_RETRY: 8, // 增加重试次数
SYNC_DELAY: 1500,
MODEL_MENU_WAIT: 800 // 新增模型菜单等待时间
};
// 智能选择器系统(改进XPath匹配)
const SELECTORS = {
MODEL_SWITCH: 'button[dt-button-id="model_switch"]',
MODEL_LIST_ITEM: modelName =>
`//div[contains(@class,"drop-down-item")]//div[contains(normalize-space(), "${modelName}")]`,
DEEP_THINK: 'button[dt-button-id="deep_think"]',
WEB_SEARCH: 'button[dt-button-id="online_search"]',
ACTIVE_INDICATOR: '.t-icon-check-mark', // 新增激活状态指示器
MODEL_MENU: '.model-switch-menu', // 新增模型菜单选择器
CHAT_CONTAINER: '.chat-container',
INPUT_AREA: '.input-area'
};
// 状态管理系统
let isProcessing = false;
let retryCount = 0;
let userSettings = {};
// 存储系统初始化(保持不变)
const initStorage = () => {
userSettings = Object.fromEntries(
Object.keys(CONFIG.DEFAULT_SETTINGS).map(key => [
key,
GM_getValue(key, CONFIG.DEFAULT_SETTINGS[key])
])
);
};
// 增强版元素等待系统(增加错误处理)
const waitForElement = async (selector, isXPath = false) => {
return new Promise((resolve, reject) => {
const startTime = Date.now();
const checker = () => {
try {
let element;
if (isXPath) {
const result = document.evaluate(
selector,
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
);
element = result.singleNodeValue;
} else {
element = document.querySelector(selector);
}
if (element) {
resolve(element);
return;
}
} catch (error) {
console.error('元素查询错误:', error);
}
if (Date.now() - startTime < CONFIG.RETRY_INTERVAL * CONFIG.MAX_RETRY) {
setTimeout(checker, CONFIG.RETRY_INTERVAL);
} else {
reject(new Error(`元素加载超时: ${selector}`));
}
};
checker();
});
};
// 增强安全交互系统(增加视觉反馈)
const safeClick = async (element, retries = 3) => {
try {
// 添加点击动画效果
element.style.transform = 'scale(0.98)';
element.style.transition = 'transform 0.1s';
element.scrollIntoView({behavior: 'smooth', block: 'center'});
await new Promise(r => setTimeout(r, 300));
const originalBoxShadow = element.style.boxShadow;
element.style.boxShadow = '0 0 8px rgba(0, 255, 157, 0.5)';
element.click();
await new Promise(r => setTimeout(r, 500));
// 恢复样式
element.style.transform = '';
element.style.boxShadow = originalBoxShadow;
} catch (error) {
if (retries > 0) {
await safeClick(element, retries - 1);
} else {
throw new Error('元素点击失败');
}
}
};
// 改进模型控制系统(增加菜单等待)
const switchModel = async () => {
if (isProcessing) return;
isProcessing = true;
try {
// 检查当前模型状态
const currentModel = await waitForElement(SELECTORS.MODEL_SWITCH)
.then(btn => btn.querySelector('.t-button__text')?.textContent?.trim());
if (currentModel === CONFIG.TARGET_MODEL) {
console.log('目标模型已激活,跳过切换');
return;
}
// 打开模型切换面板
const switchBtn = await waitForElement(SELECTORS.MODEL_SWITCH);
await safeClick(switchBtn);
// 等待菜单完全加载
await waitForElement(SELECTORS.MODEL_MENU);
await new Promise(r => setTimeout(r, CONFIG.MODEL_MENU_WAIT));
// 选择目标模型
const modelItem = await waitForElement(
SELECTORS.MODEL_LIST_ITEM(CONFIG.TARGET_MODEL),
true
);
await safeClick(modelItem);
console.log('模型切换成功');
// 等待界面稳定
await new Promise(r => setTimeout(r, CONFIG.SYNC_DELAY));
await applyUserSettings();
} catch (error) {
console.error('模型控制异常:', error);
if (retryCount++ < CONFIG.MAX_RETRY) {
setTimeout(switchModel, CONFIG.RETRY_INTERVAL);
}
} finally {
isProcessing = false;
}
};
// 改进用户设置应用(使用稳定状态判断)
const applyUserSettings = async () => {
const syncFeature = async (selector, settingKey) => {
try {
const element = await waitForElement(selector);
const shouldActive = userSettings[settingKey];
// 使用更可靠的状态判断方式
const isActive = !!element.querySelector(SELECTORS.ACTIVE_INDICATOR);
if (shouldActive !== isActive) {
await safeClick(element);
console.log(`${settingKey} 已同步: ${shouldActive}`);
await new Promise(r => setTimeout(r, 500));
}
} catch (error) {
console.error(`${settingKey} 同步失败:`, error);
}
};
await Promise.all([
syncFeature(SELECTORS.DEEP_THINK, 'DEEP_THINK'),
syncFeature(SELECTORS.WEB_SEARCH, 'WEB_SEARCH')
]);
};
// 增强用户行为监听(事件委托)
const initUserListener = () => {
const handleSettingChange = (element, settingKey) => {
const isActive = !!element.querySelector(SELECTORS.ACTIVE_INDICATOR);
GM_setValue(settingKey, isActive);
userSettings[settingKey] = isActive;
};
document.addEventListener('click', async (event) => {
try {
// 使用事件委托处理动态元素
const webSearchBtn = event.target.closest(SELECTORS.WEB_SEARCH);
if (webSearchBtn) {
await new Promise(r => setTimeout(r, 300)); // 等待状态更新
handleSettingChange(webSearchBtn, 'WEB_SEARCH');
}
const deepThinkBtn = event.target.closest(SELECTORS.DEEP_THINK);
if (deepThinkBtn) {
await new Promise(r => setTimeout(r, 300));
handleSettingChange(deepThinkBtn, 'DEEP_THINK');
}
} catch (error) {
console.error('设置监听错误:', error);
}
});
};
// 优化界面观察系统(精确观察范围)
const initObserver = () => {
const observer = new MutationObserver(mutations => {
if (!mutations.some(m => m.addedNodes.length > 0)) return;
switchModel();
});
const observeTarget = document.querySelector(SELECTORS.INPUT_AREA) || document.body;
observer.observe(observeTarget, {
childList: true,
subtree: true,
attributes: false,
characterData: false
});
};
// 样式注入(保持不变)
const injectStyles = () => {
GM_addStyle(`
.tamper-status {
/* 原有样式保持不变 */
}
`);
// 状态提示注入逻辑保持不变
};
// 主初始化流程(增加错误处理)
const init = async () => {
try {
initStorage();
injectStyles();
initUserListener();
initObserver();
// 初始同步
await switchModel();
await applyUserSettings();
} catch (error) {
console.error('初始化失败:', error);
}
};
// 启动逻辑优化
if (document.readyState === 'complete') {
init();
} else {
window.addEventListener('load', init, {once: true});
}
})();