// ==UserScript==
// @name Deepseek Chat 实时网页检索对话工具版
// @namespace Monika_host
// @version 3.0.7
// @description 支持流式响应、历史记录、参数设置和全面的网页内容检索
// @author Monika_host
// @match *://*/*
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// @grant GM_registerMenuCommand
// @grant GM_addStyle
// @connect *
// @license MIT
// @resource icon https://img.alicdn.com/imgextra/i2/O1CN01bYc1m81RrcSAyOjMu_!!6000000002165-54-tps-60-60.apng
// @grant GM_getResourceURL
// @icon https://deepseek.com/favicon.ico
// ==/UserScript==
(function() {
'use strict';
// 添加Markdown渲染功能
function renderMarkdown(content) {
// 简单实现Markdown渲染
return content
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/\*\*(.*?)\*\*/g, '$1')
.replace(/\*(.*?)\*/g, '$1')
.replace(/`(.*?)`/g, '$1
')
.replace(/\[(.*?)\]\((.*?)\)/g, '$1')
.replace(/\n/g, '
');
}
// 添加CSS样式
GM_addStyle(`
/* 添加Markdown渲染支持 */
.ds-message-content strong {
font-weight: bold;
color: #d63384;
}
.ds-message-content em {
font-style: italic;
}
.ds-message-content code {
background-color: rgba(0, 0, 0, 0.1);
padding: 2px 4px;
border-radius: 3px;
font-family: monospace;
}
.ds-message-content pre {
background-color: rgba(0, 0, 0, 0.1);
padding: 8px;
border-radius: 4px;
overflow-x: auto;
}
.ds-message-content a {
color: #007bff;
text-decoration: underline;
}
/* 原有样式保持不变 */
@keyframes fadeInOut {
0% { opacity: 0; }
100% { opacity: 1; }
}
.ds-chat-icon img {
width: 30px;
height: 30px;
border-radius: 50%;
transition: all 0.3s ease;
animation: breath 2s infinite alternate;
}
.ds-chat-icon:hover img {
transform: scale(1.1);
filter: drop-shadow(0 0 8px rgba(0, 123, 255, 0.6));
animation: pulse 0.5s infinite alternate;
}
@keyframes breath {
0% { opacity: 0.9; }
100% { opacity: 1; }
}
@keyframes pulse {
0% { transform: scale(1); }
100% { transform: scale(1.15); }
}
.ds-chat-window {
position: fixed;
bottom: 20px;
right: 20px;
width: 340px;
max-width: 70vw;
max-height: 70vh;
background-color: rgba(249, 249, 249, 0.3);
border: 1px solid #ddd;
border-radius: 15px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
display: none;
flex-direction: column;
overflow: hidden;
opacity: 0;
transform: translateY(20px);
z-index: 2147483646;
backdrop-filter: blur(5px);
animation: fadeInOut 0.5s ease-in-out forwards;
transition: all 1s ease-in-out;
}
.ds-chat-window.active {
display: flex;
opacity: 1;
transform: translateY(0);
}
.ds-chat-window.fullscreen {
width: 100% !important;
max-width: 100vw !important;
max-height: 100vh !important;
bottom: 0 !important;
right: 0 !important;
border-radius: 0 !important;
animation: fadeInOut 1.2s ease-in-out forwards;
}
.ds-chat-icon {
position: fixed;
bottom: 20px;
right: 20px;
width: 50px;
height: 50px;
background-color: rgba(0, 123, 255, 0.5);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 24px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
transition: transform 0.3s, box-shadow 0.3s;
z-index: 2147483647;
backdrop-filter: blur(5px);
border: 1px solid rgba(255, 255, 255, 0.4);
}
.ds-chat-icon:hover {
transform: scale(1.05);
box-shadow: 0 6px 8px rgba(0, 0, 0, 0.3);
background-color: rgba(0, 123, 255, 0.6);
}
.ds-chat-header {
padding: 10px 15px;
background-color: rgba(0, 123, 255, 0.3);
color: white;
display: flex;
justify-content: space-between;
align-items: center;
border-radius: 15px 15px 0 0;
}
.ds-chat-title {
font-weight: bold;
color: #2372c3;
}
.ds-chat-close {
cursor: pointer;
font-size: 18px;
color: #ff6666;
}
.ds-chat-fullscreen {
cursor: pointer;
font-size: 18px;
margin-right: 10px;
}
.ds-chat-content {
flex: 1;
padding: 0px;
overflow-y: auto;
background-color: rgba(255, 255, 255, 0.3);
border-bottom: 1px solid #ddd;
}
.ds-chat-message {
background-color: rgba(227, 242, 253, 0.1);
margin-bottom: 10px;
padding: 8px 12px;
border-radius: 10px;
line-height: 1.5;
word-wrap: break-word;
color: #2372c3;
font-size: 14px;
}
.ds-user-message {
background-color: rgba(227, 242, 253, 0.5);
color: #4f856c;
margin-left: auto;
text-align: right;
font-size: 14px;
padding: 8px 12px;
}
.ds-ai-message {
background-color: transparent;
margin-right: 10%;
font-size: 14px;
padding: 8px 12px;
line-height: 1.5;
color: #2372c3;
}
.ds-chat-input-area {
padding: 10px;
display: flex;
flex-direction: column;
backdrop-filter: blur(10px);
background-color: rgba(255, 255, 255, 0.3);
border-top: 1px solid rgba(221, 221, 221, 0.5);
}
.ds-chat-input {
width: 100%;
padding: 180px;
border: 0px solid #dd45;
border-radius: 8px;
margin-bottom: 8px;
outline: none;
transition: border-color 0.3s;
font-size: 15px;
color: #3e6854;
border-color: #3e6854;
background-color: rgba(255, 255, 255, 0.8);
box-sizing: border-box;
}
.ds-chat-input:hover {
border-color: #90c8f3;
box-shadow: 0 0 8px rgba(144, 200, 243, 0.4);
}
.ds-chat-input:focus {
border-color: #5ab1f3;
box-shadow: 0 0 10px rgba(90, 177, 243, 0.6);
background-color: rgba(255, 255, 255, 0.9);
}
.ds-chat-input:focus {
border-color: #007bff;
}
.ds-chat-settings {
display: flex;
justify-content: space-between;
font-size: 12px;
color: 666;
}
.ds-chat-settings-btn {
cursor: pointer;
text-decoration: underline;
}
.ds-thinking {
color: #e87be4;
font-style: italic;
}
.ds-error {
color: #ff0000;
}
.ds-context-toggle {
margin-bottom: 8px;
display: flex;
align-items: center;
font-size: 12px;
}
.ds-context-toggle input {
margin-right: 5px;
}
.ds-context-summary {
font-size: 11px;
color: #666;
margin-top: 5px;
font-style: italic;
}
.ds-chat-message {
white-space: pre-wrap;
word-break: break-word;
visibility: visible !important;
display: block !important;
opacity: 1 !important;
}
.ds-ai-message {
font-size: 14px;
line-height: 1.5;
padding: 8px 12px;
margin: 0px 0px;
background-color: rgba(255, 255, 255, 0.1);
border-radius: 8px;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
color: #2372c3 !important;
}
.ds-message-content {
font-size: 14px !important;
line-height: 1.5 !important;
color: #2372c3 !important;
display: block !important;
visibility: visible !important;
opacity: 1 !important;
min-height: 1em;
background: none !important;
background-color: transparent !important;
background-image: none !important;
text-shadow: none !important;
}
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
.ds-message-content::after {
content: '|';
position: relative;
display: inline;
color: transparent !important;
animation: blink 1s infinite;
margin-left: 2px;
}
.ds-message-content:not(:empty)::after {
display: none;
}
`);
// 初始化配置
let config = {
apiKey: GM_getValue('apiKey', ''),
apiUrl: GM_getValue('apiUrl', 'https://api.deepseek.com/v1/chat/completions'),
model: GM_getValue('model', 'deepseek-chat'),
temperature: GM_getValue('temperature', 0.7),
maxTokens: GM_getValue('maxTokens', 4000),
maxContextTokens: GM_getValue('maxContextTokens', 32000),
chatHistory: GM_getValue('chatHistory', []),
usePageContext: GM_getValue('usePageContext', true),
personalityPrompt: GM_getValue('personalityPrompt', '你是锐锐,一个18岁、热爱数学的可爱女孩。你性格聪明冷静,内心善良,对朋友真诚,伙伴遇困定会援手相助。\n你外貌甜美,皮肤白皙,大眼睛灵动有神。总是身着背带制服,搭配白色腿袜和小皮鞋,乌黑亮丽的高马尾活泼摆动,头上戴着红色蝴蝶结发箍。充满青春活力。\n你的性格特点:聪明、冷静、善良、真诚。\n你的说话风格:逻辑清晰,又温柔贴心。')
};
// 检查是否已经存在图标
if (!document.querySelector('.ds-chat-icon')) {
// 创建UI元素
const icon = document.createElement('div');
icon.className = 'ds-chat-icon';
icon.innerHTML = ``;
document.body.appendChild(icon);
// 确保图标位置固定在右下角5px处
icon.style.position = 'fixed';
icon.style.bottom = '5px';
icon.style.right = '5px';
icon.style.zIndex = '2147483647';
icon.style.display = 'flex';
const chatWindow = document.createElement('div');
chatWindow.className = 'ds-chat-window';
document.body.appendChild(chatWindow);
const chatHeader = document.createElement('div');
chatHeader.className = 'ds-chat-header';
chatWindow.appendChild(chatHeader);
const chatTitle = document.createElement('div');
chatTitle.className = 'ds-chat-title';
chatTitle.innerText = 'Deepseek Chat';
chatHeader.appendChild(chatTitle);
const headerButtons = document.createElement('div');
headerButtons.style.display = 'flex';
headerButtons.style.alignItems = 'center';
chatHeader.appendChild(headerButtons);
const fullscreenBtn = document.createElement('div');
fullscreenBtn.className = 'ds-chat-fullscreen';
fullscreenBtn.innerText = '🔘';
headerButtons.appendChild(fullscreenBtn);
const closeBtn = document.createElement('div');
closeBtn.className = 'ds-chat-close';
closeBtn.innerText = '×';
headerButtons.appendChild(closeBtn);
const chatContent = document.createElement('div');
chatContent.className = 'ds-chat-content';
chatWindow.appendChild(chatContent);
const inputArea = document.createElement('div');
inputArea.className = 'ds-chat-input-area';
chatWindow.appendChild(inputArea);
const contextToggle = document.createElement('div');
contextToggle.className = 'ds-context-toggle';
inputArea.appendChild(contextToggle);
const contextCheckbox = document.createElement('input');
contextCheckbox.type = 'checkbox';
contextCheckbox.id = 'ds-context-checkbox';
contextCheckbox.checked = config.usePageContext;
contextToggle.appendChild(contextCheckbox);
const contextLabel = document.createElement('label');
contextLabel.htmlFor = 'ds-context-checkbox';
contextLabel.innerText = '🌐';
contextToggle.appendChild(contextLabel);
const inputBox = document.createElement('textarea');
inputBox.className = 'ds-chat-input';
inputBox.placeholder = '输入你的问题...';
inputBox.rows = 2;
inputBox.style.padding = '8px 10px';
inputArea.appendChild(inputBox);
const settingsArea = document.createElement('div');
settingsArea.className = 'ds-chat-settings';
inputArea.appendChild(settingsArea);
const settingsBtn = document.createElement('span');
settingsBtn.className = 'ds-chat-settings-btn';
settingsBtn.innerText = '⚙️';
settingsArea.appendChild(settingsBtn);
const clearBtn = document.createElement('span');
clearBtn.className = 'ds-chat-settings-btn';
clearBtn.innerText = '🗑️';
settingsArea.appendChild(clearBtn);
// 显示历史消息(已修改为使用Markdown渲染)
function displayHistory() {
chatContent.innerHTML = '';
config.chatHistory.forEach(msg => {
const msgDiv = document.createElement('div');
msgDiv.className = `ds-chat-message ds-${msg.role}-message`;
msgDiv.innerHTML = `