2023/12/31 13:10:52
当前为
// ==UserScript==
// @name New script baidu.com
// @namespace Violentmonkey Scripts
// @match *://www.baidu.com/s*
// @match https://www.baidu.com/*
// @grant GM_setClipboard
// @grant GM_addStyle
// @grant GM_getResourceText
// @require https://cdn.bootcdn.net/ajax/libs/showdown/2.1.0/showdown.min.js
// @require https://cdn.bootcdn.net/ajax/libs/highlight.js/11.7.0/highlight.min.js
// @require https://cdn.bootcdn.net/ajax/libs/toastr.js/2.1.4/toastr.min.js
// @resource toastCss https://cdn.bootcdn.net/ajax/libs/toastr.js/2.1.4/toastr.min.css
// @grant none
// @version 1.1.1
// @author yang
// @description 2023/12/31 13:10:52
// @license MIT
// ==/UserScript==
console.log("加载脚本:" + new Date());
window.onload=function(e){
creatBox();
}
//全局变量 存储搜索关键字
var keyWord="";
// if (window.location.href.indexOf("baidu.com\/s") > -1) {
// var query = document.getElementById("kw").value;
// console.log("用户输入的搜索词:" + query);
// PostData(query);
// }
//绘画输出框
function creatBox() {
GM_addStyle(GM_getResourceText("toastCss"))
let divE = document.createElement('div');
//divE.classList.add("markdown-body");
divE.innerHTML = `
<div>
<textarea id="story" name="story" rows="1" cols="33">It was a dark and stormy night...</textarea>
<button id='CusomBtn' onclick="">查询</button>
</div>
<div class="card">
<article id="gptAnswer" class="markdown-body">请稍等一会...</article>
</div>
<style>
pre .btn-pre-copy{
text-align: right;
display: block;
}
pre .btn-pre-copy:hover{
cursor: pointer;
}
.card {
border: 0.5px solid #ccc; /* 设置边框 */
background-color: #fff; /* 设置背景颜色 */
padding: 5px; /* 设置内部间距 */
/*margin: 10px; /* 设置外部间距 */
border-radius: 5px; /* 添加圆角效果 */
max-height:600px;
overflow: hidden;
overflow-y: scroll;
}
</style>
`;
let NewDom = document.getElementById("gptAnswer");
let content_right = document.getElementById('content_right');
if (NewDom === null && content_right !== null) {
content_right.prepend(divE);
//监听自定义搜索事件
document.getElementById("CusomBtn").addEventListener("click", function(event) {
var query = document.getElementById("story").value;
// 执行你的搜索操作或其他逻辑
console.log("自定义搜索词:" + query);
creatBox();
//执行获取
PostData(query);
});
}
}
// //监听回车搜索事件
// document.getElementById("kw").addEventListener("keydown", function(event) {
// if (event.keyCode === 13) {
// // 回车键被按下
// //event.preventDefault(); // 阻止默认的提交行为
// var query = document.getElementById("kw").value;
// // 执行你的搜索操作或其他逻辑
// console.log("用户输入的搜索词:" + query);
// creatBox();
// //执行获取
// PostData(query);
// //let test = "在JavaScript中,没有`js++`这样的语言。我猜您可能是指JavaScript语言中的递归。递归是一种算法设计技术,其中函数可以调用自身来解决问题。以下是一个使用JavaScript实现递归的示例:\n\n```javascript\nfunction factorial(n) {\n if (n === 0) {\n return 1;\n } else {\n return n * factorial(n - 1);\n }\n}\n\nconsole.log(factorial(5)); // 输出 120\n```\n\n在上面的示例中,`factorial`函数使用递归来计算一个数的阶乘。当传入的参数`n`为0时,函数返回1作为基本情况。否则,函数将`n`与`factorial(n - 1)`的结果相乘,从而实现递归调用。这个递归过程一直持续到`n`的值为0,然后逐层返回结果,最终计算出整个阶乘的值。\n\n请注意,递归算法需要小心处理终止条件,以避免无限递归导致堆栈溢出。在实际使用中,还需要考虑性能和效率方面的问题。"
// }
// });
// //监听回车搜索事件
// document.getElementById("su").addEventListener("click", function(event) {
// var query = document.getElementById("kw").value;
// // 执行你的搜索操作或其他逻辑
// console.log("用户输入的搜索词:" + query);
// creatBox();
// //执行获取
// PostData(query);
// });
setInterval(()=>{
let key = getUrlParam(window.location.href,'wd');
if(key!==keyWord){
keyWord = key;
creatBox();
//执行获取
PostData(keyWord);
}
});
function CusomBtn(){
let key = document.getElementById("story").value;
PostData(key);
}
function getUrlParam(url, param) {
const reg = new RegExp("(^|&)" + param + "=([^&]*)(&|$)");
const result = url.substring(url.indexOf('?') + 1).match(reg);
if (result != null) {
return decodeURIComponent(result[2]);
}
return null;
}
function PostData(query) {
let SNKey = localStorage.getItem("SNKey")
if(SNKey===null){
let result = window.prompt("请输入访问密钥!");
if(result===null){
document.getElementById('gptAnswer').innerHTML = "取消访问...";
return;
}else{
localStorage.setItem("SNKey",result);
SNKey = result;
}
};
//document.getElementById('gptAnswer').innerHTML = "请稍等一会儿...";
var obj = {
"messages": [{
"role": "system",
"content": "\nYou are ChatGPT, a large language model trained by OpenAI.\nKnowledge cutoff: 2021-09\nCurrent model: gpt-3.5-turbo\nCurrent time: 2023/12/31 12:13:57\nLatex inline: $x^2$ \nLatex block: $$e=mc^2$$\n\n"
},
{
"role": "user",
"content": query
}
],
"stream": false,
"model": "gpt-3.5-turbo",
"temperature": 0.5,
"presence_penalty": 0,
"frequency_penalty": 0,
"top_p": 1
};
var httpRequest = new XMLHttpRequest();
var url = "https://api.nextapi.fun/v1/chat/completions";
httpRequest.open("POST", url, true);
httpRequest.setRequestHeader("Content-type", "application/json");
httpRequest.setRequestHeader("Authorization", "Bearer "+SNKey);
httpRequest.send(JSON.stringify(obj)); //发送请求 将json写入send中
httpRequest.onreadystatechange = function() {
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
//处理响应结果
var result = httpRequest.responseText;
console.log(new Date());
result = JSON.parse(result);
console.log(result)
//console.log(result.choices[0].message.content);
var message = result.choices[0].message.content;
// var renderedHTML = marked.parse(message);
// // console.log(renderedHTML);
// creatBox();
// var NewDom = document.getElementById("outputStory");
// NewDom.innerHTML = renderedHTML;
creatBox();
showAnserAndHighlightCodeStr(message);
} else {
//处理请求失败
alert('请求失败');
}
}
};
};
//显示答案并高亮代码函数
function showAnserAndHighlightCodeStr(codeStr) {
if (!codeStr) return
rawAns = codeStr; //记录原文
try {
document.getElementById('gptAnswer').innerHTML = mdConverter(codeStr)
} catch (ex) {
console.error(ex)
}
highlightCodeStr() //高亮
//添加代码复制按钮 start
let preList = document.querySelectorAll("#gptAnswer pre")
preList.forEach((pre) => {
try {
if (!pre.querySelector(".btn-pre-copy")) {
//<span class=\"btn-pre-copy\" onclick='preCopy(this)'>复制代码</span>
let copyBtn = document.createElement("span");
copyBtn.setAttribute("class", "btn-pre-copy");
copyBtn.addEventListener("click", (event) => {
let _this = event.target
//console.log(_this)
let pre = _this.parentNode;
//console.log(pre.innerText)
_this.innerText = '';
GM_setClipboard(pre.innerText, "text");
_this.innerText = '复制成功'
setTimeout(() => {
_this.innerText = '复制代码'
}, 2000)
})
copyBtn.innerText = '复制代码'
pre.insertBefore(copyBtn, pre.firstChild)
}
} catch (e) {
console.log(e)
}
})
//添加代码复制按钮 end
}
//高亮代码函数
function highlightCodeStr() {
let gptAnswerDiv = document.querySelector("#gptAnswer");
gptAnswerDiv.querySelectorAll('pre code').forEach((el) => {
hljs.highlightElement(el);
});
}
function mdConverter(rawData) {
let converter = new showdown.Converter();
converter.setOption('tables',
true); //启用表格选项。从showdown 1.2.0版开始,表支持已作为可选功能移入核心拓展,showdown.table.min.js扩展已被弃用
converter.setOption('openLinksInNewWindow', true) //链接在新窗口打开
converter.setOption('strikethrough', true) //删除线
converter.setOption('emoji', true) //开启emoji
/***
* original: John Gruber 规范中的原始 Markdown 风格
* vanilla:对决基础风味(v1.3.1 起)
* github: GitHub 风格的 Markdown,或 GFM
*/
showdown.setFlavor('github');
try {
return converter.makeHtml(rawData);
} catch (ex) {
console.error(ex)
}
return rawData;
}