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

  1. Clear the action ID cache and re-run discovery for a fresh candidate set.
  2. Enable DebugLog and trace the final-link probes to see which candidates were tried and why each failed.
  3. Manually test link resolution on the live site to confirm the final-link ID mechanism is unchanged.
  4. 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

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)