Bing Chat 侧边栏

将 Bing Chat 侧边栏添加到任何网页

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Bing Chat Sidebar
// @name:zh-CN   Bing Chat 侧边栏
// @namespace    https://zyf722.github.io
// @version      1.0
// @icon         https://www.bing.com/sa/simg/favicon-trans-bg-blue-mg.ico
// @description  Add a resizable Bing Chat sidebar to Google search results page
// @description:zh-CN  将 Bing Chat 侧边栏添加到任何网页
// @author       MaxAlex, aka zyf722
// @match        https://www.google.com/*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Config Data
    const defaultHide = GM_getValue("defaultHide", true);

    // Create a container
    const container = document.createElement("div");
    container.style.cssText = `position: fixed; top: 50px; right: ${ defaultHide ? "-400px" : "0"}; width: 450px; height: 100%; padding: 10px; `;

    // Create a container for the sidebar
    const sidebar = document.createElement("div");
    sidebar.style.cssText = `position: fixed; top: 50px; right: ${ defaultHide ? "-400px" : "0"}; width: 400px; height: 100%; background-color: #f2f2f2; padding: 10px; border-left: 1px solid #ddd; overflow-y: scroll; cursor: col-resize;`;

    // Create an iframe element to load the sidebar content
    const iframe = document.createElement("iframe");
    //iframe.src = "https://www.example.org";
    iframe.src = "https://edgeservices.bing.com/edgediscover/query?lightschemeovr=1&FORM=SHORUN&udscs=1&udsnav=1&features=udssydinternal&clientscopes=windowheader,coauthor,chat,&udsframed=1";
    iframe.style.cssText = "width: 100%; height: 90%; border: none;";

    // Create a toggle button
    const button = document.createElement("button");
    button.style.cssText = "position: relative; top: 50%; left: 0; width: 48px; height: 48px; background-color: #f2f2f2; border: 1px solid #ddd; cursor: pointer; border-radius: 70%; transform: translate(-50%, -50%); -webkit-filter: drop-shadow( 0 3px 2px rgba(0, 0, 0, .2)); filter: drop-shadow( 0 3px 2px rgba(0, 0, 0, .2));";
    button.innerHTML = '<svg viewBox="0 0 36 36" style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);"><image width="36" height="36" xlink:href="https://upload.wikimedia.org/wikipedia/commons/9/9c/Bing_Fluent_Logo.svg"/></svg>';
    container.appendChild(button);

    // Define a function for toggling the sidebar
    const toggleSidebar = () => {
        if (hide == true) {
            sidebar.style.transition = "all 0.2s ease-in-out";
            container.style.transition = "all 0.2s ease-in-out";
            container.style.right = "0";
            sidebar.style.right = "0";
            hide = false;
        } else {
            sidebar.style.transition = "all 0.2s ease-in-out";
            container.style.transition = "all 0.2s ease-in-out";
            container.style.right = `-${currentWidth}px`;
            sidebar.style.right = `-${currentWidth}px`;
            hide = true;
        }
    };

    // Add an event listener for when the button is clicked
    button.addEventListener("click", e => {
        e.preventDefault();
        toggleSidebar();
    });

    // Append the iframe to the sidebar container
    sidebar.appendChild(iframe);

    // Add the sidebar to the page
    container.appendChild(sidebar);
    document.body.appendChild(container);

    // Initialize variables for tracking mouse movements
    let startX = 0;
    let startWidth = 0;
    let currentWidth = parseInt(sidebar.style.width)
    let hide = defaultHide;

    // Add an event listener for when the resize handle is clicked
    sidebar.addEventListener("mousedown", e => {
        e.preventDefault();
        startX = e.clientX;
        startWidth = parseInt(document.defaultView.getComputedStyle(sidebar).width, 10);
        document.documentElement.addEventListener("mousemove", onMouseMove);
        document.documentElement.addEventListener("mouseup", onMouseUp);

        // set sidebar transition
        sidebar.style.transition = "none";
        container.style.transition = "none";
    });

    // Define the function that handles mouse movements
    const onMouseMove = e => {
        const newWidth = startWidth - (e.clientX - startX);
        sidebar.style.width = `${newWidth}px`;
        container.style.width = `${newWidth+50}px`;
        currentWidth = parseInt(sidebar.style.width)
    };

    // Define the function that handles mouse release
    const onMouseUp = e => {
        document.documentElement.removeEventListener("mousemove", onMouseMove);
        document.documentElement.removeEventListener("mouseup", onMouseUp);
    };

    // Config
    GM_registerMenuCommand("侧边栏是否默认隐藏:"+(defaultHide ? "✅ 隐藏" : "❌ 展开"), () => {
        GM_setValue("defaultHide", !defaultHide);
    })
})();