网站建设jiq网络营销手段有哪些方式
目录
一、 引言
二、 逻辑
三、 源代码
四、 添加新脚本
五、 使用
六、 BUG
七、 优化日志
1.获取最后消息内容报错
一、 引言
deepseek每次第一次提问就正常,后面就开始繁忙了,有一点阴招全使我们身上。
greasyfork登不上,不知道是不是被墙了,所以直接在这里存档。
二、 逻辑
每隔5秒使用xpath表达式匹配当前对话框的最后一个消息,出现“服务器繁忙,请稍后再试。”即点击重试。
三、 源代码
// ==UserScript==
// @name Deepseek 服务器繁忙无限重试
// @namespace http://tampermonkey.net/
// @version 2025-02-11
// @description 每隔5秒检测一次最后一条数据是否出现服务器繁忙,出现点击重试,无限循环。
// @author Vdoi
// @match *chat.deepseek.com/*
// @icon https://cdn.deepseek.com/chat/icon.png
// @grant none
// ==/UserScript==(function() {'use strict';console.log('start')let intervalId = null;//重试次数let retryCount = 0// 每隔 5 秒检查一次var times = 5000// 创建通知元素并插入到页面中function addNotification() {let notification = document.getElementById('notification');if (!notification) { // 检查是否已存在通知元素notification = document.createElement('div');notification.id = 'notification';notification.style.position = 'fixed';notification.style.left = '50%';notification.style.top = '50%';notification.style.transform = 'translate(-50%, -50%)';notification.style.backgroundColor = '#4D6BFE';notification.style.color = 'white';notification.style.padding = '15px';notification.style.borderRadius = '5px';notification.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.2)';notification.style.zIndex = '1000';notification.style.textAlign = 'center';notification.style.display = 'none'; // 默认隐藏document.body.appendChild(notification);}return notification;}// 显示通知的方法function showNotification(text) {//console.log('显示提示')const notification = document.getElementById('notification');notification.textContent = text;notification.style.display = 'block';setTimeout(() => {notification.style.display = 'none';}, 3000); // 3秒后隐藏通知}//自动重试按钮点击事件function retryButtonClick() {var xpath = '//div[@id="retry"]/span';var elementResult = document.evaluate(xpath,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);var clickElement = elementResult.singleNodeValue;clickElement.addEventListener('click', function() {//console.log('点击')const xpathExpression = '//div[@id="retry"]';const result = document.evaluate(xpathExpression,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);const newButtonDiv = result.singleNodeValue;var text = times + '毫秒后开启自动重试'if (clickElement.textContent === '打开自动重试') {console.log('已开启自动重试')showNotification(text); // 显示通知// 设置背景颜色newButtonDiv.style.backgroundColor = '#4D6BFE';// 设置文字颜色为白色newButtonDiv.style.color = 'white';//开启定时器clickElement.textContent = '关闭自动重试';intervalId = setInterval(() => checkAndClick(times), times);} else {console.log('已关闭自动重试')text = '已关闭自动重试'showNotification(text); // 显示通知// 设置背景颜色newButtonDiv.style.backgroundColor = 'white';// 设置文字颜色为白色newButtonDiv.style.color = '#4D6BFE';// 如果定时器已启动,则清除它,并更新按钮文本clearInterval(intervalId);intervalId = null;clickElement.textContent = '打开自动重试';}});}//增加自动重试按钮function addButton() {const xpathExpression = '//span[contains(text(),"深度思考")]/../../div[2]';const result = document.evaluate(xpathExpression,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);const targetElement = result.singleNodeValue;//console.log('增加', targetElement)if (targetElement) {// 创建要插入的 div 元素(按钮)const newButtonDiv = document.createElement('div');newButtonDiv.setAttribute('class', 'ds-button ds-button--primary d9f56c96');newButtonDiv.setAttribute('id', 'retry');// 设置背景颜色newButtonDiv.style.backgroundColor = 'white';// 设置文字颜色为白色newButtonDiv.style.color = '#4D6BFE';// 创建内部的 span 元素const buttonTextSpan = document.createElement('span');buttonTextSpan.setAttribute('class', 'ad0c98fd');buttonTextSpan.textContent = '打开自动重试';// 将 span 元素添加到按钮 div 中newButtonDiv.appendChild(buttonTextSpan);// 在目标元素后面插入新按钮元素console.log('增加')targetElement.parentNode.insertBefore(newButtonDiv, targetElement.nextSibling);//targetElement.appendChild(newButtonDiv);//增加点击事件//retryButtonClick()}}//当前页面最后消息function lastNews(){// 定义 XPath 表达式const xpathExpression = '//*[@id="root"]/div/div[2]/div[2]/div/div[2]/div/div/div[1]/div[last()]/div[@class="ds-markdown ds-markdown--block"]//p';let flag = false// 使用 document.evaluate() 方法执行 XPath 查询const result = document.evaluate(xpathExpression,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);const targetElement = result.singleNodeValue;//增加空判断if (targetElement){console.log(targetElement.textContent)if (targetElement.textContent === '服务器繁忙,请稍后再试。') {flag = true;}}return flag;}//点击重试function clickRe(){const exists = lastNews()if (exists) {console.log('检测到服务器繁忙提示,尝试点击按钮...');// 定义用于定位按钮的 XPath 表达式const buttonXpathExpression = '//*[@id="root"]/div/div[2]/div[2]/div/div[2]/div/div/div[1]/div[last()]//div[2]/div[@class="ds-icon"]';// 执行 XPath 查询以获取按钮元素const buttonResult = document.evaluate(buttonXpathExpression,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);const buttonToClick = buttonResult.singleNodeValue;if (buttonToClick) {buttonToClick.click();console.log('按钮已点击');var text = '次重试';showNotification(text)} else {console.log('未找到要点击的按钮');}}}//重试次数function getreCount(){//重试次数const xpathCount = '//*[@id="root"]/div/div[2]/div[2]/div/div[2]/div/div/div[1]/div[last()]/div[@class="ds-flex"]/div[@class="ds-flex"]/div[2]'const countResult = document.evaluate(xpathCount,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);const countElement = countResult.singleNodeValue;if (countElement){const count = countElement.textContent;console.log('重试文本:' + count)const parts = count.split(' / ');const numberBeforeSlash = parseInt(parts[0], 10);console.log('重试次数:' + numberBeforeSlash);}}//检查等待加载函数function checkDsLoadingElementExists() {const xpathExpression = '//*[@id="root"]//div[contains(@class,"ds-loading")]';const result = document.evaluate(xpathExpression,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);const loadingElement = result.singleNodeValue;return Boolean(loadingElement);}// 定时重试函数function checkAndClick(times) {console.log('每隔' + times + '毫秒检查一次')//重试次数getreCount()//是否含有加载元素const exists = checkDsLoadingElementExists();const exists2 = lastNews()if (exists) {console.log('找到了包含 ds - loading 类的元素。');} else{if (exists2){console.log('未找到了包含 ds - loading 类的元素。');//点击重试clickRe();//增加重试次数retryCount++;//显示提示var text = '已重试' + retryCount + '次'showNotification(text)}}console.log('')}//检查按钮存在function checkButton(times){//console.log(times + '毫秒检查一次重试按钮是否存在')const xpath = '//span[contains(text(),"自动重试")]';const result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);if (result.singleNodeValue === null) {//增加按钮addButton()}}//新对话框点击事件function clickNewButton(){var xpath = '//div[text()="开启新对话"]';var elementResult = document.evaluate(xpath,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);var clickElement = elementResult.singleNodeValue;if (clickElement){clickElement.addEventListener('click', function() {console.log('开启新对话')setTimeout(() => {checkButton(0)}, 1000);})}}function clickNewButton2(){var xpath = '//span[text()="开启新对话"]';var elementResult = document.evaluate(xpath,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);var clickElement = elementResult.singleNodeValue;if (clickElement){clickElement.addEventListener('click', function() {console.log('开启新对话2')setTimeout(() => {checkButton(0)}, 1000);})}}//加载完成window.onload = function() {// 页面所有资源加载完成后执行的代码console.log('页面所有资源加载完成后执行的代码')//增加按钮addButton()//为按钮增加点击事件retryButtonClick()//增加提示addNotification()//检测按钮变化//clickNewButton()//clickNewButton2()//定时检查重试按钮是否存在setInterval(() => checkButton(times), times);}})();
四、 添加新脚本
在任意网页中打开油猴脚本菜单
保存打开deepseek网页,出现自动重试按钮即可。
五、 使用
点击打开或关闭自动重试,会出现相应提示框
六、 BUG
已知BUG:
1. 在开启重试过程中切换多个对话框可能会无法结束,建议只在当前对话框中使用。
后面再慢慢优化吧。
七、 优化日志
1.获取最后消息内容报错
编号:
ERROR-2025021301-LAST_MESSAGE_FETCH
时间:
2025-02-13 17:00:21
图例:
描述:
在尝试获取聊天记录或消息列表中的最后一条消息时,由于未事先判断目标元素是否存在,直接访问该元素导致程序抛出异常。
修改说明:
增加空判断,元素存在再输出。
原代码:
//当前页面最后消息function lastNews(){// 定义 XPath 表达式const xpathExpression = '//*[@id="root"]/div/div[2]/div[2]/div/div[2]/div/div/div[1]/div[last()]/div[@class="ds-markdown ds-markdown--block"]//p';let flag = false// 使用 document.evaluate() 方法执行 XPath 查询const result = document.evaluate(xpathExpression,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);const targetElement = result.singleNodeValue;console.log(targetElement.textContent)if (targetElement && targetElement.textContent === '服务器繁忙,请稍后再试。') {flag = true;}return flag;}
更改代码:
//当前页面最后消息function lastNews(){// 定义 XPath 表达式const xpathExpression = '//*[@id="root"]/div/div[2]/div[2]/div/div[2]/div/div/div[1]/div[last()]/div[@class="ds-markdown ds-markdown--block"]//p';let flag = false// 使用 document.evaluate() 方法执行 XPath 查询const result = document.evaluate(xpathExpression,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);const targetElement = result.singleNodeValue;//增加空判断if (targetElement){console.log(targetElement.textContent)if (targetElement.textContent === '服务器繁忙,请稍后再试。') {flag = true;}}return flag;}
对比: