{"record":{"id":"ed62d51542513f6d","repo":"fish2018/pansou","slug":"final-link-action-id","errorCode":null,"errorMessage":"未能验证final_link_action_id","messagePattern":"未能验证final_link_action_id","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"plugin/panyq/panyq.go","lineNumber":619,"sourceCode":"\t\t\t// 执行中间步骤\n\t\t\terr = p.performIntermediateStep(finalIDs[ActionIDKeys[1]], testCreds.Hash, testCreds.Sha, testEID, p.client)\n\t\t\tif err != nil {\n\t\t\t\tif DebugLog {\n\t\t\t\t\tfmt.Printf(\"panyq: 交换后中间步骤执行失败: %v\\n\", err)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 验证final_link_action_id\n\t\t\t\tif p.validateFinalLinkID(finalIDs[ActionIDKeys[2]], testEID) {\n\t\t\t\t\tfinalLinkIDFound = true\n\t\t\t\t\tif DebugLog {\n\t\t\t\t\t\tfmt.Println(\"panyq: 交换ID后验证成功!\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif !finalLinkIDFound {\n\t\t\treturn nil, fmt.Errorf(\"未能验证final_link_action_id\")\n\t\t}\n\t}\n\t\n\t// 保存到内存缓存\n\tactionIDCacheLock.Lock()\n\tfor k, v := range finalIDs {\n\t\tactionIDCache[k] = v\n\t}\n\tactionIDCacheLock.Unlock()\n\t\n\t// 保存到文件缓存\n\tif err := p.saveActionIDsToFile(finalIDs); err != nil {\n\t\tfmt.Printf(\"panyq: 保存Action IDs到文件失败: %v\\n\", err)\n\t\t// 继续执行，不返回错误\n\t}\n\t\n\tif DebugLog {\n\t\tfmt.Println(\"panyq: all Action IDs validated successfully:\")","sourceCodeStart":601,"sourceCodeEnd":637,"githubUrl":"https://github.com/fish2018/pansou/blob/beaa56133755a548ebc51b090b3816e2ae044aa6/plugin/panyq/panyq.go#L601-L637","documentation":"discoverActionIDs could not validate the final_link_action_id: none of the remaining candidate IDs passed the final-link verification (typically checked by resolving a result link through the candidate ID), so finalLinkIDFound stayed false. Discovery aborts without a complete ID set.","triggerScenarios":"Running discoverActionIDs when the candidate pool has no ID that satisfies final-link validation — upstream changed the final-link/redirect ID, earlier validations consumed the right candidate, or each probe failed (network error or unexpected response).","commonSituations":"Upstream redesign changing how final/redirect action IDs work; candidate extraction missing the new ID; anti-bot blocking link-resolution probes; stale cached candidates mixed with fresh ones.","solutions":["Clear the action ID cache and re-run discovery for a fresh candidate set.","Enable DebugLog and trace the final-link probes to see which candidates were tried and why each failed.","Manually test link resolution on the live site to confirm the final-link ID mechanism is unchanged.","Update the plugin to the current upstream scheme."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"ids, err := plugin.DiscoverActionIDs()\nif err != nil && strings.Contains(err.Error(), \"未能验证final_link_action_id\") {\n    plugin.InvalidateActionIDCache()\n    time.Sleep(backoff)\n    ids, err = plugin.DiscoverActionIDs()\n}","preventionTips":["Purge stale cached candidates before discovery","Trace final-link probes with DebugLog","Track upstream redirect/link mechanism changes","Update plugin versions regularly"],"tags":["action-id","verification","upstream","plugin"],"backgroundTag":"unexpected-api-response-shape","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"}