gemini_native_signature_cleaner.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package service
  2. import (
  3. "encoding/json"
  4. "github.com/Wei-Shaw/sub2api/internal/pkg/antigravity"
  5. )
  6. // CleanGeminiNativeThoughtSignatures 从 Gemini 原生 API 请求中替换 thoughtSignature 字段为 dummy 签名,
  7. // 以避免跨账号签名验证错误。
  8. //
  9. // 当粘性会话切换账号时(例如原账号异常、不可调度等),旧账号返回的 thoughtSignature
  10. // 会导致新账号的签名验证失败。通过替换为 dummy 签名,跳过签名验证。
  11. //
  12. // CleanGeminiNativeThoughtSignatures replaces thoughtSignature fields with dummy signature
  13. // in Gemini native API requests to avoid cross-account signature validation errors.
  14. //
  15. // When sticky session switches accounts (e.g., original account becomes unavailable),
  16. // thoughtSignatures from the old account will cause validation failures on the new account.
  17. // By replacing with dummy signature, we skip signature validation.
  18. func CleanGeminiNativeThoughtSignatures(body []byte) []byte {
  19. if len(body) == 0 {
  20. return body
  21. }
  22. // 解析 JSON
  23. var data any
  24. if err := json.Unmarshal(body, &data); err != nil {
  25. // 如果解析失败,返回原始 body(可能不是 JSON 或格式不正确)
  26. return body
  27. }
  28. // 递归替换 thoughtSignature 为 dummy 签名
  29. replaced := replaceThoughtSignaturesRecursive(data)
  30. // 重新序列化
  31. result, err := json.Marshal(replaced)
  32. if err != nil {
  33. // 如果序列化失败,返回原始 body
  34. return body
  35. }
  36. return result
  37. }
  38. // replaceThoughtSignaturesRecursive 递归遍历数据结构,将所有 thoughtSignature 字段替换为 dummy 签名
  39. func replaceThoughtSignaturesRecursive(data any) any {
  40. switch v := data.(type) {
  41. case map[string]any:
  42. // 创建新的 map,替换 thoughtSignature 为 dummy 签名
  43. result := make(map[string]any, len(v))
  44. for key, value := range v {
  45. // 替换 thoughtSignature 字段为 dummy 签名
  46. if key == "thoughtSignature" {
  47. result[key] = antigravity.DummyThoughtSignature
  48. continue
  49. }
  50. // 递归处理嵌套结构
  51. result[key] = replaceThoughtSignaturesRecursive(value)
  52. }
  53. return result
  54. case []any:
  55. // 递归处理数组中的每个元素
  56. result := make([]any, len(v))
  57. for i, item := range v {
  58. result[i] = replaceThoughtSignaturesRecursive(item)
  59. }
  60. return result
  61. default:
  62. // 基本类型(string, number, bool, null)直接返回
  63. return v
  64. }
  65. }