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

  1. Retry the full flow — ensureGate reruns with a fresh challenge; expired challenges succeed on the next attempt.
  2. Increase gateTimeout so slow devices submit before the challenge expires.
  3. Verify the proof parameters (id, response hex hash, nonce, redir) match the current Anubis server expectations; update if Anubis upgraded.
  4. Check whether the server is rate-limiting your IP (429) and back off.
  5. 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

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)