Edge/Chrome扩展无法覆盖DuelingBook的findCard函数问题求助
问题与解决方案
问题背景
DuelingBook(duelingbook.com)是一款游戏王沙盒游戏,部分隐藏功能在UI层面被锁定,持有指定卡牌时才能解锁。我制作了一款Edge扩展(兼容Chrome扩展机制),但多次迭代后仍无法覆盖原页面的findCard函数,无法解锁多数操作功能(仅保留了限制查看墓地的"Question"功能)。需求是制作一个能模拟在控制台执行指定脚本的扩展——该脚本在控制台中执行完全正常。
现有代码问题
当前扩展使用标准内容脚本,但内容脚本运行在隔离的执行环境中,无法直接访问页面的全局变量(如player1、player2),也无法覆盖页面本身的全局函数findCard,这就是脚本在控制台能正常运行但扩展中无效的核心原因。
修改后的扩展代码
manifest.json
调整为点击扩展图标时触发脚本注入,而非自动注入:
{ "name": "DuelingCardUnlock", "action": {}, "manifest_version": 3, "version": "0.1", "description": "Unlock DuelingBook functions by overriding findCard", "permissions": ["activeTab"], "background": { "service_worker": "background.js" } }
background.js
用于监听扩展图标点击事件,将脚本注入到页面上下文:
chrome.action.onClicked.addListener((tab) => { chrome.scripting.executeScript({ target: { tabId: tab.id }, func: injectFindCardOverride }); }); function injectFindCardOverride() { // 覆盖页面全局的findCard函数 window.findCard = function(arr, hand, grave, like) { var cards = [player1.m1, player1.m2, player1.m3, player1.m4, player1.m5, player1.s1, player1.s2, player1.s3, player1.s4, player1.s5, player1.pendulumLeft, player1.pendulumRight, player1.fieldSpell, player2.m1, player2.m2, player2.m3, player2.m4, player2.m5, player2.s1, player2.s2, player2.s3, player2.s4, player2.s5, player2.pendulumLeft, player2.pendulumRight, player2.fieldSpell, linkLeft, linkRight, player1.skillCard, player2.skillCard]; if (hand) { for (var k = 0; k < player1.hand_arr.length; k++) { cards.push(player1.hand_arr[k]); } } if (grave) { for (k = 0; k < player1.grave_arr.length; k++) { cards.push(player1.grave_arr[k]); } } for (var i = 0; i < arr.length; i++) { if (arr[i] == "Question") { for (var j = 0; j < cards.length; j++) { if (cards[j]) { if (cards[j].data("face_down")) { continue; } if (((cards[j].data("cardfront").data("treated_as") == arr[i] || like && cards[j].data("cardfront").data("treated_as") && cards[j].data("cardfront").data("treated_as").indexOf(arr[i]) >= 0)) == false) { return false; } } } } } return true; }; }
工作原理
- 点击扩展图标时,后台脚本通过
chrome.scripting.executeScript将函数注入到当前页面的执行上下文,而非隔离的内容脚本环境。 - 注入的函数直接覆盖页面全局的
window.findCard,完全模拟了在控制台执行脚本的效果,从而实现功能解锁。
内容的提问来源于stack exchange,提问作者Eyal282
相关产品推荐
相关产品推荐

