fish2018/pansou · error
Anubis 验证结果返回状态码
Error message
Anubis 验证结果返回状态码 %d
What it means
The pass endpoint must return HTTP 200 and NOT look like another Anubis gate. If passResp.StatusCode != 200 or isAnubisGateResponse(passResp) is true, the challenge was rejected and this error reports the status (miosou.go:209).
Solutions
- Retry the full flow — ensureGate reruns with a fresh challenge; expired challenges succeed on the next attempt.
- Increase gateTimeout so slow devices submit before the challenge expires.
- Verify the proof parameters (id, response hex hash, nonce, redir) match the current Anubis server expectations; update if Anubis upgraded.
- Check whether the server is rate-limiting your IP (429) and back off.
- Confirm baseURL matches the exact host the challenge was issued for.
Defensive patterns
Strategy: retry
Try / catch
if err := p.ensureGate(); err != nil {
if strings.Contains(err.Error(), "验证结果返回状态码") {
// proof rejected: retry full flow; if persistent, check Anubis version compat
}
return err
} Prevention
- Submit promptly after solving so the challenge doesn't expire
- Match the Anubis client version with the server version
- Respect rate limits (back off on 429)
- Verify redir/id parameters match the challenge host
When it happens
Trigger: The solved hash/nonce is rejected (wrong answer or expired challenge id), the server returns 401/403/429/5xx, or the response still routes through /.within.website/ indicating the gate did not clear.
Common situations: Anubis server version change altering the expected proof format, challenge expiring before submission (slow PoW), rate limiting, or an incorrect elapsedTime/redir parameter confusing the server.
Understand the failure class
Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.
Related errors
AI-assisted analysis of fish2018/pansou@beaa561337 (2026-09-07).
Data as JSON: /api/errors/2f848676b18c3df4.
Report an issue: GitHub.
Appendix: source
Thrown at plugin/miosou/miosou.go:209
"response": []string{hash},
"nonce": []string{strconv.FormatUint(nonce, 10)},
"redir": []string{baseURL + "/"},
"elapsedTime": []string{strconv.FormatInt(elapsed, 10)},
}
passReq, err := http.NewRequestWithContext(ctx, http.MethodGet, baseURL+anubisPassPath+"?"+query.Encode(), nil)
if err != nil {
return fmt.Errorf("创建 Anubis 验证提交请求失败: %w", err)
}
setPageHeaders(passReq)
passReq.Header.Set("Referer", resp.Request.URL.String())
passResp, err := p.client.Do(passReq)
if err != nil {
return fmt.Errorf("提交 Anubis 验证结果失败: %w", err)
}
io.Copy(io.Discard, io.LimitReader(passResp.Body, 1<<20))
passResp.Body.Close()
if passResp.StatusCode != http.StatusOK || isAnubisGateResponse(passResp) {
return fmt.Errorf("Anubis 验证结果返回状态码 %d", passResp.StatusCode)
}
return nil
}
func (p *MiosouPlugin) invalidateGate() {
p.gateMu.Lock()
p.gateReady = false
p.gateMu.Unlock()
}
func setHeaders(req *http.Request, accept string) {
req.Header.Set("User-Agent", browserUserAgent)
req.Header.Set("Accept", accept)
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
req.Header.Set("Cache-Control", "no-cache")
req.Header.Set("Referer", baseURL+"/")
origin := baseURL
req.Header.Set("Origin", origin)View on GitHub (pinned to beaa561337)