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

ajax劫持库ajaxHooker

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

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

    发表于 2024-1-11 22:50:08 | 显示全部楼层
    gbly 发表于 2024-1-11 16:24
    大佬冒昧问一下,如果想在请求完成之前,直接返回请求结果应该怎么写。起因是我有个xhr请求但是速度太慢了 ...

    可以做到但这个库没实现,对响应的修改是基于原响应基础上的,覆盖响应值的话请求都不需要发生,这个可以自己写代码实现,给你写个可能不是很通用的例子(不需要引入这个库):
    1. const xhrOpen = XMLHttpRequest.prototype.open;
    2. XMLHttpRequest.prototype.open = function(method, url, ...args) {
    3.     if (url.includes('www.example.com/test')) {
    4.         let onload = null;
    5.         Object.defineProperty(this, 'onload', {
    6.             configurable: true,
    7.             enumerable: true,
    8.             get: () => onload,
    9.             set: value => (onload = value)
    10.         });
    11.         this.send = () => {
    12.             Object.defineProperty(this, 'responseText', {
    13.                 configurable: true,
    14.                 enumerable: true,
    15.                 get: () => '我是响应值',
    16.             });
    17.             const loadEvent = new ProgressEvent('load');
    18.             this.dispatchEvent(loadEvent);
    19.             onload.call(this, loadEvent);
    20.         };
    21.     }
    22.     return xhrOpen.call(this, method, url, ...args);
    23. };
    复制代码
    回复
    订阅

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

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

    发表于 2024-1-11 22:53:59 | 显示全部楼层
    JML 发表于 2024-1-11 19:29
    只是测试而已,没多大作用。后来发现修改响应数据即使成功,但是网页只是偶尔变成修改后的状态,可能有其 ...

    没输出可能只是因为console.log被劫持了,有些网页会这么干,至于不生效我没复现也没办法分析了。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    回帖

    5

    积分

    助理工程师

    积分
    5
    发表于 2024-1-12 15:55:46 | 显示全部楼层
    本帖最后由 gbly 于 2024-1-12 17:16 编辑
    cxxjackie 发表于 2024-1-11 22:50
    可以做到但这个库没实现,对响应的修改是基于原响应基础上的,覆盖响应值的话请求都不需要发生,这个可以 ...

    大佬onload.call(this, loadEvent);这里好像有bug,执行call的时候onload还是null导致报错,我是不是得找到获取onload这个函数变量的办法。您方便的话能加我联系方式帮我看看能不能解决吗,有偿qq 2123546812
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

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

    发表于 2024-1-12 22:01:14 | 显示全部楼层
    gbly 发表于 2024-1-12 15:55
    大佬onload.call(this, loadEvent);这里好像有bug,执行call的时候onload还是null导致报错,我是不是得找 ...
    1. let onload = null;
    复制代码

    这句改成这样试试:
    1. let onload = this.onload;
    复制代码

    不行的话说明监听的事件不是onload,可能是onreadystatechange,也可能addEventListener绑上去的。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    回帖

    5

    积分

    助理工程师

    积分
    5
    发表于 2024-1-13 10:27:09 | 显示全部楼层
    本帖最后由 gbly 于 2024-1-13 10:52 编辑
    cxxjackie 发表于 2024-1-12 22:01
    这句改成这样试试:

    不行的话说明监听的事件不是onload,可能是onreadystatechange,也可能addEventLis ...

    感谢大佬,能用了,最后确认是onloadend,不过这段代码好像和ajaxHooker有冲突,只要@require js了就不起效果了
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

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

    发表于 2024-1-13 22:13:36 | 显示全部楼层
    gbly 发表于 2024-1-13 10:27
    感谢大佬,能用了,最后确认是onloadend,不过这段代码好像和ajaxHooker有冲突,只要@require js了就不起 ...

    确实有冲突,库也做了事件的劫持,跟这个原理差不多,所以会跟这段代码相互覆盖。如果确实有使用库的需求,可以尝试1.1.1版本,少了异步特性和filter方法。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-3-12 16:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    1

    回帖

    5

    积分

    助理工程师

    积分
    5
    发表于 2024-3-12 17:24:08 | 显示全部楼层
    请问ajaxHooker跨域拦截axios请求优先级问题如何处理?

    https://bbs.tampermonkey.net.cn/thread-6252-1-1.html
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-24 10:55
  • 签到天数: 61 天

    [LV.6]常住居民II

    14

    主题

    30

    回帖

    111

    积分

    中级工程师

    积分
    111
    发表于 2024-4-4 09:59:53 | 显示全部楼层
    index.js:310 Uncaught DOMException: Failed to execute 'open' on 'XMLHttpRequest': Synchronous requests from a document must not set a response type.
        at Proxy.open (chrome-extension://ndcooeababalnlpkfedmmbbbgkljhpjf/ajaxhook%20test.user.js:749:35)
        at t.next (https://gogitil.woa.com/wego/wet ... 87b694.js:16:168044)
        at onRequest (https://gogitil.woa.com/wego/wet ... 87b694.js:16:189583)
        at r (https://gogitil.woa.com/wego/wet ... 87b694.js:16:169296)
        at https://gogitil.woa.com/wego/wet ... 87b694.js:16:177754
        at https://gogitil.woa.com/wego/wet ... b87b694.js:72:37777
    throw @ index.js:310
    (匿名) @ index.js:522
    (匿名) @ index.js:45
    setTimeout(异步)
    (匿名) @ index.js:188
    (匿名) @ index.esm.js:805
    send @ xhr-proxy.js:204
    (匿名) @ xhr-hook.js:109
    (匿名) @ xhr.js:178
    e.exports @ xhr.js:12
    e.exports @ dispatchRequest.js:59
    Promise.then(异步)
    s.request @ Axios.js:51
    (匿名) @ bind.js:9
    c @ request.js:25
    (匿名) @ request.js:24
    C @ request.js:22
    q @ request.js:134
    t.a @ request.js:162
    API_action @ marker_page.store.js:115
    (匿名) @ vuex.esm.js:792
    m.dispatch @ vuex.esm.js:457
    dispatch @ vuex.esm.js:347
    GET_userinfo @ marker_page.store.js:130
    (匿名) @ vuex.esm.js:792
    m.dispatch @ vuex.esm.js:457
    dispatch @ vuex.esm.js:347
    (匿名) @ marker_page.js:15
    p @ vue-router.esm.js:2158
    i @ vue-router.esm.js:1884
    Ne @ vue-router.esm.js:1892
    Ge.confirmTransition @ vue-router.esm.js:2185
    Ge.transitionTo @ vue-router.esm.js:2072
    dt.init @ vue-router.esm.js:2775
    beforeCreate @ vue-router.esm.js:1235
    nt @ vue.runtime.esm.js:1854
    Bn @ vue.runtime.esm.js:4219
    e._init @ vue.runtime.esm.js:5004
    Si @ vue.runtime.esm.js:5085
    c760 @ marker_page.js:123
    s @ bootstrap:107
    7 @ v-copy.js:6
    s @ bootstrap:107
    a @ bootstrap:71
    (匿名) @ marker_page.f9add598.js:1
    (匿名) @ marker_page.f9add598.js:1
    显示另外 29 个框架
    收起
    ajaxhook test.user.js:913 TypeError: Cannot set property readyState of #<XMLHttpRequest> which has only a getter
        at Object.set (ajaxhook test.user.js:910:42)
        at E.t.XMLHttpRequest.readyState (xhr-hook.js:97:15)
        at t.resolve (xhr-proxy.js:64:14)
        at t.next (xhr-proxy.js:102:8)
        at onResponse (index.esm.js:1909:26)
        at o (xhr-proxy.js:129:5)
        at c (xhr-proxy.js:155:7)
        at E.t.XMLHttpRequest.onreadystatechange (xhr-proxy.js:169:14)
        at i.<computed> (xhr-hook.js:87:48)
        at XhrEvents.trigger (ajaxhook test.user.js:679:70)
    不知道网站更新了什么,就突然报错了,我把自己的代码全部注释掉,也是一样报错
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

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

    发表于 2024-4-4 23:17:49 | 显示全部楼层
    player 发表于 2024-4-4 09:59
    index.js:310 Uncaught DOMException: Failed to execute 'open' on 'XMLHttpRequest': Synchronous reques ...

    我知道这个问题,xhr在open时漏传了一个可选参数,导致有些请求变成同步的了,这个bug因为比较小所以我一直没更新,想着攒一攒再一起更的,结果给忘了。。。
    1.3.4已修复,你试试看还有问题的话,发个链接我测试看看。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5198

    回帖

    6079

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6079

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

    发表于 2024-4-19 10:14:29 | 显示全部楼层
    https://bbs.tampermonkey.net.cn/thread-6852-1-1.html
    c大,这个我研究了一下
    是原网页劫持了open的函数,重新改了xhr的apply引用
    导致没法正常触发劫持了...
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

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