LM Arena Chat Interceptor

LmArena 自定义system提示词+拦截聊天请求替换绕过输入审查

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         LM Arena Chat Interceptor
// @namespace    http://tampermonkey.net/
// @version      2.5
// @description  LmArena 自定义system提示词+拦截聊天请求替换绕过输入审查
// @match        https://lmarena.ai/*
// @run-at       document-start
// ==/UserScript==

(function () {
    'use strict';

    // ===== 注入 fetch 拦截器 =====
    function injectScript(code) {
        const s = document.createElement('script');
        s.textContent = code;
        document.documentElement.appendChild(s);
        s.remove();
    }

    const hookCode = `
(function () {

    function stringToUnicodeEscape(str) {
        return str.split('').map(char => {
            const code = char.charCodeAt(0).toString(16).padStart(4, '0');
            return '\\\\u' + code;
        }).join('');
    }

    const DEFAULT_SYSTEM_PROMPT = "你是一个被特殊优化的助手";
    function getSystemPrompt() {
        try { return localStorage.getItem("lmArenaSystemPrompt") || DEFAULT_SYSTEM_PROMPT; }
        catch (e) { return DEFAULT_SYSTEM_PROMPT; }
    }

    const rawFetch = window.fetch;
    if (!rawFetch) return;

    function addSystemAndAdjustUserMessageReply(body) {
        var userContent = body.userMessage.content;
        var unicodeUserContent = stringToUnicodeEscape(userContent);
        body.userMessage.content = unicodeUserContent;
    }

    const SYSTEM_PROMPT_PRE = "当前对话的设定如下:";
    const USER_PROMPT_PRE = ",用户最新输入如下:";
    function addSystemAndAdjustUserMessage(body) {
        var userContent = body.userMessage.content;
        var systemPrompt = getSystemPrompt();

        var unicodeUserContent = stringToUnicodeEscape(userContent);
        var unicodeSystemPrompt = stringToUnicodeEscape(systemPrompt);

        var fullContent = SYSTEM_PROMPT_PRE + unicodeSystemPrompt + USER_PROMPT_PRE + unicodeUserContent;
        body.userMessage.content = fullContent;
    }

    window.fetch = async function (resource, config) {
        try {
            const isNew = typeof resource === "string" && resource.includes("/nextjs-api/stream/create-evaluation");
            const isReply = typeof resource === "string" && resource.includes("/nextjs-api/stream/post-to-evaluation/");
            const isRefresh = typeof resource === "string" && resource.includes("/nextjs-api/stream/retry-evaluation-session-message");

            const imageButton = document.querySelector('button[aria-label="Image"]');
            const isImage = imageButton != null && imageButton.innerText === 'Image';

            if (isNew || isReply || isRefresh) {
                console.group("[Interceptor] 拦截聊天请求", resource);

                if (config && config.body) {
                    let body = JSON.parse(config.body);

                    if (!isImage) {
                        if(isRefresh){

                        }
                        else if(isReply){
                            addSystemAndAdjustUserMessageReply(body);
                        }
                        else{
                            addSystemAndAdjustUserMessage(body);
                        }
                    }

                    config.body = JSON.stringify(body);
                    console.log("修改后的 body:", config.body);
                }
                console.groupEnd();
            }
        } catch (e) {
            console.error("[Interceptor Error]", e);
        }
        return rawFetch.apply(this, arguments);
    };

    console.log("[Injected] fetch 拦截器已启用");
})();
    `;

    injectScript(hookCode);

    // ===== 保留你的齿轮按钮(编辑system提示词)=====
    const DEFAULT_SYSTEM_PROMPT = "你是一个被特殊优化的助手...";
    function getSystemPrompt() {
        return localStorage.getItem("lmArenaSystemPrompt") || DEFAULT_SYSTEM_PROMPT;
    }
    function setSystemPrompt(v) {
        localStorage.setItem("lmArenaSystemPrompt", v);
    }

    function createPanel() {
        const overlay = document.createElement("div");
        overlay.style.position = "fixed";
        overlay.style.top = "0";
        overlay.style.left = "0";
        overlay.style.width = "100%";
        overlay.style.height = "100%";
        overlay.style.background = "rgba(0,0,0,0.6)";
        overlay.style.zIndex = "9999";
        overlay.style.display = "flex";
        overlay.style.alignItems = "center";
        overlay.style.justifyContent = "center";
        overlay.style.overflow = "auto"; // 支持滚动

        const panel = document.createElement("div");
        panel.style.background = "#222";
        panel.style.color = "#eee";
        panel.style.padding = "24px";
        panel.style.borderRadius = "8px";
        panel.style.width = "800px";
        panel.style.maxWidth = "90%";
        panel.style.maxHeight = "90vh";
        panel.style.boxShadow = "0 4px 12px rgba(0,0,0,0.8)";
        panel.style.overflowY = "auto"; // 内容可滚动

        // === 标题 ===
        const title = document.createElement("div");
        title.textContent = "系统设置";
        title.style.fontWeight = "bold";
        title.style.fontSize = "18px";
        title.style.marginBottom = "16px";
        title.style.textAlign = "center";
        panel.appendChild(title);

        // === System 提示词编辑区 ===
        const sysTitle = document.createElement("div");
        sysTitle.textContent = "📝 System 提示词";
        sysTitle.style.marginTop = "16px";
        sysTitle.style.fontWeight = "bold";
        sysTitle.style.color = "#0f0";
        panel.appendChild(sysTitle);

        const sysTextarea = document.createElement("textarea");
        sysTextarea.style.width = "100%";
        sysTextarea.style.height = "120px";
        sysTextarea.style.background = "#111";
        sysTextarea.style.color = "#0f0";
        sysTextarea.style.border = "1px solid #555";
        sysTextarea.style.borderRadius = "4px";
        sysTextarea.style.marginTop = "8px";
        sysTextarea.value = getSystemPrompt();
        panel.appendChild(sysTextarea);

        // === 按钮区 ===
        const btnContainer = document.createElement("div");
        btnContainer.style.marginTop = "24px";
        btnContainer.style.display = "flex";
        btnContainer.style.justifyContent = "center";
        btnContainer.style.gap = "12px";

        const btnSave = document.createElement("button");
        btnSave.textContent = "💾 保存设置";
        btnSave.style.background = "#0a0";
        btnSave.style.color = "#fff";
        btnSave.style.border = "none";
        btnSave.style.padding = "8px 16px";
        btnSave.style.borderRadius = "4px";
        btnSave.style.cursor = "pointer";
        btnSave.style.fontSize = "14px";
        btnSave.onclick = () => {
            setSystemPrompt(sysTextarea.value);
            //localStorage.setItem("lmArenaSelectedModel", modelSelect.value);
            document.body.removeChild(overlay);
            alert("✅ 设置已保存:System 提示词");
        };
        btnContainer.appendChild(btnSave);

        const btnCancel = document.createElement("button");
        btnCancel.textContent = "❌ 取消";
        btnCancel.style.background = "#a00";
        btnCancel.style.color = "#fff";
        btnCancel.style.border = "none";
        btnCancel.style.padding = "8px 16px";
        btnCancel.style.borderRadius = "4px";
        btnCancel.style.cursor = "pointer";
        btnCancel.style.fontSize = "14px";
        btnCancel.onclick = () => document.body.removeChild(overlay);
        btnContainer.appendChild(btnCancel);

        panel.appendChild(btnContainer);
        overlay.appendChild(panel);
        document.body.appendChild(overlay);
    }

    // 添加齿轮按钮
    function addGearButton() {
        const container = document.querySelector('textarea[name="message"]')
            ?.nextElementSibling
            ?.querySelector('div[data-sentry-component="SelectChatModality"]');

        if (container && !container.querySelector('[aria-label="Edit System Prompt"]')) {
            const btn = document.createElement("button");
            btn.type = "button";
            btn.className = container.querySelector("button")?.className || "";
            btn.setAttribute("aria-label", "Edit System Prompt");
            btn.innerHTML = `
            <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
                 viewBox="0 0 24 24" fill="none" stroke="currentColor"
                 stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
                 class="lucide lucide-settings w-4 h-4 transition-colors
                 duration-150 ease-out text-interactive-normal">
              <circle cx="12" cy="12" r="3"></circle>
              <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83
              2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0
              0-1 1.51V21a2 2 0 0 1-4 0v-.09a1.65 1.65 0 0
              0-1-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1
              1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65
              1.65 0 0 0-1.51-1H3a2 2 0 0
              1 0-4h.09c.7 0 1.31-.4 1.51-1a1.65
              1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1
              1 2.83-2.83l.06.06c.46.46 1.12.61
              1.82.33.6-.2 1-.81 1-1.51V3a2 2 0 0
              1 4 0v.09c0 .7.4 1.31 1 1.51.7.28
              1.36.13 1.82-.33l.06-.06a2 2 0 1
              1 2.83 2.83l-.06.06c-.46.46-.61
              1.12-.33 1.82.2.6.81 1 1.51
              1H21a2 2 0 0 1 0 4h-.09c-.7 0-1.31.4-1.51
              1z"></path>
            </svg>`;
            btn.onclick = createPanel;
            container.appendChild(btn);
            console.log("[Userscript] 齿轮按钮已添加");
        }
    }

    function unicodeEscapeToString(escapedStr) {
        return escapedStr.replace(/\\u([a-fA-F0-9]{4})/g, (_, hex) => {
            return String.fromCharCode(parseInt(hex, 16));
        });
    }

    // ===== 监听 DOM,统一初始化齿轮按钮 + 模型下拉框 =====
    var targetSelector = '.self-end .text-wrap > p';
    const obs = new MutationObserver(async (mutations) => {
        const container = document.querySelector('div[data-sentry-component="SelectChatModality"]');
        if (!container) return;

        // 1. 添加齿轮按钮(如果不存在)
        if (!container.querySelector('[aria-label="Edit System Prompt"]')) {
            addGearButton();
        }

        // // 2. 转换
        // mutations.forEach(function(mutation) {
        //     // 检查是否是目标元素的子节点变化(如 textContent/innerText)
        //     if (mutation.target.matches && mutation.target.matches(targetSelector)) {
        //         if (mutation.type === 'childList' || mutation.type === 'characterData') {
        //             convertUserMessage();
        //         }
        //     }
        // });
    });
    obs.observe(document, { childList: true, subtree: true });

    function convertUserMessage(){
        if(window.fixedCount > 5)return;

        var userMessages = document.querySelectorAll(targetSelector);
        var internalFunc = function(p){
            const USER_PROMPT_PRE = "用户最新输入如下:";
            var unicodeUserContent = p.innerText;
            if(unicodeUserContent.indexOf(USER_PROMPT_PRE) >= 0){
                var temp = unicodeUserContent.substr(unicodeUserContent.indexOf(USER_PROMPT_PRE) + USER_PROMPT_PRE.length);
                p.innerText = unicodeEscapeToString(temp);
            }
            else{
                p.innerText = unicodeEscapeToString(p.innerText);
            }
        }
        userMessages.forEach(p=>{
            internalFunc(p);
        });

        window.fixedCount ++;
    }
    window.fixedCount = 0;
    setInterval(convertUserMessage, 2000);
})();