您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Dịch trang web sử dụng API của STV
当前为
// ==UserScript== // @name STV Web Translator for ducninh.io.vn // @namespace http://tampermonkey.net/ // @version 1.3 // @description Dịch trang web sử dụng API của STV // @author banquyy // @match http://ducninh.io.vn:8000/* // @match http://ducninh.io.vn/* // @match http://localhost:8000/* // @match http://127.0.0.1:8000/* // @grant GM_xmlhttpRequest // @grant GM_addStyle // @connect comic.sangtacvietcdn.xyz // @run-at document-idle // ==/UserScript== (function() { 'use strict'; // Xóa nút dịch nổi và các tùy chọn không cần thiết GM_addStyle(` .translate-button, .translate-options { display: none !important; } `); // Kiểm tra và đợi cho DOM tải xong function waitForDOM() { return new Promise(resolve => { if (document.readyState === 'complete' || document.readyState === 'interactive') { setTimeout(resolve, 500); } else { document.addEventListener('DOMContentLoaded', () => setTimeout(resolve, 500)); } }); } // Hàm dịch văn bản bằng STV async function translateWithSTV(text) { if (!text || text.trim() === '') return ''; return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'POST', url: 'https://comic.sangtacvietcdn.xyz/tsm.php?cdn=/', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: `sajax=trans&content=${encodeURIComponent(text)}`, onload: function(response) { if (response.status === 200) { resolve(cleanSTVTranslation(response.responseText)); } else { reject('Lỗi khi dịch: ' + response.statusText); } }, onerror: function(error) { reject('Lỗi kết nối: ' + error); } }); }); } // Hàm làm sạch kết quả dịch từ STV function cleanSTVTranslation(text) { return text .replace(/"([^"]*?)"\s+\*/g, '"$1"*') .replace(/\*\s+"([^"]*?)"/g, '*"$1"') .replace(/([^\s])\s+\*/g, '$1*') .replace(/\*\s+([^\s])/g, '*$1') .replace(/<\/?q>/g, '') .replace(/\s{2,}/g, ' ') .trim(); } // Hàm dịch nội dung trong chat-messages async function translateChatMessages(mesBlock) { // Tìm tất cả các iframe trong mes_block const iframes = mesBlock.querySelectorAll('iframe'); for (const iframe of iframes) { try { // Đảm bảo iframe đã load xong if (iframe.contentDocument) { // Tìm .chat-messages trong iframe const chatMessages = iframe.contentDocument.querySelector('.chat-messages'); if (chatMessages) { // Lưu trữ nội dung gốc nếu chưa có if (!chatMessages.dataset.originalContent) { chatMessages.dataset.originalContent = chatMessages.innerHTML; } // Tìm tất cả các message-content trong chat-messages const messageContents = chatMessages.querySelectorAll('.message-content'); for (const content of messageContents) { // Lưu nội dung gốc của từng message if (!content.dataset.originalContent) { content.dataset.originalContent = content.textContent; } // Chỉ dịch nếu không phải là hình ảnh if (!content.querySelector('img')) { const originalText = content.dataset.originalContent; const translatedText = await translateWithSTV(originalText); content.textContent = translatedText; } } console.log('Đã dịch nội dung chat thành công'); } } } catch (error) { console.error('Lỗi khi truy cập iframe:', error); } } } // Cải tiến: Thêm event listener thay vì thay thế nút function setupTranslateButtons() { document.addEventListener('click', function(event) { // Kiểm tra xem phần tử được click có class mes_translate không if (event.target.classList.contains('mes_translate') || event.target.closest('.mes_translate')) { event.preventDefault(); event.stopPropagation(); // Tìm mes_block cha const button = event.target.classList.contains('mes_translate') ? event.target : event.target.closest('.mes_translate'); const mesBlock = button.closest('.mes_block'); if (mesBlock) { translateChatMessages(mesBlock); } } }, true); // Sử dụng capturing để bắt sự kiện trước khi nó đến target } // Thêm phím tắt Alt+T để dịch tin nhắn hiện tại function addKeyboardShortcut() { document.addEventListener('keydown', function(e) { if (e.altKey && e.key === 't') { // Tìm tin nhắn đang được focus hoặc tin nhắn cuối cùng const focusedMessage = document.activeElement.closest('.mes_block'); if (focusedMessage) { translateChatMessages(focusedMessage); } else { // Nếu không có tin nhắn nào được focus, dịch tin nhắn cuối cùng const lastMessage = document.querySelector('.mes_block:last-child'); if (lastMessage) { translateChatMessages(lastMessage); } } } }); } // Hàm khởi tạo async function init() { await waitForDOM(); setupTranslateButtons(); addKeyboardShortcut(); console.log('STV Web Translator đã được khởi tạo thành công!'); } // Khởi chạy script init(); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址