From ae76837e41780f1542ec30fc01154e5834402b60 Mon Sep 17 00:00:00 2001 From: woni <320753691@qq.com> Date: Tue, 17 Dec 2024 18:49:48 +0800 Subject: [PATCH] init --- Xbot PY Helper.zip | Bin 0 -> 5292 bytes images/yingdao-16x16.png | Bin 0 -> 535 bytes index.html | 63 ++++++++++++++++++++++++ manifest.json | 38 +++++++++++++++ readme.md | 12 +++++ scripts/background.js | 32 ++++++++++++ scripts/content.js | 102 +++++++++++++++++++++++++++++++++++++++ scripts/popup.js | 20 ++++++++ 8 files changed, 267 insertions(+) create mode 100644 Xbot PY Helper.zip create mode 100644 images/yingdao-16x16.png create mode 100644 index.html create mode 100644 manifest.json create mode 100644 readme.md create mode 100644 scripts/background.js create mode 100644 scripts/content.js create mode 100644 scripts/popup.js diff --git a/Xbot PY Helper.zip b/Xbot PY Helper.zip new file mode 100644 index 0000000000000000000000000000000000000000..66ba904726ba1752652c304ccba973de37c422a7 GIT binary patch literal 5292 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 Mzv6-=n+|{VAKpGYv;Y7A literal 0 HcmV?d00001 diff --git a/images/yingdao-16x16.png b/images/yingdao-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..24e89d03325b3d79cbd43b4412af20661c9f400b GIT binary patch literal 535 zcmV+y0_gpTP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0jxU?D_M)5MM7 zjXUQRceBrIh=m6ZT+W=iGk3THC79W&nbplKF*Bbt$+gw8zksBfEXx{ZW*P$vI5D&7 zkz_NwDJP6W?wtXM0J1D=IOl2rwA*lY2G7q!MOavXy**f5giy5MoZBC~IkesBNCyW} zt0kqW^zste>q$uxVx7*Q3p2ASW>%LZ_50G!j?`>QkB?FuOPia4aU8T}Q`+5?vTSfk z-2rO=n8Di{R4U;t{cm3itW<)>Y!F$)d+&?sTwhB^N0Rqaw=1>Vf!%J<4iAGThxgt` zX6B + + + 影刀 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'; + }); +});