File size: 4,540 Bytes
1766992 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | # 动态 Header 改进说明
## 问题背景
之前的实现中,HTTP headers 是硬编码的:
- `sec-ch-ua-platform` 固定为 `"macOS"` 或 `"Windows"`
- `sec-ch-ua` 固定为特定的 Chrome 版本
- `Referer` 和 `accept-language` 固定不变
这种硬编码的方式容易被 Cursor API 识别为异常请求,导致 403 错误。
## 改进方案
### 1. 动态浏览器指纹生成器 (`utils/headers.go`)
创建了 `HeaderGenerator` 类,实现以下功能:
#### 智能平台选择
- 根据当前操作系统自动选择合适的浏览器配置
- macOS: 支持 Intel (x86) 和 Apple Silicon (arm) 架构
- Windows: 支持多个版本 (10.0, 11.0, 15.0)
- Linux: 标准 x86_64 配置
#### 随机化配置
- **Chrome 版本**: 从 120-130 随机选择
- **语言设置**: 支持 en-US, zh-CN, en-GB, ja-JP
- **Referer**: 随机选择不同的 Cursor 页面
- **User-Agent**: 根据平台和版本动态生成
#### 真实的浏览器指纹
生成的 headers 包含完整的浏览器指纹信息:
```json
{
"sec-ch-ua-platform": "macOS",
"sec-ch-ua-platform-version": "14.0.0",
"sec-ch-ua-arch": "arm",
"sec-ch-ua-bitness": "64",
"sec-ch-ua": "\"Google Chrome\";v=\"126\", \"Chromium\";v=\"126\", \"Not(A:Brand\";v=\"24\"",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36..."
}
```
### 2. 自动刷新机制
当遇到 403 错误时:
1. 自动刷新浏览器指纹配置
2. 清除 x-is-human token 缓存
3. 使用新的配置重试请求
### 3. 代码改进
#### 服务初始化
```go
type CursorService struct {
// ... 其他字段
headerGenerator *utils.HeaderGenerator
}
func NewCursorService(cfg *config.Config) *CursorService {
return &CursorService{
// ... 其他初始化
headerGenerator: utils.NewHeaderGenerator(),
}
}
```
#### Headers 生成
```go
// 之前:硬编码
func (s *CursorService) chatHeaders(xIsHuman string) map[string]string {
return map[string]string{
"sec-ch-ua-platform": `"macOS"`, // 固定值
"sec-ch-ua": `"Google Chrome";v="143"...`, // 固定版本
// ...
}
}
// 现在:动态生成
func (s *CursorService) chatHeaders(xIsHuman string) map[string]string {
return s.headerGenerator.GetChatHeaders(xIsHuman)
}
```
#### 403 错误处理
```go
if resp.StatusCode == http.StatusForbidden && attempt < maxRetries {
logrus.Warn("Received 403, refreshing browser fingerprint...")
// 刷新浏览器指纹
s.headerGenerator.Refresh()
// 清除 token 缓存
s.scriptMutex.Lock()
s.scriptCache = ""
s.scriptCacheTime = time.Time{}
s.scriptMutex.Unlock()
// 重试
continue
}
```
## 优势
### 1. 更难被检测
- 每次请求的指纹信息都可能不同
- 模拟真实用户的多样性
- 避免固定模式被识别
### 2. 自动适应
- 根据运行环境自动选择合适的配置
- macOS 上运行自动使用 macOS 配置
- Windows 上运行自动使用 Windows 配置
### 3. 更好的容错性
- 遇到 403 错误自动切换配置
- 增加请求成功率
- 减少人工干预
### 4. 易于维护
- 集中管理浏览器配置
- 易于添加新的平台或版本
- 代码更简洁清晰
## 测试结果
运行测试程序可以看到:
```
浏览器配置:
平台: macOS
平台版本: 14.0.0
架构: arm
位数: 64
Chrome 版本: 126
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...
生成 5 个随机配置:
1. macOS | Chrome 130 | arm
2. macOS | Chrome 125 | arm
3. macOS | Chrome 130 | x86
4. macOS | Chrome 128 | arm
5. macOS | Chrome 122 | arm
```
每次生成的配置都不同,增加了多样性。
## 使用方法
无需任何配置,直接使用即可:
```bash
# 重新编译
go build -o cursor2api-go
# 运行服务
./cursor2api-go
```
服务会自动:
- 根据操作系统选择合适的浏览器配置
- 为每个请求生成动态 headers
- 遇到 403 错误时自动刷新配置并重试
## 日志示例
启用调试模式后可以看到:
```
DEBU Sending request to Cursor API attempt=1 model=claude-sonnet-4.6
WARN Received 403 Access Denied, refreshing browser fingerprint...
DEBU Refreshed browser fingerprint platform=macOS chrome_version=124
DEBU Sending request to Cursor API attempt=2 model=claude-sonnet-4.6
```
## 未来改进
可以考虑的进一步优化:
1. 添加更多浏览器类型 (Firefox, Safari)
2. 支持移动设备指纹
3. 根据成功率动态调整配置策略
4. 添加指纹轮换策略 (定期刷新)
|