{"record":{"id":"7f9294d2b3704ebc","repo":"DIYgod/RSSHub","slug":"error-7f9294","errorCode":null,"errorMessage":"访问量过大，触发验证码","messagePattern":"访问量过大，触发验证码","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"lib/routes/gdut/news.ts","lineNumber":89,"sourceCode":"        url: site + page,\n        headers: {\n            Cookie: cookie,\n        },\n    }).catch(async (e) => {\n        // cookie 失效了\n        if (e.statusCode === 302) {\n            if (/UserLogin/.test(e.headers.location)) {\n                cookie = await getCookie();\n                cache.set(site + page, cookie);\n                pageResp = await got({\n                    method: 'get',\n                    url: site + page,\n                    headers: {\n                        Cookie: cookie,\n                    },\n                });\n            } else if (/waf_verify/.test(e.headers.location)) {\n                throw new Error('访问量过大，触发验证码');\n            } else {\n                throw e;\n            }\n        } else {\n            throw e;\n        }\n    });\n\n    // 解析列表数据\n    const articleList = [];\n    const $ = load(pageResp.data);\n    $('#ContentPlaceHolder1_ListView1_ItemPlaceHolderContainer p a').each((index, element) => {\n        let url = $(element).attr('href');\n        if (url.startsWith('.')) {\n            url = url.substr(1);\n        }\n        const title = $(element).attr('title');\n        articleList.push({ title, link: site + url });","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/DIYgod/RSSHub/blob/bed535e0879dc71c5aff6f1e7bd1ac21ede40115/lib/routes/gdut/news.ts#L71-L107","documentation":"Thrown by the GDUT (Guangdong University of Technology) news route when the site's Web Application Firewall (WAF) returns a 302 redirect to a URL containing 'waf_verify'. This indicates the WAF has detected excessive traffic and is challenging the client with a CAPTCHA. CRITICAL CONTEXT: the entire module body is commented out (line 2: 'Removed due to news.gdut.edu.cn no longer exists'), so this code is dead and should never execute in any current RSSHub build.","triggerScenarios":"A GET to http://news.gdut.edu.cn/ArticleList.aspx?category=4 returns HTTP 302 with a Location header matching /waf_verify/. This happens when the same IP makes too many requests in a short window, triggering the WAF's rate-limit CAPTCHA challenge. The route catches the 302 in a .catch() handler, inspects e.headers.location, and throws this error for the waf_verify branch specifically.","commonSituations":"Running a stale fork of RSSHub that still contains the un-commented module; a self-hosted instance polling the GDUT feed every few minutes from a single IP; shared public RSSHub instances where many users subscribe to the same GDUT feed simultaneously.","solutions":["Update to the latest RSSHub — this route is fully commented out and dead code; if you hit this error you are running a fork that re-enabled the module","Reduce polling frequency in your RSS reader to once every 1–2 hours to stay under the WAF threshold","If maintaining a fork, implement exponential backoff with cookie rotation and cache cookies with a TTL longer than the WAF cooldown period","Route requests through a residential proxy pool to distribute the IP load"],"exampleFix":"// The entire module is commented out. If you are maintaining a fork that needs this:\n// before: throw new Error('访问量过大，触发验证码');\n// after:  throw new Error('GDUT WAF rate-limit triggered (waf_verify). Retry after 1-2 hours or reduce polling frequency.');\n// Additionally, wrap the retry in a backoff loop rather than failing immediately.","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"// The route already catches the 302. For a caller wrapping this handler:\ntry {\n    await handler(ctx);\n} catch (e) {\n    if (e.message.includes('waf_verify') || e.message.includes('验证码')) {\n        // WAF challenge — retry after a delay with a fresh cookie\n        // Exponential backoff: wait 60s, 120s, 300s\n    } else {\n        throw e;\n    }\n}","preventionTips":["Poll GDUT feeds no more than once per 1-2 hours","Cache session cookies with a TTL matching the WAF cooldown","Note: this route is commented out — update RSSHub to latest version","Use a proxy pool to distribute IP load for high-frequency polling"],"tags":["waf","rate-limit","captcha","anti-crawler","dead-code"],"backgroundTag":null,"analyzedSha":"bed535e0879dc71c5aff6f1e7bd1ac21ede40115","analyzedAt":"2026-08-12T19:29:35.364Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}