PUGE 2 月之前
父節點
當前提交
2d42e16c6b
共有 3 個文件被更改,包括 161 次插入33 次删除
  1. 58 0
      background.js
  2. 101 31
      content-script.js
  3. 2 2
      insert-auto.js

+ 58 - 0
background.js

@@ -75,6 +75,48 @@ function reGetData (url, callBack) {
   })
 }
 
+function handleFetchRequest(url, options) {
+  return new Promise((resolve, reject) => {
+    fetch(url, options)
+      .then(async response => {
+        try {
+          const contentType = response.headers.get('content-type');
+          let data;
+          
+          if (contentType && contentType.includes('application/json')) {
+            data = await response.json();
+          } else {
+            data = await response.text();
+          }
+          
+          resolve({
+            ok: response.ok,
+            status: response.status,
+            statusText: response.statusText,
+            headers: Object.fromEntries(response.headers.entries()),
+            data: data,
+            url: response.url
+          });
+        } catch (error) {
+          reject({
+            error: '解析响应失败',
+            details: error.message,
+            status: response.status
+          });
+        }
+      })
+      .catch(error => {
+        reject({
+          error: '请求失败',
+          details: error.message,
+          type: error.name
+        });
+      });
+  });
+}
+
+
+
 // 监听消息
 chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
   // console.log(message)
@@ -91,6 +133,22 @@ chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
         })
       }
       break;
+    case 'fetch':  // 新增的 fetch 处理方法
+      const { url, options = {} } = message;
+      handleFetchRequest(url, options)
+        .then(result => {
+          sendResponse({
+            success: true,
+            ...result
+          });
+        })
+        .catch(error => {
+          sendResponse({
+            success: false,
+            error: error
+          });
+        });
+      break;
     case 'clear':
       tempData = null
     //   fetch(`https://assist.lamp.run/blockList`).then(data => data.json()).then(dataTemp => {

+ 101 - 31
content-script.js

@@ -2,7 +2,7 @@ function assistLoad(itemId) {
     // 页面为加载完毕就不断等待
     if (!document.body) {
         setTimeout(() => {
-            assistLoad()
+            assistLoad(itemId)
         }, 500);
         return
     }
@@ -44,7 +44,7 @@ function assistLoad(itemId) {
         }, '*');
     };
     function sendCallBack(callBackID, value) {
-        if (!event.data.callBackID) return
+        if (!callBackID) return
         iframe.contentWindow.postMessage({
             type: "callBack",
             value,
@@ -68,38 +68,103 @@ function assistLoad(itemId) {
     // 接收子页面发来的消息
     window.addEventListener('message', (event) => {
         // console.log('来自子页面的消息:', event.data);
+        let domTemp = null
+        if (event.data.target) {
+            if (typeof event.data.target === "string") {
+                domTemp = document.querySelector(event.data.target);
+            } else {
+                domTemp = document.querySelectorAll(event.data.target[0])[event.data.target[1]];
+            }
+        }
         switch (event.data.type) {
             // assistMsg('click','#shi')
             case "click":
-                if (typeof event.data.target === "string") {
-                    if (document.querySelector(event.data.target)) {
-                        document.querySelector(event.data.target).click()
-                        sendCallBack(event.data.callBackID, {"err": 0})
-                    } else {
-                        sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"})
-                    }
-                    
+                if (domTemp) {
+                    document.querySelector(event.data.target).click()
+                    sendCallBack(event.data.callBackID, {"err": 0})
                 } else {
-                    if (document.querySelectorAll(event.data.target[0])[event.data.target[1]]) {
-                        document.querySelectorAll(event.data.target[0])[event.data.target[1]].click()
-                        sendCallBack(event.data.callBackID, {"err": 0})
-                    } else {
-                        sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"})
-                    }
+                    sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"})
                 }
-                
                 break;
             case "setValue":
-                const domTemp = document.querySelector(event.data.target)
                 if (domTemp) {
-                    domTemp.value = event.data.value
-                    // 触发 `input` 事件,让 Vue/React 或监听的代码能检测到变化
-                    domTemp.dispatchEvent(new Event("input", { bubbles: true }));
-                    sendCallBack(event.data.callBackID, {"err": 0})
+                    try {
+                        const element = domTemp;
+                        const newValue = event.data.value;
+                        
+                        // 统一处理值设置
+                        if (element.type === 'checkbox' || element.type === 'radio') {
+                            element.checked = Boolean(newValue);
+                        } else if (element.tagName === 'SELECT' && element.multiple) {
+                            // 多选select
+                            const values = Array.isArray(newValue) ? newValue : [newValue];
+                            Array.from(element.options).forEach(option => {
+                                option.selected = values.includes(option.value);
+                            });
+                        } else if (element.isContentEditable) {
+                            // 可编辑元素
+                            element.innerHTML = newValue;
+                        } else {
+                            // 普通input/textarea/select
+                            element.value = newValue;
+                        }
+                        
+                        // 触发所有可能的事件
+                        const events = [
+                            'input',           // Vue/React/Svelte
+                            'change',          // 传统框架
+                            'blur',            // 表单验证
+                            'keyup',           // 键盘事件
+                            'keydown',
+                            'keypress'
+                        ];
+                        
+                        events.forEach(eventType => {
+                            element.dispatchEvent(new Event(eventType, {
+                                bubbles: true,
+                                cancelable: true
+                            }));
+                        });
+                        
+                        // 额外处理特殊事件
+                        if (element.type === 'checkbox' || element.type === 'radio') {
+                            element.dispatchEvent(new Event('click', { bubbles: true }));
+                        }
+                        
+                        // 等待下一个事件循环,确保事件处理完成
+                        setTimeout(() => {
+                            // 再次触发change事件,确保异步处理完成
+                            element.dispatchEvent(new Event('change', { bubbles: true }));
+                        }, 0);
+                        
+                        sendCallBack(event.data.callBackID, {"err": 0, "msg": "设置成功"});
+                        
+                    } catch (error) {
+                        sendCallBack(event.data.callBackID, {"err": 2, "msg": `设置失败: ${error.message}`});
+                    }
+                } else {
+                    sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"});
+                }
+                break;
+            case "getInnerText":
+                if (domTemp) {
+                    sendCallBack(event.data.callBackID, {"err": 0, "value": domTemp.innerText})
+                } else {
+                    sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"})
+                }
+                break;
+            case "getInnerHTML":
+                if (domTemp) {
+                    sendCallBack(event.data.callBackID, {"err": 0, "value": domTemp.innerHTML})
                 } else {
                     sendCallBack(event.data.callBackID, {"err": 1, "msg": "元素不存在!"})
                 }
-                
+                break;
+            case "turnURL":
+                location.href = event.data.value;
+                break;
+            case "getURL":
+                sendCallBack(event.data.callBackID, {"err": 0, "value": location.href})
                 break;
             // assistMsg('fetch', {
             //   url: "https://obfuscator.lamp.run",
@@ -130,15 +195,20 @@ function assistLoad(itemId) {
                 sendCallBack(event.data.callBackID, returnList)
                 break;
             case "fetch":
-                fetch(event.data.value.url, event.data.value.options)
-                .then((response) => response.text())
-                .then((result) => {
-                    console.log(result)
-                    if (event.data.callBackID) {
-                    sendCallBack(event.data.callBackID, result)
+                chrome.runtime.sendMessage(
+                {
+                    name: 'fetch',
+                    url: event.data.url,
+                    options: event.data.options
+                },
+                function(response) {
+                    console.log(response)
+                    if (response.success) {
+                        sendCallBack(event.data.callBackID, {"err": 0, "value": response.data, "headers": response.headers, "status": response.status})
+                    } else {
+                        sendCallBack(event.data.callBackID, {"err": 1, "msg": response.error})
                     }
-                })
-                .catch((error) => console.error(error));
+                });
                 break;
             case "closeWindow":
                 window.close();

+ 2 - 2
insert-auto.js

@@ -5,7 +5,7 @@ if (localStorage.getItem('owoLoadData')) {
   const element = JSON.parse(localStorage.getItem('owoLoadData'))
   let urlStr = window.location.href
   if (new RegExp(element.url).test(urlStr)) {
-    assistLoad()
+    assistLoad(element.id)
   }
 } else {
   // 尝试网络加载
@@ -15,7 +15,7 @@ if (localStorage.getItem('owoLoadData')) {
     let urlStr = window.location.href
     dataTemp.forEach(element => {
       if (new RegExp(element.url).test(urlStr)) {
-        assistLoad()
+        assistLoad(element.id)
         return
       }
     })