fish2018/pansou · error
机器人验证失败
Error message
机器人验证失败: %s
What it means
Verification-rejected error in gying's challenge flow (plugin/gying/gying.go:1892): the verify response parsed and Success is false; the site's message is included via %s when present. Means the submitted proof-of-work was computed but the server rejected the verification (stale challenge or wrong answer).
Solutions
- Re-fetch a fresh challenge page and re-solve immediately before submitting.
- Ensure the same scraper/session/IP is used for challenge fetch and verification.
- Slow down retries to avoid verification rate limits.
- Read the embedded Msg for the site's specific rejection reason and update cloudscraper if the challenge type changed.
Defensive patterns
Strategy: retry
Try / catch
var errRejected *RejectedError; if errors.As(err, &errRejected) { if strings.Contains(errRejected.Msg, "expire") { refreshChallengeAndRetry() } else { alert(errRejected.Msg) } } Prevention
- Submit challenge solutions immediately after fetching them
- Use one session/IP for fetch and verify
- Throttle verification attempts to avoid rate limits
- Surface the site's Msg in logs for diagnosis
When it happens
Trigger: submitChallengeVerification parses challengeVerifyResponse where Success is false and Msg is non-empty — the site explicitly rejected the submitted challenge answer or token.
Common situations: 挑战时间戳过期后提交;computePowResult 结果与服务端校验不一致。
Related errors
AI-assisted analysis of fish2018/pansou@beaa561337 (2026-09-07).
Data as JSON: /api/errors/77007847d743b438.
Report an issue: GitHub.
Appendix: source
Thrown at plugin/gying/gying.go:1892
if DebugLog {
fmt.Printf("[Gying] Challenge提交完成: url=%s status=%d\n", requestURL, resp.StatusCode)
}
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
return fmt.Errorf("读取验证响应失败: %w", err)
}
if isBotChallengePage(respBody) {
return fmt.Errorf("机器人验证出现循环")
}
var verifyResp challengeVerifyResponse
if err := json.Unmarshal(respBody, &verifyResp); err != nil {
return fmt.Errorf("解析验证响应失败: %w", err)
}
if !verifyResp.Success {
if verifyResp.Msg != "" {
return fmt.Errorf("机器人验证失败: %s", verifyResp.Msg)
}
return fmt.Errorf("机器人验证失败")
}
if DebugLog {
fmt.Printf("[Gying] Challenge验证成功: url=%s\n", requestURL)
}
return nil
}
func (p *GyingPlugin) requestWithChallengeRetry(scraper *cloudscraper.Scraper, method, requestURL, contentType, requestBody string) ([]byte, int, http.Header, error) {
for attempt := 0; attempt < 2; attempt++ {
var (
resp *http.Response
err error
)
View on GitHub (pinned to beaa561337)