fish2018/pansou · error

提交验证失败

Error message

提交验证失败: %w

What it means

Wraps the transport error returned by cloudscraper's POST when submitting the solved bot-challenge verification form. It means the verification request never got an HTTP response (connection, TLS, timeout, or proxy failure). The library wraps the underlying cause with %w so callers can unwrap it.

Solutions

  1. Unwrap the error with errors.Unwrap/As to find the root cause (e.g. *url.Error, net.Error, x509 errors).
  2. Verify the proxy settings applied to the scraper are reachable and correct.
  3. Retry the request with backoff; these are usually transient network failures.
  4. Check DNS/TLS connectivity to the target site (curl the same URL).
Defensive patterns

Strategy: retry

Validate before calling

if u, err := url.Parse(requestURL); err != nil || (u.Scheme != "http" && u.Scheme != "https") { return fmt.Errorf("invalid request URL for challenge submit") }

Type guard

var netErr net.Error; if errors.As(err, &netErr) && netErr.Timeout() { /* retry with backoff */ }

Try / catch

if err := p.doRequest(); err != nil { var wrapped *fmt.wrapError; if errors.As(err, &wrapped) { log.Printf("submit failed: %v", errors.Unwrap(err)) }; if isRetryable(err) { time.Sleep(backoff); retry() } }

Prevention

When it happens

Trigger: submitChallengeVerification calls scraper.Post(requestURL, "application/x-www-form-urlencoded", ...) and err != nil, i.e. before any HTTP status is available, during challenge verification against the site.

Common situations: Site unreachable from the host, invalid/unreachable proxy configured via applyProxyToScraper, TLS interception or cert issues, DNS failure, or transient network drops during anti-bot verification.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of fish2018/pansou@beaa561337 (2026-09-07). Data as JSON: /api/errors/f870f3e5949ecb6c. Report an issue: GitHub.

Appendix: source

Thrown at plugin/gying/gying.go:1870

		if missing > 0 {
			return fmt.Errorf("无法完成机器人验证")
		}
	}

	form := url.Values{}
	form.Set("action", "verify")
	form.Set("id", challenge.ID)
	for _, nonce := range nonces {
		form.Add("nonce[]", strconv.Itoa(nonce))
	}

	return p.submitChallengeVerification(scraper, requestURL, form)
}

func (p *GyingPlugin) submitChallengeVerification(scraper *cloudscraper.Scraper, requestURL string, form url.Values) error {
	resp, err := scraper.Post(requestURL, "application/x-www-form-urlencoded", strings.NewReader(form.Encode()))
	if err != nil {
		return fmt.Errorf("提交验证失败: %w", err)
	}
	defer resp.Body.Close()

	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)

View on GitHub (pinned to beaa561337)