Проблема с зацепкой к WebSocket
Возможно, кто то встречался с такой проблемой, что нужно зацепиться на некий WebSocket на сайте для перехвата и отправки сообщений. Я реализовал полностью рабочий код для скрипта содержимого (content script), и он работает, если его запускать через TamperMonkey. Но если я пытаюсь запихнуть его в свое расширение, то зацепа просто нет. Никаких ошибок, никаких логов, просто пустота. Я подозреваю, что дело может быть в политике безопасности расширений или что то подобное, не сильно разбираюсь в этом. Если кто нибудь знает, как работают расширения, не могли бы, пожалуйста, объяснить, как все же заставить работать его из своего расширения? В браузер загружаю в виде распакованного расширения, из папки. Файлы пока не прикладываю, если вдруг понадобятся какие то листинги, напишите, пожалуйста, в комментариях к вопросу, я максимально быстро их приложу.
Файл манифеста
{
"manifest_version": 3,
"name": "asd",
"description": "asd",
"version": "12",
"permissions": [
"proxy"
],
"icons": {
"16": "icon16.png",
"48": "icon48.png",
"128": "icon128.png"
},
"content_scripts": [
{
"matches": [
"https://lichess.org/*"
],
"js": [
"code.js"
],
"css": [
"style.css"
],
"run_at": "document_start"
}]
}
Функция для установки и подмены сокет-соединения и дальнейшей обработки.
function interceptWebSocket() {
let webSocket = window.WebSocket;
const webSocketProxy = new Proxy(webSocket, {
construct: function (target, args) {
let wrappedWebSocket = new target(...args);
webSocketWrapper = wrappedWebSocket;
wrappedWebSocket.addEventListener("message", function (event) {
let message = JSON.parse(event.data);
console.log(message)
if (message.d && typeof message.d.fen === "string" && typeof message.v === "number") {
currentFen = message.d.fen;
let isWhitesTurn = message.v % 2 == 0;
if (isWhitesTurn) {
currentFen += " w";
curF = "w"
} else {;
currentFen += " b";
curF = "b";
}
//calculateMove();
if(last != move)
{webSocketWrapper.send(JSON.stringify({
t: "move",
d: { u: move, b: 1, l: 100, a: 1 }
}));
myColor = get_color();
if(curF = myColor[0])
{
last = move;
}}
}
});
return wrappedWebSocket;
}
});
window.WebSocket = webSocketProxy;
}
Представленный выше код используется в самом скрипте. Следующий код выводит сообщение из сокета по приходу. Он также работает в TamperMonkey, но не работает через расширение.
function interceptWebSocket() {
let webSocket = window.WebSocket;
const webSocketProxy = new Proxy(webSocket, {
construct: function (target, args) {
let wrappedWebSocket = new target(...args);
webSocketWrapper = wrappedWebSocket;
wrappedWebSocket.addEventListener("message", function (event) {
let message = JSON.parse(event.data);
console.log(message)
});
return wrappedWebSocket;
}
});
window.WebSocket = webSocketProxy;
}
Скрипт, работающий в TamperMonkey, но не работающий через contentScript
// ==UserScript==
// @name Test
// @description 1
// @author 1
// @match *://lichess.org/*
// @run-at document-start
// @grant none
// ==/UserScript==
function interceptWebSocket() {
let webSocket = window.WebSocket;
const webSocketProxy = new Proxy(webSocket, {
construct: function (target, args) {
let wrappedWebSocket = new target(...args);
webSocketWrapper = wrappedWebSocket;
wrappedWebSocket.addEventListener("message", function (event) {
let message = JSON.parse(event.data);
console.log(message);
});
return wrappedWebSocket;
}
});
window.WebSocket = webSocketProxy;
}
interceptWebSocket();
Ответы (1 шт):
Благодаря ответу @AlexanderLonberg получилось разобраться в вопросе.
Как говорил Александр, contentScript имеют свои выделенные контейнеры для выполнения в области сайта, и не могут пересекаться со скриптами самого сайта. Для решения надо добавить "world": "MAIN" в раздел contentScripts манифеста расширения, разрешив скриптам выполняться в основной области сайта. Подробнее о контейнерах скриптов тут и тут. Про раздел манифеста тут