diff --git a/index.html b/index.html index 126e983..b5578f4 100644 --- a/index.html +++ b/index.html @@ -1,63 +1,63 @@ - - - - 影刀 PY 助手 - - - - -

Copy mode is off

- - - + + + + 影刀 PY 助手 + + + + +

Copy mode is off

+ + + diff --git a/manifest.json b/manifest.json index bbdd9d9..85f8012 100644 --- a/manifest.json +++ b/manifest.json @@ -1,40 +1,40 @@ -{ - "name": "Xbot PY Helper", - "description": "自动生成 网页自动化代码", - "version": "0.1.2", - "manifest_version": 3, - "permissions": [ - "activeTab", - "scripting", - "clipboardWrite" - ], - "background": { - "service_worker": "scripts/background.js" - }, - "action": { - "default_popup": "index.html", - "default_icon": "images/yingdao-16x16.png" - }, - "content_scripts": [ - { - "matches": [ - "" - ], - "js": [ - "scripts/content.js" - ], - "run_at": "document_idle", - "all_frames": true - } - ], - "web_accessible_resources": [ - { - "resources": [ - "scripts/popup.js" - ], - "matches": [ - "" - ] - } - ] -} +{ + "name": "Xbot PY Helper", + "description": "自动生成 网页自动化代码", + "version": "0.1.2", + "manifest_version": 3, + "permissions": [ + "activeTab", + "scripting", + "clipboardWrite" + ], + "background": { + "service_worker": "scripts/background.js" + }, + "action": { + "default_popup": "index.html", + "default_icon": "images/yingdao-16x16.png" + }, + "content_scripts": [ + { + "matches": [ + "" + ], + "js": [ + "scripts/content.js" + ], + "run_at": "document_idle", + "all_frames": true + } + ], + "web_accessible_resources": [ + { + "resources": [ + "scripts/popup.js" + ], + "matches": [ + "" + ] + } + ] +} diff --git a/readme.md b/readme.md index 062dad8..8d91dfc 100644 --- a/readme.md +++ b/readme.md @@ -1,12 +1,12 @@ -# 影刀YD助手 -## 项目介绍 - - -## 功能介绍 -鼠标悬浮到元素上, 自动生成影刀代码 - -## 优化项目 - -1. 生成xpath的规则 -2. 支持跨域 -3. 支持开始和关闭拷贝模式 +# 影刀YD助手 +## 项目介绍 + + +## 功能介绍 +鼠标悬浮到元素上, 自动生成影刀代码 + +## 优化项目 + +1. 生成xpath的规则 +2. 支持跨域 +3. 支持开始和关闭拷贝模式 diff --git a/scripts/background.js b/scripts/background.js index 05d0674..22c13fb 100644 --- a/scripts/background.js +++ b/scripts/background.js @@ -1,32 +1,32 @@ -let isCopyModeEnabled = false; - -chrome.action.onClicked.addListener(function (tab) { - chrome.scripting.executeScript({ - target: { tabId: tab.id }, - function: toggleCopyMode - }); -}); - -chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { - if (request.action === 'toggleCopyMode') { - isCopyModeEnabled = !isCopyModeEnabled; - chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { - chrome.tabs.sendMessage(tabs[0].id, { action: 'toggleCopyMode' }, function (response) { - sendResponse({ copyModeEnabled: isCopyModeEnabled }); - }); - }); - return true; // Keep the message channel open for sendResponse - } else if (request.action === 'getCopyModeStatus') { - sendResponse({ copyModeEnabled: isCopyModeEnabled }); - } -}); - -function toggleCopyMode() { - chrome.runtime.sendMessage({ action: 'toggleCopyMode' }, function (response) { - if (response.copyModeEnabled) { - console.log('Copy mode enabled'); - } else { - console.log('Copy mode disabled'); - } - }); -} +let isCopyModeEnabled = false; + +chrome.action.onClicked.addListener(function (tab) { + chrome.scripting.executeScript({ + target: { tabId: tab.id }, + function: toggleCopyMode + }); +}); + +chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { + if (request.action === 'toggleCopyMode') { + isCopyModeEnabled = !isCopyModeEnabled; + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + chrome.tabs.sendMessage(tabs[0].id, { action: 'toggleCopyMode' }, function (response) { + sendResponse({ copyModeEnabled: isCopyModeEnabled }); + }); + }); + return true; // Keep the message channel open for sendResponse + } else if (request.action === 'getCopyModeStatus') { + sendResponse({ copyModeEnabled: isCopyModeEnabled }); + } +}); + +function toggleCopyMode() { + chrome.runtime.sendMessage({ action: 'toggleCopyMode' }, function (response) { + if (response.copyModeEnabled) { + console.log('Copy mode enabled'); + } else { + console.log('Copy mode disabled'); + } + }); +} diff --git a/scripts/content.js b/scripts/content.js index de84f51..a86221b 100644 --- a/scripts/content.js +++ b/scripts/content.js @@ -1,191 +1,191 @@ -(function () { - - console.log("Content script injected into:", window.location.href); - - // 清除之前的高亮样式 - let previousHighlight = null; - let copyButton = null; - let isCopyModeEnabled = false; - let copyMessage = null; - - // 创建复制按钮 - function createCopyButton() { - const button = document.createElement('button'); - button.innerHTML = '📋'; // 使用图标展示拷贝 - button.style.position = 'absolute'; - button.style.zIndex = '1000'; - button.style.display = 'none'; - button.style.background = 'transparent'; - button.style.border = 'none'; - button.style.cursor = 'pointer'; - button.style.fontSize = '16px'; - button.addEventListener('click', function () { - if (previousHighlight) { - const xpath = getElementXPath(previousHighlight); - const action = previousHighlight.tagName.toLowerCase() === 'input' ? 'input("your_text")' : 'click()'; - const command = `web.find_by_xpath("${xpath}").${action}`; - navigator.clipboard.writeText(command).then(() => { - console.log('Command copied to clipboard:', command); - copyMessage.style.display = 'block'; - setTimeout(() => { - copyMessage.style.display = 'none'; - }, 3000); - }); - } - }); - document.body.appendChild(button); - return button; - } - - // 创建复制消息提示 - function createCopyMessage() { - const message = document.createElement('div'); - message.innerHTML = '已拷贝! x '; - message.style.position = 'fixed'; - message.style.top = '10px'; - message.style.left = '50%'; - message.style.transform = 'translateX(-50%)'; - message.style.background = '#1E3A8A'; - message.style.color = '#F9FAFB'; - message.style.padding = '10px'; - message.style.borderRadius = '5px'; - message.style.display = 'none'; - message.style.zIndex = '1001'; - message.style.fontSize = '16px'; // 增大字体 - message.querySelector('span').addEventListener('click', function () { - message.style.display = 'none'; - }); - document.body.appendChild(message); - return message; - } - - // 获取元素的 XPath - function getElementXPath(element) { - if (element.id) { - return `//*[@id="${element.id}"]`; - } - - const parts = []; - while (element && element.nodeType === Node.ELEMENT_NODE) { - let selector = element.nodeName.toLowerCase(); - if (element.className) { - selector += `[@class="${element.className}"]`; - } else if (element.textContent.trim()) { - selector += `[text()="${element.textContent.trim()}"]`; - } else if (element.id) { - selector += `[@id="${element.id}"]`; - } else { - let sibling = element; - let index = 1; - while (sibling.previousElementSibling) { - sibling = sibling.previousElementSibling; - if (sibling.nodeName.toLowerCase() === selector) { - index++; - } - } - selector += `[${index}]`; - } - parts.unshift(selector); - element = element.parentNode; - } - return parts.length ? '/' + parts.join('/') : null; - } - - // 监听鼠标移动事件 - document.addEventListener('mousemove', function (event) { - if (!isCopyModeEnabled) return; - - // 移除上一次高亮 - if (previousHighlight) { - previousHighlight.style.background = ''; - previousHighlight.style.backgroundImage = ''; - previousHighlight.style.border = ''; - copyButton.style.display = 'none'; - } - - // 获取鼠标位置 - const mouseX = event.clientX; - const mouseY = event.clientY; - - // 获取鼠标下的元素 - const element = document.elementFromPoint(mouseX, mouseY); - - // 如果有元素,添加高亮样式并输出对应的 XPath - if (element && element !== document.body) { - previousHighlight = element; - element.style.background = 'rgba(255, 182, 193, 0.5)'; // 浅红色背景 - element.style.backgroundImage = 'linear-gradient(45deg, rgba(255, 182, 193, 0.5) 25%, transparent 25%, transparent 50%, rgba(255, 182, 193, 0.5) 50%, rgba(255, 182, 193, 0.5) 75%, transparent 75%, transparent)'; // 浅红色斜线 - element.style.backgroundSize = '10px 10px'; - element.style.border = '2px solid rgba(255, 105, 135, 0.8)'; // 边框颜色稍深 - element.style.borderRadius = '5px'; - - // 设置复制按钮位置并显示 - const rect = element.getBoundingClientRect(); - copyButton.style.left = `${rect.right + window.scrollX - 20}px`; - copyButton.style.top = `${rect.top + window.scrollY}px`; - copyButton.style.display = 'block'; - - // 输出 XPath - const xpath = getElementXPath(element); - console.log('Element XPath:', xpath); - } - }); - - // 监听消息以启用或禁用拷贝模式 - chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { - if (request.action === 'toggleCopyMode') { - isCopyModeEnabled = !isCopyModeEnabled; - if (!isCopyModeEnabled && previousHighlight) { - previousHighlight.style.border = ''; - previousHighlight.style.borderRadius = ''; - previousHighlight.style.boxShadow = ''; - copyButton.style.display = 'none'; - } - sendResponse({ copyModeEnabled: isCopyModeEnabled }); - } - }); - - // 监听键盘事件以启用或禁用拷贝模式 - document.addEventListener('keydown', function (event) { - console.log(event.key); - if (event.altKey && event.key === 'r') { - isCopyModeEnabled = true; - console.log('Copy mode enabled'); - } else if (event.key === 'Escape') { - isCopyModeEnabled = false; - if (previousHighlight) { - previousHighlight.style.background = ''; - previousHighlight.style.backgroundImage = ''; - previousHighlight.style.border = ''; - copyButton.style.display = 'none'; - previousHighlight = null; - } - console.log('Copy mode disabled'); - } else if (event.ctrlKey && event.key === 'c' && previousHighlight) { - const xpath = getElementXPath(previousHighlight); - const action = previousHighlight.tagName.toLowerCase() === 'input' ? 'input("your_text")' : 'click()'; - const command = `web.find_by_xpath("${xpath}").${action}`; - navigator.clipboard.writeText(command).then(() => { - console.log('Command copied to clipboard:', command); - const truncatedXPath = xpath.length > 20 ? xpath.substring(0, 20) + '...' : xpath; - document.getElementById('copied-xpath').innerText = truncatedXPath; - copyMessage.style.display = 'block'; - setTimeout(() => { - copyMessage.style.display = 'none'; - }, 3000); - isCopyModeEnabled = false; - if (previousHighlight) { - previousHighlight.style.background = ''; - previousHighlight.style.backgroundImage = ''; - previousHighlight.style.border = ''; - copyButton.style.display = 'none'; - previousHighlight = null; - } - console.log('Copy mode disabled'); - }); - } - }); - - copyButton = createCopyButton(); - copyMessage = createCopyMessage(); -})(); +(function () { + + console.log("Content script injected into:", window.location.href); + + // 清除之前的高亮样式 + let previousHighlight = null; + let copyButton = null; + let isCopyModeEnabled = false; + let copyMessage = null; + + // 创建复制按钮 + function createCopyButton() { + const button = document.createElement('button'); + button.innerHTML = '📋'; // 使用图标展示拷贝 + button.style.position = 'absolute'; + button.style.zIndex = '1000'; + button.style.display = 'none'; + button.style.background = 'transparent'; + button.style.border = 'none'; + button.style.cursor = 'pointer'; + button.style.fontSize = '16px'; + button.addEventListener('click', function () { + if (previousHighlight) { + const xpath = getElementXPath(previousHighlight); + const action = previousHighlight.tagName.toLowerCase() === 'input' ? 'input("your_text")' : 'click()'; + const command = `web.find_by_xpath("${xpath}").${action}`; + navigator.clipboard.writeText(command).then(() => { + console.log('Command copied to clipboard:', command); + copyMessage.style.display = 'block'; + setTimeout(() => { + copyMessage.style.display = 'none'; + }, 3000); + }); + } + }); + document.body.appendChild(button); + return button; + } + + // 创建复制消息提示 + function createCopyMessage() { + const message = document.createElement('div'); + message.innerHTML = '已拷贝! x '; + message.style.position = 'fixed'; + message.style.top = '10px'; + message.style.left = '50%'; + message.style.transform = 'translateX(-50%)'; + message.style.background = '#1E3A8A'; + message.style.color = '#F9FAFB'; + message.style.padding = '10px'; + message.style.borderRadius = '5px'; + message.style.display = 'none'; + message.style.zIndex = '1001'; + message.style.fontSize = '16px'; // 增大字体 + message.querySelector('span').addEventListener('click', function () { + message.style.display = 'none'; + }); + document.body.appendChild(message); + return message; + } + + // 获取元素的 XPath + function getElementXPath(element) { + if (element.id) { + return `//*[@id="${element.id}"]`; + } + + const parts = []; + while (element && element.nodeType === Node.ELEMENT_NODE) { + let selector = element.nodeName.toLowerCase(); + if (element.className) { + selector += `[@class="${element.className}"]`; + } else if (element.textContent.trim()) { + selector += `[text()="${element.textContent.trim()}"]`; + } else if (element.id) { + selector += `[@id="${element.id}"]`; + } else { + let sibling = element; + let index = 1; + while (sibling.previousElementSibling) { + sibling = sibling.previousElementSibling; + if (sibling.nodeName.toLowerCase() === selector) { + index++; + } + } + selector += `[${index}]`; + } + parts.unshift(selector); + element = element.parentNode; + } + return parts.length ? '/' + parts.join('/') : null; + } + + // 监听鼠标移动事件 + document.addEventListener('mousemove', function (event) { + if (!isCopyModeEnabled) return; + + // 移除上一次高亮 + if (previousHighlight) { + previousHighlight.style.background = ''; + previousHighlight.style.backgroundImage = ''; + previousHighlight.style.border = ''; + copyButton.style.display = 'none'; + } + + // 获取鼠标位置 + const mouseX = event.clientX; + const mouseY = event.clientY; + + // 获取鼠标下的元素 + const element = document.elementFromPoint(mouseX, mouseY); + + // 如果有元素,添加高亮样式并输出对应的 XPath + if (element && element !== document.body) { + previousHighlight = element; + element.style.background = 'rgba(255, 182, 193, 0.5)'; // 浅红色背景 + element.style.backgroundImage = 'linear-gradient(45deg, rgba(255, 182, 193, 0.5) 25%, transparent 25%, transparent 50%, rgba(255, 182, 193, 0.5) 50%, rgba(255, 182, 193, 0.5) 75%, transparent 75%, transparent)'; // 浅红色斜线 + element.style.backgroundSize = '10px 10px'; + element.style.border = '2px solid rgba(255, 105, 135, 0.8)'; // 边框颜色稍深 + element.style.borderRadius = '5px'; + + // 设置复制按钮位置并显示 + const rect = element.getBoundingClientRect(); + copyButton.style.left = `${rect.right + window.scrollX - 20}px`; + copyButton.style.top = `${rect.top + window.scrollY}px`; + copyButton.style.display = 'block'; + + // 输出 XPath + const xpath = getElementXPath(element); + console.log('Element XPath:', xpath); + } + }); + + // 监听消息以启用或禁用拷贝模式 + chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { + if (request.action === 'toggleCopyMode') { + isCopyModeEnabled = !isCopyModeEnabled; + if (!isCopyModeEnabled && previousHighlight) { + previousHighlight.style.border = ''; + previousHighlight.style.borderRadius = ''; + previousHighlight.style.boxShadow = ''; + copyButton.style.display = 'none'; + } + sendResponse({ copyModeEnabled: isCopyModeEnabled }); + } + }); + + // 监听键盘事件以启用或禁用拷贝模式 + document.addEventListener('keydown', function (event) { + console.log(event.key); + if (event.altKey && event.key === 'r') { + isCopyModeEnabled = true; + console.log('Copy mode enabled'); + } else if (event.key === 'Escape') { + isCopyModeEnabled = false; + if (previousHighlight) { + previousHighlight.style.background = ''; + previousHighlight.style.backgroundImage = ''; + previousHighlight.style.border = ''; + copyButton.style.display = 'none'; + previousHighlight = null; + } + console.log('Copy mode disabled'); + } else if (event.ctrlKey && event.key === 'c' && previousHighlight) { + const xpath = getElementXPath(previousHighlight); + const action = previousHighlight.tagName.toLowerCase() === 'input' ? 'input("your_text")' : 'click()'; + const command = `web.find_by_xpath("${xpath}").${action}`; + navigator.clipboard.writeText(command).then(() => { + console.log('Command copied to clipboard:', command); + const truncatedXPath = xpath.length > 20 ? xpath.substring(0, 20) + '...' : xpath; + document.getElementById('copied-xpath').innerText = truncatedXPath; + copyMessage.style.display = 'block'; + setTimeout(() => { + copyMessage.style.display = 'none'; + }, 3000); + isCopyModeEnabled = false; + if (previousHighlight) { + previousHighlight.style.background = ''; + previousHighlight.style.backgroundImage = ''; + previousHighlight.style.border = ''; + copyButton.style.display = 'none'; + previousHighlight = null; + } + console.log('Copy mode disabled'); + }); + } + }); + + copyButton = createCopyButton(); + copyMessage = createCopyMessage(); +})(); diff --git a/scripts/popup.js b/scripts/popup.js index 7a57f68..034b2bb 100644 --- a/scripts/popup.js +++ b/scripts/popup.js @@ -1,20 +1,20 @@ -document.addEventListener('DOMContentLoaded', function () { - const toggleSwitch = document.getElementById('toggleCopyMode'); - const statusText = document.getElementById('statusText'); - - toggleSwitch.addEventListener('change', function () { - chrome.runtime.sendMessage({ action: 'toggleCopyMode' }, function (response) { - if (response.copyModeEnabled) { - statusText.textContent = 'Copy mode enabled'; - } else { - statusText.textContent = 'Copy mode disabled'; - } - }); - }); - - // Initialize switch state based on current mode - chrome.runtime.sendMessage({ action: 'getCopyModeStatus' }, function (response) { - toggleSwitch.checked = response.copyModeEnabled; - statusText.textContent = response.copyModeEnabled ? 'Copy mode enabled' : 'Copy mode disabled'; - }); -}); +document.addEventListener('DOMContentLoaded', function () { + const toggleSwitch = document.getElementById('toggleCopyMode'); + const statusText = document.getElementById('statusText'); + + toggleSwitch.addEventListener('change', function () { + chrome.runtime.sendMessage({ action: 'toggleCopyMode' }, function (response) { + if (response.copyModeEnabled) { + statusText.textContent = 'Copy mode enabled'; + } else { + statusText.textContent = 'Copy mode disabled'; + } + }); + }); + + // Initialize switch state based on current mode + chrome.runtime.sendMessage({ action: 'getCopyModeStatus' }, function (response) { + toggleSwitch.checked = response.copyModeEnabled; + statusText.textContent = response.copyModeEnabled ? 'Copy mode enabled' : 'Copy mode disabled'; + }); +});