package controllers import ( "fmt" "time" "server/models" "github.com/beego/beego/v2/client/orm" beego "github.com/beego/beego/v2/server/web" ) // ApiGetCardController 对外提卡接口(无需登录) // GET /api/getcard?type=xianyu&module=cursor type ApiGetCardController struct { beego.Controller } // validPlatformTypes 支持的来源平台 var validPlatformTypes = map[string]bool{ "xianyu": true, "pinduoduo": true, "jingdong": true, "douyin": true, "local": true, } // validModules 支持的号池模块 var validModules = map[string]bool{ "cursor": true, "windsurf": true, "krio": true, } func (c *ApiGetCardController) cardErr(httpStatus, code int, msg string) { c.Ctx.Output.SetStatus(httpStatus) c.Ctx.Output.Header("Content-Type", "text/plain; charset=utf-8") _ = c.Ctx.Output.Body([]byte(msg)) } func (c *ApiGetCardController) cardOK(text string) { c.Ctx.Output.SetStatus(200) c.Ctx.Output.Header("Content-Type", "text/plain; charset=utf-8") _ = c.Ctx.Output.Body([]byte(text)) } // GetCard 提取一张卡(不可重复提取) // GET /api/getcard?type=xianyu&module=cursor&data_type=tk // // 参数: // - type (必填) 来源平台:xianyu / taobao / pinduoduo / jingdong / local // - module (必填) 号池模块:cursor / windsurf / krio // - data_type (可选) 账号类型:account / tk / account_tk,不传则取任意未提取的 func (c *ApiGetCardController) GetCard() { platform := c.GetString("type") module := c.GetString("module") dataType := c.GetString("data_type") // 参数校验 if platform == "" { c.cardErr(400, 400, "缺少参数 type(来源平台)") return } if !validPlatformTypes[platform] { c.cardErr(400, 400, fmt.Sprintf("不支持的平台类型: %s,支持: xianyu/taobao/pinduoduo/jingdong/local", platform)) return } if module == "" { c.cardErr(400, 400, "缺少参数 module(号池模块)") return } if !validModules[module] { c.cardErr(400, 400, fmt.Sprintf("不支持的模块: %s,支持: cursor/windsurf/krio", module)) return } if dataType != "" && !isValidPoolType(dataType) { c.cardErr(400, 400, "data_type 不合法,支持: account/tk/account_tk") return } now := time.Now() switch module { case "cursor": c.extractCursor(platform, dataType, now) case "windsurf": c.extractWindsurf(platform, dataType, now) case "krio": c.extractKrio(platform, dataType, now) } } func (c *ApiGetCardController) extractCursor(platform, dataType string, now time.Time) { var row models.PlatformAccountPoolCursor qs := models.Orm.QueryTable(new(models.PlatformAccountPoolCursor)). Filter("is_extracted", 0). Filter("delete_time__isnull", true) if dataType != "" { qs = qs.Filter("data_type", dataType) } if err := qs.OrderBy("id").One(&row); err != nil { if err == orm.ErrNoRows { c.cardErr(404, 404, "暂无可用卡密") } else { c.cardErr(500, 500, "查询失败") } return } _, err := models.Orm.QueryTable(new(models.PlatformAccountPoolCursor)). Filter("id", row.ID). Update(map[string]interface{}{ "is_extracted": 1, "extracted_time": now, "extracted_platform": platform, }) if err != nil { c.cardErr(500, 500, "提取失败") return } c.cardOK(buildCardResult(&row.Account, &row.Password, row.Token, row.DataType)) } func (c *ApiGetCardController) extractWindsurf(platform, dataType string, now time.Time) { var row models.PlatformAccountPoolWindsurf qs := models.Orm.QueryTable(new(models.PlatformAccountPoolWindsurf)). Filter("is_extracted", 0). Filter("delete_time__isnull", true) if dataType != "" { qs = qs.Filter("data_type", dataType) } if err := qs.OrderBy("id").One(&row); err != nil { if err == orm.ErrNoRows { c.cardErr(404, 404, "暂无可用卡密") } else { c.cardErr(500, 500, "查询失败") } return } _, err := models.Orm.QueryTable(new(models.PlatformAccountPoolWindsurf)). Filter("id", row.ID). Update(map[string]interface{}{ "is_extracted": 1, "extracted_time": now, "extracted_platform": platform, }) if err != nil { c.cardErr(500, 500, "提取失败") return } c.cardOK(buildCardResult(&row.Account, &row.Password, row.Token, row.DataType)) } func (c *ApiGetCardController) extractKrio(platform, dataType string, now time.Time) { var row models.PlatformAccountPoolKiro qs := models.Orm.QueryTable(new(models.PlatformAccountPoolKiro)). Filter("is_extracted", 0). Filter("delete_time__isnull", true) if dataType != "" { qs = qs.Filter("data_type", dataType) } if err := qs.OrderBy("id").One(&row); err != nil { if err == orm.ErrNoRows { c.cardErr(404, 404, "暂无可用卡密") } else { c.cardErr(500, 500, "查询失败") } return } _, err := models.Orm.QueryTable(new(models.PlatformAccountPoolKiro)). Filter("id", row.ID). Update(map[string]interface{}{ "is_extracted": 1, "extracted_time": now, "extracted_platform": platform, }) if err != nil { c.cardErr(500, 500, "提取失败") return } c.cardOK(buildCardResult(&row.Account, &row.Password, row.Token, row.DataType)) } // buildCardResult 根据账号类型返回格式化字符串 func buildCardResult(account, password *string, token string, dataType string) string { acc := "" pwd := "" if account != nil { acc = *account } if password != nil { pwd = *password } switch dataType { case "account": return fmt.Sprintf("账号:%s / 密码:%s", acc, pwd) case "account_tk": return fmt.Sprintf("账号:%s / 密码:%s / Token:%s", acc, pwd, token) default: // tk return token } }