有一个页面(游戏),它通过WebSocket与服务器通信。我可以在Chrome开发者工具中看到数据(框架)。是否可以从chrom-extension访问/修改此通信?
答案 0 :(得分:4)
目前,访问或修改Websocket流量的唯一方法是使用content script到inject a script,用您自己的包装替换WebSocket
构造函数。此包装器的行为应与原始WebSocket实现类似,但您可以添加更多内容,例如将已发送/已接收的消息记录到您的扩展中。
为防止网站破坏,您必须确保WebSocket
包装器完全符合标准。必须实现的接口记录在http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#the-websocket-interface。
有关如何包装DOM构造函数的灵感,请参阅例如我的wrapper for Worker
。您可以自由地重复使用部分代码(例如EventTarget
接口的实现,这也是WebSocket
API的要求。)
更多重点:确保您的实施符合标准WebSocket API的界面,或者您可以破坏某些网站!
答案 1 :(得分:2)
从对this bug的讨论来看,目前没有用于拦截WebSocket流量的API,与chrome.webRequest
的正常请求不同。已经分配但尚未完成。
编辑:最近(截至2016年11月)该错误的活动表明正在修补补丁。
答案 2 :(得分:2)
有一个WebSocket-Wrapper,您可以使用它来访问WebSocket流量:
https://github.com/gorhill/chromium-websocket-wrapper/blob/master/chromium-websocket-wrapper.js
答案 3 :(得分:1)
似乎bug是固定的并且可用。在manifest.json文件中,您需要明确指定权限
{
...
"permissions": ["webRequest", "ws://*/*", "wss://*/*"]
...
}
,并且在网络过滤器中,应将其指定为websocket请求。
const networkFilters = {
urls: [
"wss://echo.websocket.org/*"
]
};
chrome.webRequest.onBeforeRequest.addListener((details) => {
const { tabId, requestId } = details;
// do stuff here
}, networkFilters);
答案 4 :(得分:0)
我遇到了这个问题,并在上面尝试了解决方案,不幸的是,我的目标站点中的脚本仍然发现WebSocket已被篡改和破坏,这很糟糕。
所以我想出了自己的解决方案:
var ws = window.WebSocket;
window.WebSocket = function(a,b){
var ret = new ws(a,b);
let handle = setInterval(function(){
if(ret.onmessage){
clearInterval(handle);
let o = ret.onmessage;
ret.onmessage = function(m){
//do what your want to m
o(m);
};
}
},50);
return ret;
}
如果您要检查的站点确实使用了WebSocket,我肯定会在创建WebSocket对象后的某个时间将其分配给onmessage
,只需定期对其进行检查并使用您自己的功能重新分配它即可。