DIYgod/RSSHub · warning · Error
访问量过大,触发验证码
Error message
访问量过大,触发验证码
What it means
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.
Source
Thrown at lib/routes/gdut/news.ts:89
url: site + page,
headers: {
Cookie: cookie,
},
}).catch(async (e) => {
// cookie 失效了
if (e.statusCode === 302) {
if (/UserLogin/.test(e.headers.location)) {
cookie = await getCookie();
cache.set(site + page, cookie);
pageResp = await got({
method: 'get',
url: site + page,
headers: {
Cookie: cookie,
},
});
} else if (/waf_verify/.test(e.headers.location)) {
throw new Error('访问量过大,触发验证码');
} else {
throw e;
}
} else {
throw e;
}
});
// 解析列表数据
const articleList = [];
const $ = load(pageResp.data);
$('#ContentPlaceHolder1_ListView1_ItemPlaceHolderContainer p a').each((index, element) => {
let url = $(element).attr('href');
if (url.startsWith('.')) {
url = url.substr(1);
}
const title = $(element).attr('title');
articleList.push({ title, link: site + url });View on GitHub (pinned to bed535e087)
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
Example fix
// The entire module is commented out. If you are maintaining a fork that needs this:
// before: throw new Error('访问量过大,触发验证码');
// after: throw new Error('GDUT WAF rate-limit triggered (waf_verify). Retry after 1-2 hours or reduce polling frequency.');
// Additionally, wrap the retry in a backoff loop rather than failing immediately. Defensive patterns
Strategy: retry
Try / catch
// The route already catches the 302. For a caller wrapping this handler:
try {
await handler(ctx);
} catch (e) {
if (e.message.includes('waf_verify') || e.message.includes('验证码')) {
// WAF challenge — retry after a delay with a fresh cookie
// Exponential backoff: wait 60s, 120s, 300s
} else {
throw e;
}
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- 文章列表获取失败,可能是被临时限制了访问,请稍后重试 ${JSON.stringify(resp.data)}
- TechFlow API returned an unexpected non-JSON response.
- TechFlow API still returned an anti-crawler challenge after
- 小红书风控校验,请稍后再试
- 日报数据不存在或为空
AI-assisted analysis of DIYgod/RSSHub@bed535e087 (2026-08-12).
Data as JSON: /api/errors/7f9294d2b3704ebc.
Report an issue: GitHub.