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

ajax劫持库ajaxHooker

  [复制链接]

该用户从未签到

1

主题

7

回帖

9

积分

助理工程师

积分
9
发表于 2025-8-18 07:53:32 | 显示全部楼层
cxxjackie 发表于 2025-8-14 22:35
按理来说429不会使fetch发生reject,response应该能触发才对,你的response回调函数是否正确?请按照示例 ...

代码:
// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      2025-08-17
// @description  try to take over the world!
// @author       You
// @match        https://leetcode.cn/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=leetcode.cn
// @grant        none
// @require https://scriptcat.org/lib/637/1.4.7/ajaxHooker.js
// ==/UserScript==

(function() {
    'use strict';

    // Your code here...
    ajaxHooker.hook(req => {
    if (req.url.includes('interpret_solution')) {
        console.log('req', req);
        req.response = res => {
            console.log('res', res);
        };
    }
});
})();

触发点是这个运行功能:


达到速率限制之后就报错了


点报错的行号,定位到网站的这一行。感觉像是网站没处理好所以异常了?我不太懂前端
回复
订阅

使用道具 举报

该用户从未签到

1

主题

7

回帖

9

积分

助理工程师

积分
9
发表于 2025-8-18 08:02:41 | 显示全部楼层
Varc 发表于 2025-8-18 07:53
代码:
// ==UserScript==
// @name         New Userscript

我使用的是Chrome浏览器+Tampermonkey最新版本,已经关掉了其他user script,也尝试了改成document-start阶段加ajaxHooker.protect();也不生效
回复

使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    901

    回帖

    1398

    积分

    荣誉开发者

    积分
    1398

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

    发表于 2025-8-18 22:51:24 | 显示全部楼层
    Varc 发表于 2025-8-18 07:53
    代码:
    // ==UserScript==
    // @name         New Userscript

    我知道了,fetch的response回调只会在响应值被读取时才触发(因为fetch的响应是异步的,不像xhr那样随时读取),这带来的问题是如果没有任何响应值被读取,response将永远不触发。这里的429报错是网站代码主动抛出的,当检查到请求失败时不会去尝试读取响应,而是抛出一个错误。1.4.8已处理此问题,现在response回调应该能正常触发了。
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    回帖

    9

    积分

    助理工程师

    积分
    9
    发表于 2025-8-18 23:52:20 | 显示全部楼层
    cxxjackie 发表于 2025-8-18 22:51
    我知道了,fetch的response回调只会在响应值被读取时才触发(因为fetch的响应是异步的,不像xhr那样随时 ...

    感谢,用大佬的两个库成功解决了,写了个触发频繁,间隔1秒自动重试的脚本

    // ==UserScript==
    // @name         New Userscript
    // @namespace    http://tampermonkey.net/
    // @version      2025-08-17
    // @description  try to take over the world!
    // @author       You
    // @match        https://leetcode.cn/*
    // @icon         https://www.google.com/s2/favicons?sz=64&domain=leetcode.cn
    // @grant        none
    // @require      https://scriptcat.org/lib/637/1.4.8/ajaxHooker.js
    // @require      https://scriptcat.org/lib/513/2.1.0/ElementGetter.js
    // ==/UserScript==

    (function() {
        'use strict';

        ajaxHooker.protect();

        ajaxHooker.filter([
            {type: 'fetch', url: 'interpret_solution', method: 'POST'},
        ]);

        ajaxHooker.hook(req => {
            req.response = res => {
                if (res.status === 429) {
                    elmGetter.get('button[data-e2e-locator="console-run-button"]').then(btn => {
                        setTimeout(() => {
                            console.log('click run btn');
                            btn.click();
                        }, 1000);
                    });
                }
            };
        });
    })();
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 64 天

    [LV.6]常住居民II

    16

    主题

    83

    回帖

    123

    积分

    中级工程师

    积分
    123
    发表于 2025-8-28 10:52:47 | 显示全部楼层
    大佬,请问差不多的请求,为什么一个能获取一个不能获取
    Snipaste_2025-08-28_10-49-20.png
    这个请求获取不了,下面这个可以
    Snipaste_2025-08-28_10-50-37.png
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    901

    回帖

    1398

    积分

    荣誉开发者

    积分
    1398

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

    发表于 2025-8-28 22:37:04 | 显示全部楼层
    琦玉 发表于 2025-8-28 10:52
    大佬,请问差不多的请求,为什么一个能获取一个不能获取

    这个请求获取不了,下面这个可以

    光看这个看不出来,可能只是单纯的时机问题,前一个请求更快,比脚本注入还快,可以在“启动器”那里看堆栈,找找有没有脚本注入的痕迹,没有的话基本就是这个问题。
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 64 天

    [LV.6]常住居民II

    16

    主题

    83

    回帖

    123

    积分

    中级工程师

    积分
    123
    发表于 2025-8-29 10:45:34 | 显示全部楼层
    cxxjackie 发表于 2025-8-28 22:37
    光看这个看不出来,可能只是单纯的时机问题,前一个请求更快,比脚本注入还快,可以在“启动器”那里看堆 ...

    谢谢大佬回复,照着你给的提示我发现这个请求是jQuery AJAX,似乎你的库对这个都拦截不了,试了几个请求都是这样,只要是jQuery AJAX都拦截不到
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    901

    回帖

    1398

    积分

    荣誉开发者

    积分
    1398

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

    发表于 2025-8-29 22:55:32 | 显示全部楼层
    琦玉 发表于 2025-8-29 10:45
    谢谢大佬回复,照着你给的提示我发现这个请求是jQuery AJAX,似乎你的库对这个都拦截不了,试了几个请求 ...

    我印象中库和jquery是没冲突的,你这个可能是jsonp引起的,不是普通请求,要么就是魔改的jquery。
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 64 天

    [LV.6]常住居民II

    16

    主题

    83

    回帖

    123

    积分

    中级工程师

    积分
    123
    发表于 6 天前 | 显示全部楼层
    我找到问题了,我没用这个//@run-at       document-start,加上这个就没问题了。
    回复

    使用道具 举报

    发表回复

    本版积分规则

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