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

  1. 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
  2. Reduce polling frequency in your RSS reader to once every 1–2 hours to stay under the WAF threshold
  3. If maintaining a fork, implement exponential backoff with cookie rotation and cache cookies with a TTL longer than the WAF cooldown period
  4. 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

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


AI-assisted analysis of DIYgod/RSSHub@bed535e087 (2026-08-12). Data as JSON: /api/errors/7f9294d2b3704ebc. Report an issue: GitHub.