上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: 脚本体验师001 - 

如何阻断302跳转,并提取出 finalUrl

[复制链接]
  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-1-18 19:27:30 | 显示全部楼层
    研究了一下,油猴会在请求过程中给响应头添加一个临时属性:tm-finalurlgcal,可以据此来中断跳转和取得finalUrl:
    1. const xhr = GM_xmlhttpRequest({
    2.     url: url,
    3.     method: 'get',
    4.     onreadystatechange: res => {
    5.         const reg = res.responseHeaders.match(/tm-finalurlgcal: (\S+)\s/);
    6.         if (reg && reg.length === 2) {
    7.             xhr.abort();
    8.             const finalUrl = reg[1];
    9.             console.log(finalUrl);
    10.         }
    11.     }
    12. });
    复制代码

    不太确定这个特性是否长期存在,也不清楚各版本的兼容性,感觉不是一个特别理想的方案,也不兼容脚本猫。
    回复
    订阅

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:37
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

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

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

    哥哥好了解,这都知道
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:37
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 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 但是好像没有传递给脚本

    1. // ==UserScript==
    2. // @name         New Userscript
    3. // @namespace    https://bbs.tampermonkey.net.cn/
    4. // @version      0.1.0
    5. // @description  try to take over the world!
    6. // @author       You
    7. // @match        https://bbs.tampermonkey.net.cn/
    8. // @grant GM_xmlhttpRequest
    9. // ==/UserScript==

    10. (function () {
    11.     'use strict';

    12.     GM_xmlhttpRequest({
    13.         url: 'https://github.com/scriptscat/scriptcat/raw/main/README.md',
    14.         onload(resp) {
    15.             console.log(resp);
    16.         },
    17.         onreadystatechange(res) {
    18.             console.log(res);
    19.             const reg = res.responseHeaders.match(/tm-finalurlgcal: (\S+)\s/);
    20.             if (reg && reg.length === 2) {
    21.                 xhr.abort();
    22.                 const finalUrl = reg[1];
    23.                 console.log(finalUrl);
    24.             }
    25.         }
    26.     });
    27.     // Your code here...
    28. })();
    复制代码


    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:37
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

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

    不过如果只是取finalUrl的话,好像resp.finalUrl就可以的啊,不需要header
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 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可以阻止大部分资源的下载。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 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不行的吧,这个对象在展开的时候已经变了,临时属性被去掉了。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:37
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-1-18 22:12:40 | 显示全部楼层
    cxxjackie 发表于 2022-1-18 22:07
    试试console.log(res.responseHeaders)?直接输出res不行的吧,这个对象在展开的时候已经变了,临时属性 ...

    不行,gcal 应该是随机字符串

    1. // ==UserScript==
    2. // @name         New Userscript
    3. // @namespace    https://bbs.tampermonkey.net.cn/
    4. // @version      0.1.0
    5. // @description  try to take over the world!
    6. // @author       You
    7. // @match        https://bbs.tampermonkey.net.cn/
    8. // @grant GM_xmlhttpRequest
    9. // ==/UserScript==

    10. (function () {
    11.     'use strict';

    12.     GM_xmlhttpRequest({
    13.         url: 'https://github.com/scriptscat/scriptcat/raw/main/README.md',
    14.         onload(resp) {
    15.             console.log(resp);
    16.         },
    17.         onreadystatechange(res) {
    18.             console.log(res.responseHeaders)
    19.             const reg = res.responseHeaders.match(/tm-finalurl\S+: (\S+)\s/);
    20.             if (reg && reg.length === 2) {
    21.                 xhr.abort();
    22.                 const finalUrl = reg[1];
    23.                 console.log(finalUrl);
    24.             }
    25.         }
    26.     });
    27.     // Your code here...
    28. })();
    复制代码
    QQ截图20220118221231.jpg
    console.log(res.responseHeaders,res.finalUrl) res.finalUrl 就可以获得这个链接了



    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:37
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-1-18 22:13:30 | 显示全部楼层
    cxxjackie 发表于 2022-1-18 22:03
    啊,我用的比较旧的版本,4.9的,果然新版本不兼容了么?这个取header主要是为了abort中断掉,我测试的时 ...

    都已经取到response的header了,abort中断也没啥用(划掉)
    也不是没啥用,看具体场景吧,这时候请求都发给服务端,处理返回了
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

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

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:37
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

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

    我这里 finalUrl 一直是重定向后的链接
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表