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

  1. Re-run the full challenge cycle with a fresh page fetch.
  2. Verify cookies and headers are consistent across the whole flow (single scraper instance).
  3. Rotate IP/proxy; silent rejections often correlate with blocked IPs.
  4. 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

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)