// ==UserScript==
// @name chatGPT tools Plus ++
// @namespace http://tampermonkey.net/
// @version 0.2.6
// @description chatGPT in bing!
// @author Onion
// @match https://cn.bing.com/*
// @match https://www.bing.com/*
// @match https://chat.openai.com/chat
// @match https://www.google.com/*
// @match https://www.google.com.hk/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=openai.com
// @require https://cdn.staticfile.org/jquery/3.4.0/jquery.min.js
// @require https://cdn.staticfile.org/jquery-cookie/1.4.1/jquery.cookie.min.js
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @require https://cdn.jsdelivr.net/npm/[email protected]/marked.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/markdown-it/13.0.1/markdown-it.min.js
// @require https://unpkg.com/axios/dist/axios.min.js
// @connect ip-api.com
// @connect chat.openai.com
// @license MIT
// ==/UserScript==
(function() {
'use strict';
//重要声明:感谢隔壁作者:zhengbangbo (https://github.com/zhengbangbo/chat-gpt-userscript)的请求处理方式,之前一直不知道怎么处理SSE响应,原来直接就可以用一般的方式来接收,那么对返回数据处理切割就直接借鉴啦!(反正MIT不是嘛)
//cookie 大家自己想办法弄到,别霍霍我了呜呜
//对返回结果增加了markdown解析成html
//请在上面添加一句:油猴因为策略问题没法增加这个js
//多亏了zhengbangbo大佬,现在已经解决这个策略问题了!
// @require https://cdn.jsdelivr.net/npm/marked/marked.min.js
//脚本猫用户不用管hhh,I'love scriptCat!
//目前谷歌布局支持很烂,隔壁布局真好!
//顶级配置
const your_cookie=`eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik1UaEVOVUpHTkVNMVFURTRNMEZCTWpkQ05UZzVNRFUxUlRVd1FVSkRNRU13UmtGRVFrRXpSZyJ9.eyJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJwdXNoa2luNjVyYjJAcmFtYmxlci5ydSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJnZW9pcF9jb3VudHJ5IjoiVVMifSwiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS9hdXRoIjp7InVzZXJfaWQiOiJ1c2VyLXRkdmRGWmlSU2NHRHVqU1NaQlNjaHdPSiJ9LCJpc3MiOiJodHRwczovL2F1dGgwLm9wZW5haS5jb20vIiwic3ViIjoiYXV0aDB8NjM4ZTViMTJhNjJmZDMxNDdiYWFiOGJhIiwiYXVkIjpbImh0dHBzOi8vYXBpLm9wZW5haS5jb20vdjEiLCJodHRwczovL29wZW5haS5hdXRoMC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNjcwMzkxODQ4LCJleHAiOjE2NzA0NzgyNDgsImF6cCI6IlRkSkljYmUxNldvVEh0Tjk1bnl5d2g1RTR5T282SXRHIiwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBtb2RlbC5yZWFkIG1vZGVsLnJlcXVlc3Qgb3JnYW5pemF0aW9uLnJlYWQgb2ZmbGluZV9hY2Nlc3MifQ.pL8cDa9rvDAHyXz3cKcPXoWsIWWnL57XdwlZiz9L11L09bUDlQmorUVnzMWduqtkS8rBdYBiSsufzpzelzycmt8WG4mVxQVrDWZ0ynZ3YkXA_C1o2wqTY4Bm0yN44WGeA-Vw0r_mkR7RTXvD-kHcf0VxTqLV_uB2JsqfT0edWoRv5jIjfnzTwhBZIW35Ixog-od_Q-lwqvi__-iu_57Sm1zSaKG3nM-358h_LcMDYcjLa2oTBv0WXzfEQD_vUDgLEVFez8XaYvrvTJ78zNso2SxApHYn4FY7xqtr_Lm28F3S9RJsmA8snJ2EEHlDjvpTeGsRInfhqTb9d90B7rYnIQ`
var your_qus
if (window.location.href.indexOf("bing.com") > -1) {
creatBox_and_addEventlis(0)
GM_add_box_style(0)
keyEvent()
checkIp()
addEs6script()
}
if (window.location.href.indexOf("chat.openai.com") > -1) {
//$.cookie('yourCookie','dumplings', {domain:'qq.com',path:'/'});
console.log("httpOnly保护,没法拿到cookie,自己复制粘贴")
}
if (window.location.href.indexOf("www.google.com") > -1) {
creatBox_and_addEventlis(1)
GM_add_box_style(1)
keyEvent()
}
//顶级函数
function uuid() { //uuid 产生
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = "-";
var uuid = s.join("");
return uuid;
}
function GM_add_box_style(case_web){
switch (case_web){
case 0://bing
GM_addStyle(`
#gptAnswer{
margin: 15px;
border-top: solid;
border-bottom: solid;
}
#gptInput{
width:74%;
border-radius: 4px;
}
#gptInputBox{
display: flex;
justify-content: space-around;
}
#button_GPT:hover{
background:#ffffffcc;
}
#gptDiv{
border-radius: 8px;
padding: 10px;
margin-bottom: 9px;
width:452px;
translate:-20px;
background:#ffffffcc;
backdrop-filter: blur(5px);
display: flex;
flex-direction: column;
}
#button_GPT{
}
#button_GPT{
background: transparent;
border-radius: 4px;
}
#gptCueBox{
translate: 3px;
}
#dot{
height: 4px;
width: 4px;
display: inline-block;
border-radius: 2px;
animation: dotting 2.4s infinite step-start;
}
@keyframes dotting {
25%{
box-shadow: 4px 0 0 #71777D;
}
50%{
box-shadow: 4px 0 0 #71777D ,14px 0 0 #71777D;
}
75%{
box-shadow: 4px 0 0 #71777D ,14px 0 0 #71777D, 24px 0 0 #71777D;
}
}
`)
break;
case 1: //google
GM_addStyle(`
#gptAnswer{
margin: 15px;
border-top: solid;
border-bottom: solid;
}
#gptInput{
border-radius: 4px;
width: 68%;
}
#button_GPT:hover{
background:#dcdcdccc;
}
#gptDiv{
/* border-radius: 8px;
padding: 10px;
margin-bottom: 9px;
list-style-type: none;
background:#ffffffcc;
backdrop-filter: blur(5px);
margin-bottom: 30px;*/
/*border-radius: 8px;
border: 1px solid #dadce0;*/
height: fit-content;
}
#gptInputBox{
display:flex;
justify-content: space-around;
}
#button_GPT{
background: transparent;
border-radius: 3px;
font-size: 14px;
}
#gptStatus{
margin-left: 7px;
}
#dot{
height: 4px;
width: 4px;
display: inline-block;
border-radius: 2px;
animation: dotting 2.4s infinite step-start;
}
@keyframes dotting {
25%{
box-shadow: 4px 0 0 #71777D;
}
50%{
box-shadow: 4px 0 0 #71777D ,14px 0 0 #71777D;
}
75%{
box-shadow: 4px 0 0 #71777D ,14px 0 0 #71777D, 24px 0 0 #71777D;
}
}
`)
break;
default :
alert("参数没设定")
}
}
function do_it(){
if(!your_cookie){
document.getElementById('gptAnswer').innerHTML=`<div>你的cookie好像不见了!<a src="https://chat.openai.com/chat">点我去登录(不可用)获取</a></div>`
}
else{
document.getElementById('gptAnswer').innerHTML=`<div>加载中<span id="dot"></span></div>`
GM_xmlhttpRequest({
method: "POST",
url: "https://chat.openai.com/backend-api/conversation",
headers: {
"Content-Type": "application/json",
Authorization: `${your_cookie}`,
},
data: JSON.stringify({//抓包conversation就可以看到这个结构
action: "next",
messages: [
{
id: uuid(),
role: "user",
content: {
content_type: "text",
parts: [your_qus],
},
},
],
model: "text-davinci-002-render",
parent_message_id: uuid(),
}),
onloadend: function (data) {
if (data.response) {
var data_transform=data.response.split("\n\n")
if(data_transform){
try{
data_transform=JSON.parse(data_transform.slice(-3,-2)[0].slice(6))
}catch(err){
console.log(`err:${err}`)
}
}
var answer=data_transform.message.content.parts[0]
// const answer = JSON.parse(data.response.split("\n\n").slice(-3, -2)[0].slice(6)).message.content.parts[0]
document.getElementById('gptAnswer').innerHTML=marked.parse(answer)
}
},
onerror: function (err) {
document.getElementById('gptAnswer').innerHTML=`<div>some err happends,errinfo :<br>${err}</div>`
},
ontimeout: function (err) {
document.getElementById('gptAnswer').innerHTML=`<div>Opps!TimeOut,Please try again,errinfo:<br>${err}</div>`
}
})
}
}
function creatBox_and_addEventlis(append_case){
var divE = document.createElement('div');
var divId = document.createAttribute("id"); //创建属性
divId.value = 'gptDiv'; //设置属性值
divE.setAttributeNode(divId); //给div添加属性
var pE = document.createElement('p');
var pClass= document.createAttribute('class');
pClass.value = 'textClass';
pE.setAttributeNode(pClass)
var pText = document.createTextNode("chatGPT tools Plus ++ v0.0.1已启动");
pE.appendChild(pText);
divE.appendChild(pE);
switch (append_case){
case 0:
if(divE){
document.getElementById('b_context').prepend(divE)
}
break;
case 1:
if(document.getElementsByClassName('TQc1id ')[0]){
document.getElementsByClassName('TQc1id ')[0].prepend(divE);
}
else{
document.getElementById("rcnt").appendChild(divE);
}
break;
default :
if(divE){
document.getElementById('b_context').prepend(divE)
}
}
document.getElementById('gptDiv').innerHTML=`
<div id="gptInputBox">
<input id="gptInput" type=text><button id="button_GPT" >chat一下</button>
</div>
<div id=gptCueBox>
<p id="gptStatus">  openAI 已就绪,请输入你的问题</p>
<div id="gptAnswer">chatGPT tools Plus ++ v0.1.2已启动</div>
</div><p></p>
`
document.getElementById('button_GPT').addEventListener('click',()=>{
your_qus=document.getElementById("gptInput").value
do_it()
})
}
//焦点函数
function isBlur(){
var myInput = document.getElementById('gptInput');
if (myInput == document.activeElement) {
return 1
} else {
return 0
}
}
function keyEvent(){
document.onkeydown = function (e) {
var keyNum = window.event ? e.keyCode : e.which;
if (13 == keyNum) {
if (isBlur()) {
document.getElementById('button_GPT').click()
}
else{
console.log("失焦不执行")
}
}}
}
function checkIp(){
GM_xmlhttpRequest({
method: "GET",
url: "http://ip-api.com/json/",
onloadend: function (data) {
if(data){
try{
data=JSON.parse(data.response)
}catch(err){
console.log(err)
}
console.log(data.country)
if(data.country=="Hong Kong"){
document.getElementById('gptStatus').innerHTML=`  openAI 已就绪,请输入你的问题`
}
}
else{
document.getElementById('gptStatus').innerHTML=`  openAI 没有就绪,请更换你的IP为非大陆节点`
throw new Error('Error while executing the code');
}
},
onerror: function (err) {
document.getElementById('gptStatus').innerHTML=`  openAI 没有就绪,请更换你的IP为非大陆节点`
throw new Error('Error while executing the code');
},
ontimeout: function (err) {
document.getElementById('gptStatus').innerHTML=`  openAI 没有就绪,请更换你的IP为非大陆节点`
throw new Error('Error while executing the code');
}
})
}
function addBothStyle(){
GM_addStyle(`
@keyframes pulse {
100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
`)
}
function getCookie(){
axios({
url: '/getUsers',
method: 'get',
responseType: 'json', // 默认的
data: {
//'a': 1,
//'b': 2,
}
}).then(function (response) {
console.log(response);
console.log(response.data);
}).catch(function (error) {
console.log(error);
})
}
function addEs6script(){
let script = document.createElement('script');
script.setAttribute('type','module');
script.src= "https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"
document.documentElement.appendChild(script);
}
})();