修复检测

This commit is contained in:
扫地僧 2026-06-14 00:45:38 +08:00
parent 269fbd08ff
commit df02280086
4 changed files with 53 additions and 61 deletions

View File

@ -878,6 +878,54 @@ func setPoolUnavailable(c *beego.Controller, module string) {
_ = c.ServeJSON() _ = c.ServeJSON()
} }
func updatePoolUsable(c *beego.Controller, module string) {
if _, err := requirePlatformAuth(c); err != nil {
poolJSONErr(c, 401, 401, err.Error())
return
}
if module != "cursor" {
poolJSONErr(c, 400, 400, "该模块不支持可用状态修改")
return
}
raw, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
poolJSONErr(c, 400, 400, "参数错误")
return
}
var payload struct {
ID uint64 `json:"id"`
Usable int `json:"usable"`
}
if err := json.Unmarshal(raw, &payload); err != nil || payload.ID == 0 {
poolJSONErr(c, 400, 400, "参数错误")
return
}
if payload.Usable != 0 && payload.Usable != 1 {
poolJSONErr(c, 400, 400, "可用状态参数错误")
return
}
now := time.Now()
updated, err := models.Orm.QueryTable(new(models.PlatformAccountPoolCursor)).Filter("id", payload.ID).Update(orm.Params{
"is_used": int8(payload.Usable),
"update_time": now,
})
if err != nil {
poolJSONErr(c, 500, 500, "可用状态更新失败: "+err.Error())
return
}
if updated == 0 {
poolJSONErr(c, 404, 404, "记录不存在")
return
}
msg := "已标记不可用"
if payload.Usable == 1 {
msg = "已标记可用"
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": msg}
_ = c.ServeJSON()
}
func updatePoolPlatform(c *beego.Controller, module string) { func updatePoolPlatform(c *beego.Controller, module string) {
if _, err := requirePlatformAuth(c); err != nil { if _, err := requirePlatformAuth(c); err != nil {
poolJSONErr(c, 401, 401, err.Error()) poolJSONErr(c, 401, 401, err.Error())
@ -1088,6 +1136,9 @@ func (c *PlatformAccountPoolCursorController) UpdateRemark() {
func (c *PlatformAccountPoolCursorController) SetUnavailable() { func (c *PlatformAccountPoolCursorController) SetUnavailable() {
setPoolUnavailable(&c.Controller, "cursor") setPoolUnavailable(&c.Controller, "cursor")
} }
func (c *PlatformAccountPoolCursorController) UpdateUsable() {
updatePoolUsable(&c.Controller, "cursor")
}
func (c *PlatformAccountPoolCursorController) UpdatePlatform() { func (c *PlatformAccountPoolCursorController) UpdatePlatform() {
updatePoolPlatform(&c.Controller, "cursor") updatePoolPlatform(&c.Controller, "cursor")
} }

View File

@ -59,67 +59,7 @@ func normalizeBearerToken(s string) string {
} }
func probeCursor(token string) Result { func probeCursor(token string) Result {
url := "https://api2.cursor.sh/auth/full_stripe_profile" return probeCursorHiAgent(token)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return Result{OK: false, Detail: "构造请求失败: " + err.Error()}
}
req.Header.Set("Authorization", "Bearer "+strings.TrimSpace(token))
req.Header.Set("X-Cursor-Client-Version", "3.0.16")
req.Header.Set("X-New-Onboarding-Completed", "false")
req.Header.Set("X-Ghost-Mode", "true")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Cursor/3.0.16 Chrome/142.0.7444.265 Electron/39.8.1 Safari/537.36")
req.Header.Set("Accept", "*/*")
req.Header.Set("Origin", "vscode-file://vscode-app")
req.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd")
req.Header.Set("Accept-Language", "zh-CN")
req.Header.Set("Priority", "u=1, i")
resp, err := httpClient.Do(req)
if err != nil {
return Result{OK: false, Detail: "请求官方账单接口超时/网络失败: " + err.Error(), HTTPStatus: 500}
}
defer resp.Body.Close()
body, _ := io.ReadAll(io.LimitReader(resp.Body, 16384))
jsonStr := string(body)
res := Result{
HTTPStatus: resp.StatusCode,
Endpoint: url,
BytesRead: len(body),
RawPreview: jsonStr,
StreamProtocol: "HTTP/2 JSON REST",
StreamNote: "2026型画像探测",
ProbeMessage: "GET full_stripe_profile",
}
if resp.StatusCode != http.StatusOK {
res.OK = false
res.Detail = fmt.Sprintf("Token已失效或被官方拉黑HTTP %d", resp.StatusCode)
return res
}
if strings.Contains(jsonStr, `"noModelsRemaining":true`) ||
strings.Contains(jsonStr, `"is_usage_limited":true`) ||
strings.Contains(jsonStr, `"hard_limit_reached"`) ||
strings.Contains(jsonStr, `"blocked"`) ||
(strings.Contains(jsonStr, `"membershipType":"free"`) && strings.Contains(jsonStr, `"trialEligible":false`)) {
res.OK = false
res.Detail = "Token存活但属于无额度Free空壳号上号必弹付费墙"
return res
}
if len(jsonStr) < 10 {
res.OK = false
res.Detail = "官方接口返回异常空数据"
return res
}
res.OK = true
res.Detail = "检测成功,高速算力/Agent额度健康"
return res
} }
func probeWindsurf(apiKey string) Result { func probeWindsurf(apiKey string) Result {

View File

@ -170,6 +170,7 @@ func Register() {
beego.Router("/platform/accountPool/cursor/extract", &controllers.PlatformAccountPoolCursorController{}, "post:Extract") beego.Router("/platform/accountPool/cursor/extract", &controllers.PlatformAccountPoolCursorController{}, "post:Extract")
beego.Router("/platform/accountPool/cursor/updateRemark", &controllers.PlatformAccountPoolCursorController{}, "post:UpdateRemark") beego.Router("/platform/accountPool/cursor/updateRemark", &controllers.PlatformAccountPoolCursorController{}, "post:UpdateRemark")
beego.Router("/platform/accountPool/cursor/setUnavailable", &controllers.PlatformAccountPoolCursorController{}, "post:SetUnavailable") beego.Router("/platform/accountPool/cursor/setUnavailable", &controllers.PlatformAccountPoolCursorController{}, "post:SetUnavailable")
beego.Router("/platform/accountPool/cursor/updateUsable", &controllers.PlatformAccountPoolCursorController{}, "post:UpdateUsable")
beego.Router("/platform/accountPool/cursor/updatePlatform", &controllers.PlatformAccountPoolCursorController{}, "post:UpdatePlatform") beego.Router("/platform/accountPool/cursor/updatePlatform", &controllers.PlatformAccountPoolCursorController{}, "post:UpdatePlatform")
beego.Router("/platform/accountPool/cursor/unextract", &controllers.PlatformAccountPoolCursorController{}, "post:Unextract") beego.Router("/platform/accountPool/cursor/unextract", &controllers.PlatformAccountPoolCursorController{}, "post:Unextract")
beego.Router("/platform/accountPool/cursor/replenish", &controllers.PlatformAccountPoolCursorController{}, "post:Replenish") beego.Router("/platform/accountPool/cursor/replenish", &controllers.PlatformAccountPoolCursorController{}, "post:Replenish")

Binary file not shown.