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

  1. Re-fetch a fresh challenge page and re-solve immediately before submitting.
  2. Ensure the same scraper/session/IP is used for challenge fetch and verification.
  3. Slow down retries to avoid verification rate limits.
  4. 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

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)