fish2018/pansou · error
未能验证final_link_action_id
Error message
未能验证final_link_action_id
What it means
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.
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.
Defensive patterns
Strategy: retry
Try / catch
ids, err := plugin.DiscoverActionIDs()
if err != nil && strings.Contains(err.Error(), "未能验证final_link_action_id") {
plugin.InvalidateActionIDCache()
time.Sleep(backoff)
ids, err = plugin.DiscoverActionIDs()
} Prevention
- Purge stale cached candidates before discovery
- Trace final-link probes with DebugLog
- Track upstream redirect/link mechanism changes
- Update plugin versions regularly
When it happens
Trigger: 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).
Common situations: 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.
Understand the failure class
Background: "invalid response format", "malformed payload", "missing data field": when an API returns 200 but the response shape is wrong — this error's family across 23 libraries.
Related errors
AI-assisted analysis of fish2018/pansou@beaa561337 (2026-09-07).
Data as JSON: /api/errors/ed62d51542513f6d.
Report an issue: GitHub.
Appendix: source
Thrown at plugin/panyq/panyq.go:619
// 执行中间步骤
err = p.performIntermediateStep(finalIDs[ActionIDKeys[1]], testCreds.Hash, testCreds.Sha, testEID, p.client)
if err != nil {
if DebugLog {
fmt.Printf("panyq: 交换后中间步骤执行失败: %v\n", err)
}
} else {
// 验证final_link_action_id
if p.validateFinalLinkID(finalIDs[ActionIDKeys[2]], testEID) {
finalLinkIDFound = true
if DebugLog {
fmt.Println("panyq: 交换ID后验证成功!")
}
}
}
}
if !finalLinkIDFound {
return nil, fmt.Errorf("未能验证final_link_action_id")
}
}
// 保存到内存缓存
actionIDCacheLock.Lock()
for k, v := range finalIDs {
actionIDCache[k] = v
}
actionIDCacheLock.Unlock()
// 保存到文件缓存
if err := p.saveActionIDsToFile(finalIDs); err != nil {
fmt.Printf("panyq: 保存Action IDs到文件失败: %v\n", err)
// 继续执行,不返回错误
}
if DebugLog {
fmt.Println("panyq: all Action IDs validated successfully:")View on GitHub (pinned to beaa561337)