您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Injects a preset dropdown and autofills JanitorAI-style proxy forms
// ==UserScript== // @name JanitorAI Proxy AutoFill w/ Preset Dropdown // @namespace https://janitorai.com/ // @version 1.1 // @description Injects a preset dropdown and autofills JanitorAI-style proxy forms // @match https://janitorai.com/chats/* // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; const STORAGE_KEY = 'user_presets'; const fireReactInput = (el, value) => { const lastValue = el.value; el.value = value; const tracker = el._valueTracker; if (tracker) tracker.setValue(lastValue); el.dispatchEvent(new Event('input', { bubbles: true })); }; const getPresets = () => JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}'); const savePresets = (presets) => localStorage.setItem(STORAGE_KEY, JSON.stringify(presets)); function applyPreset(name) { const presets = getPresets(); const p = presets[name]; if (!p) return; const modelInput = document.querySelector('input[placeholder="model"]'); const proxyInput = document.querySelector('#proxy-url'); const keyInput = document.querySelector('#api-key'); const promptBox = document.querySelector('#custom-prompt'); if (modelInput) fireReactInput(modelInput, p.model); if (proxyInput) fireReactInput(proxyInput, p.proxy); if (keyInput) fireReactInput(keyInput, p.key); if (promptBox) fireReactInput(promptBox, p.prompt); } function injectDropdown() { if (document.querySelector('#presetDropdown')) return; const target = document.querySelector('h3._heading_zf221_7'); if (!target) return; const container = document.createElement('div'); container.style.margin = '10px 0'; const label = document.createElement('label'); label.textContent = '🔥 Preset: '; label.style.marginRight = '8px'; label.style.fontWeight = 'bold'; const dropdown = document.createElement('select'); dropdown.id = 'presetDropdown'; dropdown.style.padding = '5px'; dropdown.style.borderRadius = '5px'; dropdown.style.marginRight = '10px'; const presets = getPresets(); for (const name in presets) { const opt = document.createElement('option'); opt.value = name; opt.textContent = name; dropdown.appendChild(opt); } // Load last selected preset const saved = localStorage.getItem('custom_preset_choice'); if (saved && presets[saved]) { dropdown.value = saved; applyPreset(saved); } dropdown.addEventListener('change', () => { const selected = dropdown.value; localStorage.setItem('custom_preset_choice', selected); applyPreset(selected); }); const saveBtn = document.createElement('button'); saveBtn.textContent = '💾 Save Current as Preset'; saveBtn.style.marginRight = '10px'; saveBtn.onclick = () => { const name = prompt("Enter preset name:"); if (!name) return; const model = document.querySelector('input[placeholder="model"]')?.value || ''; const proxy = document.querySelector('#proxy-url')?.value || ''; const key = document.querySelector('#api-key')?.value || ''; const promptText = document.querySelector('#custom-prompt')?.value || ''; const newPresets = getPresets(); newPresets[name] = { model, proxy, key, prompt: promptText }; savePresets(newPresets); // Add to dropdown const opt = document.createElement('option'); opt.value = name; opt.textContent = name; dropdown.appendChild(opt); dropdown.value = name; localStorage.setItem('custom_preset_choice', name); alert(`Preset "${name}" saved!`); }; const deleteBtn = document.createElement('button'); deleteBtn.textContent = '🗑 Delete Preset'; deleteBtn.style.color = 'red'; deleteBtn.onclick = () => { const selected = dropdown.value; if (!confirm(`Delete preset "${selected}"?`)) return; const newPresets = getPresets(); delete newPresets[selected]; savePresets(newPresets); dropdown.querySelector(`option[value="${selected}"]`)?.remove(); dropdown.selectedIndex = 0; localStorage.setItem('custom_preset_choice', dropdown.value); applyPreset(dropdown.value); alert(`Preset "${selected}" deleted.`); }; container.appendChild(label); container.appendChild(dropdown); container.appendChild(saveBtn); container.appendChild(deleteBtn); target.parentElement.insertBefore(container, target.nextSibling); } const observer = new MutationObserver(() => injectDropdown()); function startObserver() { const settingsPanel = document.body; if (!settingsPanel) return setTimeout(startObserver, 300); observer.observe(settingsPanel, { childList: true, subtree: true }); injectDropdown(); } startObserver(); })();