如何解决如何使用代理捕获对象创建?
感谢您抽出宝贵时间阅读我的问题。我正在反向工程的网站javascript执行以下行:
this.socket = new WebSocket(o.host)
该行埋在其他功能的函数中,等等,因此我在运行时无法正常访问它。每当调用新的Websocket()时,我都想使用Proxy对象来“注入”代码,以便将其创建通知我,并将其保存到我事先准备的全局变量中。
我的油脂猴子脚本看起来像这样:
var caught_socket; // prepare variable
handler = {
apply: function(target,thisArg,argumentsList) {
console.log("WebSocket was created!");
caught_socket = target;
}
}
WebSocket = new Proxy(WebSocket,handler);
这显然是行不通的,对于任何有关代理实际工作方式的帮助或演示,我将不胜感激!
解决方法
使用Proxy.construct()代替,它将在调用new
时执行。
// Create a new WebSocket proxy
WebSocket = new Proxy(WebSocket,{
construct: (target,args) => {
console.log('New WebSocket Instance!')
return new target(...args)
}
})
// Test the WebSocket proxy by connecting to a remote server
const ws = new WebSocket('wss://echo.websocket.org')
// Listen for an open connection
// Send a message to the connection
ws.addEventListener('open',() => {
console.log('Connection Open!')
ws.send('hello')
})
// Listen for messages from the remote server
ws.addEventListener('message',msg => console.log('Response:',msg.data))
如果添加第二个代理,则两个代理都将执行:
// Create a new WebSocket proxy
WebSocket = new Proxy(WebSocket,args) => {
console.log('New WebSocket Instance!')
return new target(...args)
}
})
WebSocket = new Proxy(WebSocket,args) => {
console.log('New WebSocket Override!')
return new target(...args)
}
})
// Test the WebSocket proxy by connecting to a remote server
const ws = new WebSocket('wss://echo.websocket.org')
// Listen for an open connection
// Send a message to the connection
ws.addEventListener('open',msg.data))
您甚至可以返回完全不同的类:
class MyCoolWebSocket {
addEventListener(event,callback) {
console.log('override event:',event)
}
}
// Create a new WebSocket proxy
WebSocket = new Proxy(WebSocket,args) => {
console.log('New WebSocket Instance!')
return new WebSocket(...args)
}
})
// Create a new WebSocket proxy
WebSocket = new Proxy(WebSocket,args) => {
console.log('Greasemonkey override!')
return new MyCoolWebSocket(...args)
}
})
// Test the WebSocket proxy by connecting to a remote server
const ws = new WebSocket('wss://echo.websocket.org')
// Listen for an open connection
// Send a message to the connection
ws.addEventListener('open',msg.data))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。