ChatGPT搜索回答【悬浮窗展示结果】【国内+国外版】

由于ChatGPT目前只能通过OpenAI的对话框来使用,本脚本使用悬浮窗展示ChatGPT(国内+国外版)回答内容,适配Baidu.com,Google.com,Bing,无需登录,无需翻墙(国外版本需要提供Key)

// ==UserScript==
// @name         ChatGPT搜索回答【悬浮窗展示结果】【国内+国外版】
// @name:zh-CN   ChatGPT搜索回答【悬浮窗展示结果】【国内+国外版】
// @name:zh-SG   ChatGPT搜索回答【悬浮窗展示结果】【国内+国外版】
// @name:zh-HK   ChatGPT搜索回答【悬浮窗展示结果】【国内+国外版】
// @namespace    http://tampermonkey.net/
// @version      1.0.4
// @description  由于ChatGPT目前只能通过OpenAI的对话框来使用,本脚本使用悬浮窗展示ChatGPT(国内+国外版)回答内容,适配Baidu.com,Google.com,Bing,无需登录,无需翻墙(国外版本需要提供Key)
// @description:zh-cn  由于ChatGPT目前只能通过OpenAI的对话框来使用,本脚本使用悬浮窗展示ChatGPT(国内+国外版)回答内容,适配Baidu.com,Google.com,Bing,无需登录,无需翻墙(国外版本需要提供Key)
// @author       Clarkyy
// @run-at       document-end
// @match        https://*.google.cat/search*
// @match        https://*.bing.com/search*
// @match        https://*.baidu.com/s*
// @match        https://*.baidu.com/*
// @match        https://*.google.com/search*
// @match        https://*.google.com.hk/search*
// @match        https://*.google.com.tw/search*
// @match        https://*.google.com.sg/search*
// @match        https://*.google.com.au/search*
// @match        https://*.google.com.tr/search*
// @match        https://*.google.com.sa/search*
// @match        https://*.google.com.pk/search*
// @match        https://*.google.com.ng/search*
// @match        https://*.google.com.my/search*
// @match        https://*.google.com.kw/search*
// @match        https://*.google.com.jm/search*
// @match        https://*.google.com.jo/search*
// @match        https://*.google.com.hk/search*
// @connect      api.forchange.cn
// @connect      api.openai.com
// @grant        unsafeWindow
// @grant        GM_getResourceText
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// @require https://greasyfork.org/scripts/455606-layx-js/code/layxjs.js?version=1122546
// @resource  layxcss https://greasyfork.org/scripts/455605-layx/code/layx.user.css
// @license      MIT
// @antifeature ads 推荐购买地址
// ==/UserScript==
// 全局默认配置
(async () => {
    // 'use strict';
    // 基础配置
    const Config = {
        apiKey: '这边填写您的KEY' //直接修改
    }
    // 导入样式
    GM_addStyle(GM_getResourceText("layxcss"));

    // 获取当前页面的搜索关键词
    let keyword = '';
    // google
    if (window.location.href.indexOf('google') > -1) {
        keyword = document.querySelector('input[name="q"]').value;
    }
    // bing
    if (window.location.href.indexOf('bing') > -1) {
        keyword = document.querySelector('input[name="q"]').value;
    }
    // baidu
    if (window.location.href.indexOf('baidu') > -1) {
        keyword = document.querySelector('input[name="wd"]').value;
    }
    console.log(keyword);
    const titleHtml = '<div style="color: white; font-size: 12px;">ChatGPT搜索回答</div>';
    const infoHtml = '<div style="color: black;font-size: 12px;border-radius: 5px;padding: 10px;margin: 10px;box-shadow: 0 0 5px #ccc;">' +
        '<div>本插件仅供交流使用,侵权联系删除!</div>' +
        '<div>国内版的接口为:api.forchange.cn</div>' +
        '<div>国外版的接口为:api.openai.com</div>' +
        '<div>国外接口(openAI)需要提供 API KEY,本脚本需要<b>自行填写。</b></div>' +
        '<div style="color: red;">推荐低价购买网址:<a href="https://www.fakabang.com/liebiao/797C6DE6E531BFF2" target="_blank">【点我购买】</a></div>' +
        '<div style="color: red;">一人一号,可改密码,自带18美金,附带教程</div>' +
        '</div>' +
        '<div style="color: black;font-size: 12px;border-radius: 5px;padding: 10px;margin: 10px;box-shadow: 0 0 5px #ccc;">' +
        '<div>您当前搜索的内容为:<a style="color: blue;">' + keyword + '</a></div>' +
        '<div>【国内版回答】</div>' +
        // textarea
        '<textarea id="answer1" style="width: 100%;height:50px;border: 1px solid #ccc;border-radius: 5px;padding: 5px;box-sizing: border-box;"></textarea>' +
        '<div>【国外版回答】</div>' +
        '<textarea id="answer2" placeholder="使用国外版,需要在代码第46行填写你的apiKey,并且由于现在接口被墙,需要自备梯子,并开启全局,不然无法请求!!" style="width: 100%;height:75px;border: 1px solid #ccc;border-radius: 5px;padding: 5px;box-sizing: border-box;"></textarea>' +
        // 按钮放在右边,点击获取回答,绑定函数,放在最右边
        // button 绑定函数
        '<div style="text-align: right;"><button class="layx-button-item custom-button" id="get_answer" style="margin-top: 5px;">获取回答</button></div>' +
        '</div>'
    ;
    layx.html('resize-rc', titleHtml, infoHtml, {
        width: 300,
        height: 470,
        statusBar: true,
        storeStatus: false,
        // 浏览器宽度
        skin: 'river',
        position: ['rc', window.innerWidth - 330],
        buttons: [
            {
                label: '关闭',
                callback: function (id, button, event) {
                    layx.destroy(id);
                },
                classes: 'custom-button'
            }
        ]
    });

    // 绑定事件,并且让鼠标变成手型
    document.getElementById('get_answer').addEventListener('mouseover', function () {
        this.style.cursor = 'pointer';
    });
    document.getElementById('get_answer').addEventListener('click', async function () {
        // GM操作访问
        document.getElementById('answer1').value = '获取中...请耐心等待';
        const data1 = {
            prompt: "Human:" + keyword + "\nAI:",
            tokensLength: keyword.length
        }
        GM_xmlhttpRequest({
            method: 'POST',
            url: 'https://api.forchange.cn',
            data: JSON.stringify(data1),
            headers: {
                'Content-Type': 'application/json'
            },
            responseType: 'json',
            onload: function (res) {
                if (res.status === 200) {
                    document.getElementById('answer1').value = res.response.choices[0].text;
                }
                else {
                    document.getElementById('answer1').value = '获取失败';
                }
            }
        });

        // 国外版
        const data2 = {
            prompt: "(You:" + keyword + ")",
            max_tokens: 2048,
            model: "text-davinci-003",
        }
        if (Config.apiKey === '这边填写您的KEY') {
            document.getElementById('answer2').value = '请先填写apiKey';
        }
        else {
            document.getElementById('answer2').value = '获取中...请耐心等待';
            GM_xmlhttpRequest({
                method: 'POST',
                url: 'https://api.openai.com/v1/completions',
                data: JSON.stringify(data2),
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': 'Bearer ' + Config.apiKey + ''
                },
                responseType: 'json',
                onload: function (res) {
                    if (res.status === 200) {
                        // 去除换行符
                        document.getElementById('answer2').value = res.response.choices[0].text.replace(/\\n/g, '');
                    }
                    else {
                        document.getElementById('answer2').value = '获取失败';
                    }
                }
            });
        }
    });

})();