commit ae76837e41780f1542ec30fc01154e5834402b60 Author: woni <320753691@qq.com> Date: Tue Dec 17 18:49:48 2024 +0800 init diff --git a/Xbot PY Helper.zip b/Xbot PY Helper.zip new file mode 100644 index 0000000..66ba904 Binary files /dev/null and b/Xbot PY Helper.zip differ diff --git a/images/yingdao-16x16.png b/images/yingdao-16x16.png new file mode 100644 index 0000000..24e89d0 Binary files /dev/null and b/images/yingdao-16x16.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..126e983 --- /dev/null +++ b/index.html @@ -0,0 +1,63 @@ + + + + 影刀 PY 助手 + + + + +

Copy mode is off

+ + + diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..2bfca0b --- /dev/null +++ b/manifest.json @@ -0,0 +1,38 @@ +{ + "name": "Xbot PY Helper", + "description": "自动生成 网页自动化代码", + "version": "0.1.1", + "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" + ] + } + ], + "web_accessible_resources": [ + { + "resources": [ + "scripts/popup.js" + ], + "matches": [ + "" + ] + } + ] +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..062dad8 --- /dev/null +++ b/readme.md @@ -0,0 +1,12 @@ +# 影刀YD助手 +## 项目介绍 + + +## 功能介绍 +鼠标悬浮到元素上, 自动生成影刀代码 + +## 优化项目 + +1. 生成xpath的规则 +2. 支持跨域 +3. 支持开始和关闭拷贝模式 diff --git a/scripts/background.js b/scripts/background.js new file mode 100644 index 0000000..05d0674 --- /dev/null +++ b/scripts/background.js @@ -0,0 +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'); + } + }); +} diff --git a/scripts/content.js b/scripts/content.js new file mode 100644 index 0000000..e46d4a9 --- /dev/null +++ b/scripts/content.js @@ -0,0 +1,102 @@ +(function () { + // 清除之前的高亮样式 + let previousHighlight = null; + let copyButton = null; + let isCopyModeEnabled = false; + + // 创建复制按钮 + 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); + }); + } + }); + document.body.appendChild(button); + return button; + } + + // 获取元素的 XPath + function getElementXPath(element) { + let path = []; + while (element) { + let index = 1; + let sibling = element.previousElementSibling; + while (sibling) { + if (sibling.nodeName === element.nodeName) { + index++; + } + sibling = sibling.previousElementSibling; + } + path.unshift(`${element.nodeName.toLowerCase()}[${index}]`); + element = element.parentNode; + } + return path.length ? '/' + path.join('/') : null; + } + + // 监听鼠标移动事件 + document.addEventListener('mousemove', function (event) { + if (!isCopyModeEnabled) return; + + // 移除上一次高亮 + if (previousHighlight) { + previousHighlight.style.border = ''; + previousHighlight.style.borderRadius = ''; + previousHighlight.style.boxShadow = ''; + 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.border = '2px solid red'; + 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 }); + } + }); + + copyButton = createCopyButton(); +})(); diff --git a/scripts/popup.js b/scripts/popup.js new file mode 100644 index 0000000..7a57f68 --- /dev/null +++ b/scripts/popup.js @@ -0,0 +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'; + }); +});