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

  1. Check what susu actually returned in Button.URL
  2. Handle 2-segment or otherwise-shaped tokens if the site changed format
  3. 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)