cxxjackie 发表于 2022-1-18 19:27:30

研究了一下,油猴会在请求过程中给响应头添加一个临时属性:tm-finalurlgcal,可以据此来中断跳转和取得finalUrl:
const xhr = GM_xmlhttpRequest({
    url: url,
    method: 'get',
    onreadystatechange: res => {
      const reg = res.responseHeaders.match(/tm-finalurlgcal: (\S+)\s/);
      if (reg && reg.length === 2) {
            xhr.abort();
            const finalUrl = reg;
            console.log(finalUrl);
      }
    }
});
不太确定这个特性是否长期存在,也不清楚各版本的兼容性,感觉不是一个特别理想的方案,也不兼容脚本猫。

王一之 发表于 2022-1-18 20:31:15

cxxjackie 发表于 2022-1-18 19:27
研究了一下,油猴会在请求过程中给响应头添加一个临时属性:tm-finalurlgcal,可以据此来中断跳转和取得fin ...

回去看看这个特性,不过还是会访问到302的网站吧

哥哥好了解,这都知道

王一之 发表于 2022-1-18 21:44:16

cxxjackie 发表于 2022-1-18 19:27
研究了一下,油猴会在请求过程中给响应头添加一个临时属性:tm-finalurlgcal,可以据此来中断跳转和取得fin ...

Tampermonkey 4.13.6138
Tampermonkey BETA 4.14.6152
都没有成功 看background有 tm-finalurliikm 但是好像没有传递给脚本

// ==UserScript==
// @name         New Userscript
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @descriptiontry to take over the world!
// @author       You
// @match      https://bbs.tampermonkey.net.cn/
// @grant GM_xmlhttpRequest
// ==/UserScript==

(function () {
    'use strict';

    GM_xmlhttpRequest({
      url: 'https://github.com/scriptscat/scriptcat/raw/main/README.md',
      onload(resp) {
            console.log(resp);
      },
      onreadystatechange(res) {
            console.log(res);
            const reg = res.responseHeaders.match(/tm-finalurlgcal: (\S+)\s/);
            if (reg && reg.length === 2) {
                xhr.abort();
                const finalUrl = reg;
                console.log(finalUrl);
            }
      }
    });
    // Your code here...
})();

王一之 发表于 2022-1-18 21:50:00

cxxjackie 发表于 2022-1-18 19:27
研究了一下,油猴会在请求过程中给响应头添加一个临时属性:tm-finalurlgcal,可以据此来中断跳转和取得fin ...

不过如果只是取finalUrl的话,好像resp.finalUrl就可以的啊,不需要header

cxxjackie 发表于 2022-1-18 22:03:54

王一之 发表于 2022-1-18 21:44
Tampermonkey 4.13.6138
Tampermonkey BETA 4.14.6152
都没有成功 看background有 tm-finalurliikm 但是 ...

啊,我用的比较旧的版本,4.9的,果然新版本不兼容了么?这个取header主要是为了abort中断掉,我测试的时候在readyState为2的时候就取到了这个属性,这时候abort可以阻止大部分资源的下载。

cxxjackie 发表于 2022-1-18 22:07:13

王一之 发表于 2022-1-18 21:44
Tampermonkey 4.13.6138
Tampermonkey BETA 4.14.6152
都没有成功 看background有 tm-finalurliikm 但是 ...

试试console.log(res.responseHeaders)?直接输出res不行的吧,这个对象在展开的时候已经变了,临时属性被去掉了。

王一之 发表于 2022-1-18 22:12:40

cxxjackie 发表于 2022-1-18 22:07
试试console.log(res.responseHeaders)?直接输出res不行的吧,这个对象在展开的时候已经变了,临时属性 ...
不行,gcal 应该是随机字符串

// ==UserScript==
// @name         New Userscript
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @descriptiontry to take over the world!
// @author       You
// @match      https://bbs.tampermonkey.net.cn/
// @grant GM_xmlhttpRequest
// ==/UserScript==

(function () {
    'use strict';

    GM_xmlhttpRequest({
      url: 'https://github.com/scriptscat/scriptcat/raw/main/README.md',
      onload(resp) {
            console.log(resp);
      },
      onreadystatechange(res) {
            console.log(res.responseHeaders)
            const reg = res.responseHeaders.match(/tm-finalurl\S+: (\S+)\s/);
            if (reg && reg.length === 2) {
                xhr.abort();
                const finalUrl = reg;
                console.log(finalUrl);
            }
      }
    });
    // Your code here...
})();
console.log(res.responseHeaders,res.finalUrl) res.finalUrl 就可以获得这个链接了



王一之 发表于 2022-1-18 22:13:30

cxxjackie 发表于 2022-1-18 22:03
啊,我用的比较旧的版本,4.9的,果然新版本不兼容了么?这个取header主要是为了abort中断掉,我测试的时 ...
都已经取到response的header了,abort中断也没啥用(划掉)
也不是没啥用,看具体场景吧,这时候请求都发给服务端,处理返回了

cxxjackie 发表于 2022-1-18 22:29:37

王一之 发表于 2022-1-18 22:13
都已经取到response的header了,abort中断也没啥用(划掉)
也不是没啥用,看具体场景吧,这时候请求都发 ...

那应该是后面的版本移除掉了这个特性,finalUrl必须在readyState为4的时候才会变成重定向之后的,在之前abort的话,可以中断掉一些资源下载的情况(https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/readyState)。比如我之前写的那个edge插件下载的脚本,我想做多线程下载,但链接也有重定向,也不允许head,在获取文件长度这一块很麻烦,如果用这种方式实现,就可以在不下载的情况下取得文件长度。不过实现起来太麻烦了,兼容性又差,我就没往下做。

王一之 发表于 2022-1-19 09:13:00

cxxjackie 发表于 2022-1-18 22:29
那应该是后面的版本移除掉了这个特性,finalUrl必须在readyState为4的时候才会变成重定向之后的,在之前a ...

我这里 finalUrl 一直是重定向后的链接
页: 1 [2] 3 4
查看完整版本: 如何阻断302跳转,并提取出 finalUrl