{"record":{"id":"a82d40da3b1e8389","repo":"fish2018/pansou","slug":"error-a82d40","errorCode":null,"errorMessage":"站点未接受验证参数","messagePattern":"站点未接受验证参数","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"plugin/qiwei/qiwei.go","lineNumber":403,"sourceCode":"\tctx, cancel := context.WithTimeout(context.Background(), detailTimeout)\n\tdefer cancel()\n\treq, err := http.NewRequestWithContext(ctx, http.MethodGet, verifyURL, nil)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"创建验证请求失败: %w\", err)\n\t}\n\tp.setHeaders(req, pageURL)\n\treq.Header.Set(\"X-Requested-With\", \"XMLHttpRequest\")\n\tresp, err := p.doRequestWithRetry(req, client)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"提交验证失败: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\tresponseBody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"读取验证响应失败: %w\", err)\n\t}\n\tif isVerifyPage(string(responseBody)) {\n\t\treturn fmt.Errorf(\"站点未接受验证参数\")\n\t}\n\treturn nil\n}\n\nfunc md5StringToHex(value string) string {\n\tvar builder strings.Builder\n\tfor _, r := range value {\n\t\tbuilder.WriteString(fmt.Sprintf(\"%d\", r+1))\n\t}\n\tsum := md5.Sum([]byte(builder.String()))\n\treturn hex.EncodeToString(sum[:])\n}\n\nfunc (p *QiweiPlugin) parseDetail(detailURL, body, fallbackTitle, fallbackPic string) (detailInfo, error) {\n\tdoc, err := goquery.NewDocumentFromReader(strings.NewReader(body))\n\tif err != nil {\n\t\treturn detailInfo{}, fmt.Errorf(\"[%s] 解析详情页失败: %w\", p.Name(), err)\n\t}","sourceCodeStart":385,"sourceCodeEnd":421,"githubUrl":"https://github.com/fish2018/pansou/blob/beaa56133755a548ebc51b090b3816e2ae044aa6/plugin/qiwei/qiwei.go#L385-L421","documentation":"After submitting the verification parameters, the plugin re-checks the response with isVerifyPage. If the response still looks like a challenge page, the site did not accept the computed type/key/value and this error is returned. It means the solver's derived parameters were wrong or stale.","triggerScenarios":"isVerifyPage(string(responseBody)) is true after POSTing the solved parameters in solveVerification — the MD5-of-shifted-runes computation, key/type extraction, or session cookies did not satisfy the challenge.","commonSituations":"Site rotated its challenge algorithm (md5StringToHex no longer matches); the http.Client lacks the cookie jar so the session-bound challenge is not linked; the endpoint path regex matched a stale path; cached/old JS served.","solutions":["Ensure the http.Client shares a cookie jar across the page fetch and verification (challenge is session-bound per the source comment)","Re-derive md5StringToHex against the current JS to confirm the encoding algorithm is unchanged","Clear caches and refetch the fresh challenge JS before solving","Check whether verificationEndpointRegex resolved the correct endpoint path"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// Ensure the client carries a cookie jar so the session-bound challenge links up\njar, _ := cookiejar.New(nil)\nclient := &http.Client{Jar: jar, Timeout: 30 * time.Second}\nplugin := NewQiweiPlugin(client)","typeGuard":null,"tryCatchPattern":"info, err := plugin.GetDetailInfo(ctx, url)\nif err != nil && strings.Contains(err.Error(), \"站点未接受验证参数\") {\n    log.Printf(\"challenge rejected for %s; solver likely outdated\", url)\n    return cachedOrEmptyInfo\n}","preventionTips":["Always share one http.Client (with cookie jar) across page fetch and verification","Track upstream anti-bot JS changes; md5StringToHex must match the site's current algorithm","Alert on repeated occurrences — it means the challenge solver is stale, not transient"],"tags":["anti-bot","verification","session","cookies"],"backgroundTag":"authentication-required","analyzedSha":"beaa56133755a548ebc51b090b3816e2ae044aa6","analyzedAt":"2026-09-07T00:31:18.025Z","contentChangedAt":"2026-09-07T00:31:18.025Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}