fish2018/pansou · error
无效的JWT格式
Error message
无效的JWT格式
What it means
Format guard in decodeJWTURL: the token does not start with http(s) and does not split on '.' into exactly 3 segments (header.payload.signature). Input at fault is the Button.URL value from susu — it is not a JWT at all.
Solutions
- Check what susu actually returned in Button.URL
- Handle 2-segment or otherwise-shaped tokens if the site changed format
- Fail per-link, not per-search
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at plugin/susu/susu.go:517 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/2ad6106645b0c682.
Report an issue: GitHub.
Appendix: source
Thrown at plugin/susu/susu.go:517
return link, nil
}
// decodeJWTURL 解析JWT token获取真实链接
func (p *SusuAsyncPlugin) decodeJWTURL(jwtToken string) (string, error) {
if strings.HasPrefix(jwtToken, "http://") || strings.HasPrefix(jwtToken, "https://") {
return jwtToken, nil
}
// 检查缓存
if cachedURL, ok := jwtDecodeCache.Load(jwtToken); ok {
return cachedURL.(string), nil
}
// 分割JWT
parts := strings.Split(jwtToken, ".")
if len(parts) != 3 {
return "", fmt.Errorf("无效的JWT格式")
}
// 解码Payload
payload, err := base64.RawURLEncoding.DecodeString(parts[1])
if err != nil {
return "", fmt.Errorf("解码Payload失败: %w", err)
}
// 解析JSON
var payloadData struct {
Data struct {
URL string `json:"url"`
} `json:"data"`
}
if err := json.Unmarshal(payload, &payloadData); err != nil {
return "", fmt.Errorf("解析Payload JSON失败: %w", err)
}
if strings.TrimSpace(payloadData.Data.URL) == "" {View on GitHub (pinned to beaa561337)