fish2018/pansou · error
机器人验证失败
Error message
机器人验证失败
What it means
Same as the parameterized variant: the verification response had Success=false but the site provided no explanatory Msg, so the library returns a bare failure. The submitted challenge answer was rejected without a reason.
Solutions
- Re-run the full challenge cycle with a fresh page fetch.
- Verify cookies and headers are consistent across the whole flow (single scraper instance).
- Rotate IP/proxy; silent rejections often correlate with blocked IPs.
- Update cloudscraper to support the site's current challenge version.
Defensive patterns
Strategy: retry
Try / catch
if err != nil && strings.Contains(err.Error(), "机器人验证失败") { scraper = freshScraper(); fullChallengeRetry() } Prevention
- Restart the full challenge cycle on silent rejection
- Rotate IP/proxy after repeated silent rejections
- Ensure consistent headers/TLS fingerprint across attempts
- Update cloudscraper for current challenge types
When it happens
Trigger: submitChallengeVerification gets challengeVerifyResponse with Success=false and empty Msg after POSTing the challenge form.
Common situations: Silent rejection due to fingerprint/TLS mismatch, stale cookies, or the site deliberately withholding the reason; often seen when automation is detected despite a solved challenge.
Related errors
AI-assisted analysis of fish2018/pansou@beaa561337 (2026-09-07).
Data as JSON: /api/errors/dbf876a4eabca575.
Report an issue: GitHub.
Appendix: source
Thrown at plugin/gying/gying.go:1894
}
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
)
switch method {
case http.MethodGet:View on GitHub (pinned to beaa561337)