Varc 发表于 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
// @descriptiontry 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);
      };
    }
});
})();

触发点是这个运行功能:
https://p.sda1.dev/26/c38f1a0b7fc68f1e9e47b667fc98ca01/image.png

达到速率限制之后就报错了
https://p.sda1.dev/26/84e1f28daa469a10587d1e04f1c48fd3/image.png

点报错的行号,定位到网站的这一行。感觉像是网站没处理好所以异常了?我不太懂前端{:4_115:}:
https://p.sda1.dev/26/8bfd33d94b52d4a543e48aa7a567540b/image.png

Varc 发表于 2025-8-18 08:02:41

Varc 发表于 2025-8-18 07:53
代码:
// ==UserScript==
// @name         New Userscript


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

cxxjackie 发表于 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回调应该能正常触发了。

Varc 发表于 2025-8-18 23:52:20

cxxjackie 发表于 2025-8-18 22:51
我知道了,fetch的response回调只会在响应值被读取时才触发(因为fetch的响应是异步的,不像xhr那样随时 ...

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

// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      2025-08-17
// @descriptiontry 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').then(btn => {
                  setTimeout(() => {
                        console.log('click run btn');
                        btn.click();
                  }, 1000);
                });
            }
      };
    });
})();

琦玉 发表于 2025-8-28 10:52:47

大佬,请问差不多的请求,为什么一个能获取一个不能获取

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

cxxjackie 发表于 2025-8-28 22:37:04

琦玉 发表于 2025-8-28 10:52
大佬,请问差不多的请求,为什么一个能获取一个不能获取

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


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

琦玉 发表于 2025-8-29 10:45:34

cxxjackie 发表于 2025-8-28 22:37
光看这个看不出来,可能只是单纯的时机问题,前一个请求更快,比脚本注入还快,可以在“启动器”那里看堆 ...

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

cxxjackie 发表于 2025-8-29 22:55:32

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

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

琦玉 发表于 2025-8-31 18:56:28

我找到问题了,我没用这个//@run-at       document-start,加上这个就没问题了。
页: 10 11 12 13 14 15 16 17 18 19 [20]
查看完整版本: ajax劫持库ajaxHooker