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

  1. Dump the body to identify HTML interstitials
  2. Update tokenResponse if the JSON shape changed
  3. 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)