gpt4 book ai didi

javascript - 如何使用 Greasemonkey 从远程域获取 cookie?

转载 作者:行者123 更新时间:2023-11-28 07:50:04 24 4
gpt4 key购买 nike

我正在编写一个 Greasemonkey (v2.3) 脚本,该脚本基本上会抓取lema.rae.es/drae/srv/search 提供的内容。 ,因为缺乏任何类型的 API。

问题是,我想从 Google Translate(另一个域)查询该 URL。为此,我可以毫无问题地使用 GM_xmlhttpRequest,但是对特定 URL(例如 lema.rae.es/drae/srv/search?val=test )的 GET 请求会生成一个带有隐藏表单的 HTML 页面,该表单在调用 challenge() javascript 后会被 POSTed函数——计算在 POST 请求中传递的某种 token 。

显然,这是异步发生的,而 Greasemonkey 却看不到它。通过反复试验,我逐渐意识到,如果我的浏览器(Iceweasel 31.2.0)有一个 lema.drae.es 的 cookie,那么使用 GM_xmlhttpRequest 发出的 GET 请求实际上会返回我想要的内容,即是作为 URL 中的参数“val”传递的单词定义的 HTML。但是,如果我删除 lema.drae.es 的所有 cookie,GET 请求将返回上述隐藏表单。

简而言之,我需要一种方法来从 Greasemonkey 中接收该 POST 请求的响应,并且我相信,如果可以从服务器接收 cookie 并将其存储起来,那么我可以将其作为请求 header 包含在进一步的请求,它应该按我的预期工作。或者它应该简单地存储在浏览器中,因此当我触发 GM_xmlhttpRequest 时,它会作为 header 发送。

我尝试了不同的解决方案来解决我的问题,即 using a hidden iframe ,但即使在将用户脚本配置为在两个域上运行之后,浏览器也会以同源策略为由阻止创建此类 iframe。

希望我已经明确了我想要实现的目标,并且希望有人能为我指明正确的方向。

旁注:如果有人可以解释 challenge() 函数的计算内容,我将非常感激。我的假设是它生成的 token 被发送到服务器,服务器又使用它来生成 cookie,但这听起来过于复杂......

最佳答案

隐藏的 iframe 路由是可行的方法,但在这种情况下它被 translate.google.com 阻止。

以下是另一种方法,可确保 Firefox 拥有保持您的混搭网站 ( lema.rae.es ) 满意所需的最新 cookie:

  1. 查找一些源 HTML,当混搭站点需要新鲜的 Cookie 时,这些源 HTML 会出现,但在其他情况下则不存在。
    在这种情况下,JS 源函数挑战就可以了。

  2. 向混搭站点发出 GM_xmlhttpRequest 并测试响应。

  3. 如果 GM_xmlhttpRequest 响应具有所需的数据,则根据需要对其进行解析。
    完成!

  4. 如果 GM_xmlhttpRequest 响应具有“需要 cookies”源,请在弹出窗口中打开混搭站点的特殊查询:

    1. 由于该网站在自己的窗口中打开,因此不会被跨源保护措施阻止。
    2. 将 GM 脚本设置为也对该特殊 URL 进行操作。
    3. 对于特殊 URL,请等待关键节点或文本出现,表明页面已完成加载并设置 Cookie。
    4. 弹出窗口完成后,它会向打开的页面发送一条消息,然后自行关闭。
    5. 当打开页面收到消息时,它会重新 GM_xmlhttp 请求混搭页面。
    6. 解析并完成!


这是经过测试的完整(在 Firefox 上)Greasemonkey 脚本,它将lema.rae.es/drae/srv/search 混入translate.google.com嗯>。 :

// ==UserScript==
// @name _GM_xmlhttpRequest that needs cookie(s)
// @include https://translate.google.com/*
// @include http://lema.rae.es/drae/srv/search?val=openedByGM
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_xmlhttpRequest
// ==/UserScript==

//--- Global variables
var mashupURL = "http://lema.rae.es/drae/srv/search?val=test";
var cookGenURL = "http://lema.rae.es/drae/srv/search?val=openedByGM";

if (location.href == cookGenURL) {
//--- May be best we can do until Greasemonkey fixes tab handling flaws.
document.title = "Close me!";

if (window.opener) {
waitForKeyElements ("i:contains(openedByGM)", closePopupIfCan);
}
}
else {
attemptMashup ();

window.addEventListener ("message", receiveCookieMessage, false);
}

//-- Just functions from here on down...

function closePopupIfCan (jNode) {
window.opener.postMessage ("Cookie(s) should be set!", "*");
window.close ();
}

function attemptMashup () {
GM_xmlhttpRequest ( {
method: "GET",
url: mashupURL,
onload: parseDictionaryResponse,
onabort: reportAJAX_Error,
onerror: reportAJAX_Error,
ontimeout: reportAJAX_Error
} );
}

function receiveCookieMessage (event) {
if (event.origin != "http://lema.rae.es") return;

console.log ("message ==> ", event.data);

/*--- Now that have cookie(s), re-attempt mashup, but need a little
settling time.
*/
setTimeout (attemptMashup, 888);
}

function parseDictionaryResponse (respObject) {
if (respObject.status != 200 && respObject.status != 304) {
reportAJAX_Error (respObject);
return;
}
/*--- If the required cookie is not present/valid, open the target page
in a temporary tab to set the cookies, then reload this page.

The test string is unique to the scraped site and is only present
when cookie(s) is/are needed.
*/
if (/function\s+challenge/i.test (respObject.responseText) ) {
var newTab = window.open (cookGenURL);
return;
}

//--- Don't use jQuery to parse this!
var parser = new DOMParser ();
var responseDoc = parser.parseFromString (
respObject.responseText, "text/html" // Firefox only, for now.
);

//--- Get site-specific payload and put in site-specific location.
var payload = responseDoc.querySelectorAll ("body > div");
$("#gt-form-c").before (payload);
}

function reportAJAX_Error (respObject) {
alert (
'Error ' + respObject.status + '! "' + respObject.statusText + '"'
);
}

关于javascript - 如何使用 Greasemonkey 从远程域获取 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26952643/

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