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
- Inspect the raw Button.URL value to see the actual token format
- Update decodeJWTURL if susu changed its token scheme
- 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, nilView on GitHub (pinned to beaa561337)