fish2018/pansou · error
解析链接令牌失败
Error message
解析链接令牌失败: %w
What it means
json.Unmarshal failed on the ting77 token endpoint body despite a 200. The endpoint returned non-JSON (challenge page) or a changed schema for tokenResponse. Distinct from status-code and rate-limit errors, which are checked before this.
Solutions
- Dump the body to identify HTML interstitials
- Update tokenResponse if the JSON shape changed
- Retry once for transient garbage responses
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at plugin/ting77/ting77.go:321 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of fish2018/pansou@beaa561337 (2026-09-07).
Data as JSON: /api/errors/0ad868a38e26cd4b.
Report an issue: GitHub.
Appendix: source
Thrown at plugin/ting77/ting77.go:321
setRequestHeaders(req, p.baseURL+"/resource/"+resourceID, "application/json")
resp, err := client.Do(req)
if err != nil {
return "", "", err
}
defer resp.Body.Close()
body, err := io.ReadAll(io.LimitReader(resp.Body, 512<<10))
if err != nil {
return "", "", err
}
if resp.StatusCode != http.StatusOK {
if resp.StatusCode == http.StatusTooManyRequests {
return "", "", errRateLimited
}
return "", "", fmt.Errorf("令牌接口返回状态码 %d", resp.StatusCode)
}
var token tokenResponse
if err := json.Unmarshal(body, &token); err != nil {
return "", "", fmt.Errorf("解析链接令牌失败: %w", err)
}
if token.Code != 0 || token.Data.Token == "" || token.Data.TS == "" {
if token.Code == http.StatusTooManyRequests {
return "", "", errRateLimited
}
return "", "", fmt.Errorf("链接令牌无效: %s", token.Message)
}
return token.Data.Token, token.Data.TS, nil
}
func setRequestHeaders(req *http.Request, referer, accept string) {
req.Header.Set("User-Agent", browserUserAgent)
req.Header.Set("Accept", accept)
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
req.Header.Set("Cache-Control", "no-cache")
if referer != "" {
req.Header.Set("Referer", referer)
}View on GitHub (pinned to beaa561337)