fish2018/pansou · error

[susu] 解析JWT失败

Error message

[susu] 解析JWT失败: %w

What it means

Wrapper around decodeJWTURL: the button URL returned by susu is neither a plain http(s) link nor a decodable JWT of the expected shape (wrong segment count, bad base64, or payload JSON without a usable url).

Solutions

  1. Inspect the raw Button.URL value to see the actual token format
  2. Update decodeJWTURL if susu changed its token scheme
  3. Cache decode failures to avoid repeated work
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at plugin/susu/susu.go:482 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/c90fe0402947527a. Report an issue: GitHub.

Appendix: source

Thrown at plugin/susu/susu.go:482

	if err != nil {
		return model.Link{}, fmt.Errorf("[susu] 读取按钮详情失败: %w", err)
	}

	// 解析响应
	var buttonDetail buttonDetailResponse
	if err := json.Unmarshal(respBody, &buttonDetail); err != nil {
		return model.Link{}, fmt.Errorf("[susu] 解析按钮详情失败: %w", err)
	}

	// 如果URL为空
	if buttonDetail.Button.URL == "" {
		return model.Link{}, fmt.Errorf("[susu] 按钮URL为空")
	}

	// 解析JWT token获取真实链接
	realURL, err := p.decodeJWTURL(buttonDetail.Button.URL)
	if err != nil {
		return model.Link{}, fmt.Errorf("[susu] 解析JWT失败: %w", err)
	}
	realURL = strings.TrimSpace(realURL)
	parsedURL, err := url.Parse(realURL)
	if err != nil || (parsedURL.Scheme != "http" && parsedURL.Scheme != "https") || parsedURL.Host == "" {
		return model.Link{}, fmt.Errorf("[susu] 按钮返回无效链接")
	}

	// 创建链接
	link := model.Link{
		URL:      realURL,
		Type:     p.determineLinkType(realURL, buttonDetail.Button.Name),
		Password: extractPassword(realURL, buttonDetail.Button.Attr.TQ),
	}

	// 缓存结果
	buttonDetailCache.Store(cacheKey, link)

	return link, nil

View on GitHub (pinned to beaa561337)