gpt4 book ai didi

javascript - 区分 webRequest.onBeforeRequest 原始页面与注入(inject)页面

转载 作者:行者123 更新时间:2023-11-28 17:51:22 25 4
gpt4 key购买 nike

我在后台脚本中使用webRequest.onBeforeRequest。然后,在内容(?)脚本中,即注入(inject)到原始页面,我向该页面发出我正在检测的请求的同一 URL 发出 AJAX 请求,因此它很自然地开始循环很快就会挂起浏览器!

作为临时措施,我在 AJAX 调用 (&me=1) 中的 URL 末尾放置了另一个参数,并创建了一个 urls 过滤器,其结尾与原始 URL 结尾相同,但这并不这似乎不是最好的方法,因为原始 URL 将来可能会发生变化。

什么是更好的方法?例如,我查看了监听器返回的 requestDetails。但是,由于脚本是注入(inject)到原始页面中的,所以我找不到任何区别。或者,也许我可以创建一个 urls 过滤器,它只接受以“&me=1”结尾的 URL...?

(我不能(不会)使用标志变量,因为页面会一次又一次地动态更改,这似乎不是最好的方法,即使我可以让它以某种方式工作(我没有)。 )

当然,我也可以只使用原始请求提供的数据,但我不能find可以做到这一点的事件/对象,但也许我以某种方式错过了它,因为我几乎是制作网络扩展的初学者。

编辑:

list .json

{
"manifest_version": 2,
"name": "testtube",
"version": "1.0",
"permissions": [
"webRequest",
"https://*/*",
"activeTab"
],
"web_accessible_resources": [
"https://www.youtube.com/player_api",
"index.html",
"js/jquery-3.2.1.min.js",
"js/player.js",
"js/jquery-ui.min.js",
"css/jquery-ui.css", "css/style.css"
],
"content_scripts": [
{
"matches": [ "https://www.youtube.com/watch*"],
"css": [ "css/jquery.dataTables.min.css", "css/jquery-ui.css", "css/style.css" ],
"js": [ "js/jquery-3.2.1.min.js","js/jquery-ui.min.js", "js/main.js" ]
}
]
,"background": {
"scripts": ["js/background.js" ]
}

}

背景.js

"use strict";

var lastRequestId = 0;

function logURL(requestDetails) {

console.log("requestDetails: ", requestDetails);
//this is actually a solution as per my answer below
if ((lastRequestId != requestDetails.requestId) && (requestDetails.url.indexOf("&me=1") == -1))
{
browser.tabs.sendMessage(requestDetails.tabId, { ccurl: requestDetails.url }).then(response => {
console.log("Message from the content script:");
console.log(response.response);
}).catch(onError);;

}
}

browser.webRequest.onBeforeRequest.removeListener(logURL);
browser.webRequest.onBeforeRequest.addListener(
logURL,
{ urls: ["*://www.youtube.com/api/somepattern*"] }
);

function onError(error) {
console.error(`Error: ${error}`);
}

main.js

"use strict";
var jq;

jq = document.createElement('script');
jq.onload = function () { };
jq.src = chrome.extension.getURL("/js/jquery-3.2.1.min.js");
document.querySelector('head').appendChild(jq);

jq = document.createElement('script');
jq.onload = function () { };
jq.src = chrome.extension.getURL("/js/jquery-ui.min.js");
document.querySelector('head').appendChild(jq);

/*... some other scripts... */

var s = document.createElement('script');
s.src = chrome.extension.getURL('/js/player.js');
s.onload = function () {
this.remove();
};
(document.head || document.documentElement).appendChild(s);

var _url = "";


function UURL(request, sender, sendResponse) {

_url = request.url;

var loadR = " loadRequest('" + _url.toString() + "'); ";

var script = document.createElement('script');
script.textContent = loadR;

document.querySelector('head').appendChild(script);

return Promise.resolve({ response: "Hi from content script" });
}


$(function () {

console.log("jquery loaded");

browser.runtime.onMessage.removeListener(UURL)
browser.runtime.onMessage.addListener(UURL);

/* irrelevant code here... */

});

player.js

var loadRequest = function loadRequest(_url) {
_url = _url + "&me=1";

$.ajax({
type: "get",
url: _url,
dataType: "xml",
success: function (data) {
/* irrelevant code here */

最佳答案

如果您尝试区分主页加载和 XMLHttpRequest1

有多种方法可以区分不同类型的请求。如果没有您的实际代码来尝试,我们就必须猜测您实际上在做什么。

webRequest.onBeforeRequest正常的页面加载如下所示:

webRequest.onBeforeRequest ->  arg[0]= {"frameId":0,"method":"GET","parentFrameId":-1,"requestId":"260870","tabId":411,"timeStamp":1500401223979.044,"type":"main_frame","url":"http://www.example.com/"}
-----------------------------------------------------------------------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^

如您所见,details对象包含一个 type 属性,它是 webRequest.ResourceType 。对于主框架的 HTML 加载,它将包含 "main_frame" (details 对象还将包含 "frameId":0,"parentFrameId":- 1)。

对于 AJAX 请求,type 属性的值应为 xmlhttprequest。但是,“ajax 请求”可能不是 XMLHttpRequest 的意思。 。在这种情况下,type 属性可能具有其他值,但它不应该是“main_frame”

<小时/>

1.我阅读问题的原始版本与 okkko 的意图不同。正如目前所写的,这并不涵盖他们感兴趣的案例。但是,它可能对其阅读此问题/答案的其他人有一些值(value),所以我将其保留。

关于javascript - 区分 webRequest.onBeforeRequest 原始页面与注入(inject)页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45447216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com