您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automatically clicks the send button in Sully Tavern when "Google AI Studio Candidate text empty" error occurs.
// ==UserScript== // @name SullyTavern Auto Resend on Empty AI // @namespace http://tampermonkey.net/ // @version 1.0 // @description Automatically clicks the send button in Sully Tavern when "Google AI Studio Candidate text empty" error occurs. // @author Your Helper // @match http://127.0.0.1:8000/* // @match http://localhost:8000/* // @match http://127.0.0.1:8000 // @match http://localhost:8000 // @grant none // @run-at document-start // ==/UserScript== (function() { 'use strict'; const TARGET_ERROR_SUBSTRING = "Google AI Studio Candidate text empty"; const BUTTON_ID = "send_but"; const SCRIPT_PREFIX = "[SullyTavern AutoResend] "; let errorHandlingInitialized = false; function handleError(errorSource, errorDetails) { let errorMessage = ""; if (typeof errorDetails === 'string') { errorMessage = errorDetails; } else if (errorDetails instanceof Error) { errorMessage = errorDetails.message || ""; } else if (errorDetails && typeof errorDetails.reason !== 'undefined') { // For unhandledrejection event if (errorDetails.reason instanceof Error) { errorMessage = errorDetails.reason.message || ""; } else if (typeof errorDetails.reason === 'string') { errorMessage = errorDetails.reason; } } if (typeof errorMessage === 'string' && errorMessage.includes(TARGET_ERROR_SUBSTRING)) { console.log(SCRIPT_PREFIX + `Target error detected via ${errorSource}: "${errorMessage}". Clicking send button.`); clickSendButton(); } } function initializeErrorHandlers() { if (errorHandlingInitialized) { return; } // 1. Hook console.error (as a fallback, unhandledrejection is primary for this error) if (typeof console !== 'undefined' && typeof console.error !== 'undefined') { const originalConsoleError = console.error; console.error = function(...args) { originalConsoleError.apply(console, args); if (args.length > 0) { handleError("console.error", args[0]); } }; } // 2. Hook unhandled promise rejections (primary method for this error) if (typeof window !== 'undefined') { window.addEventListener('unhandledrejection', function(event) { // We don't need to log the full event object in the final version // console.log(SCRIPT_PREFIX + "Unhandled rejection EVENT caught."); handleError("unhandledrejection", event); }); } errorHandlingInitialized = true; console.log(SCRIPT_PREFIX + "Script loaded and error listeners active."); } function clickSendButton() { setTimeout(() => { const sendButton = document.getElementById(BUTTON_ID); if (sendButton) { if (sendButton.offsetParent !== null && !sendButton.disabled) { sendButton.click(); // console.log(SCRIPT_PREFIX + "Send button clicked."); // Можно раскомментировать, если хотите видеть подтверждение клика } else { console.warn(SCRIPT_PREFIX + `Send button found but is not clickable (Visible: ${sendButton.offsetParent !== null}, Disabled: ${sendButton.disabled}).`); } } else { console.warn(SCRIPT_PREFIX + `Send button with ID "${BUTTON_ID}" NOT FOUND.`); } }, 100); // 100 мс задержка } // Initialize handlers if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initializeErrorHandlers); } else { initializeErrorHandlers(); } window.addEventListener('load', () => { if (!errorHandlingInitialized) { initializeErrorHandlers(); } }); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址