增加提取接口

This commit is contained in:
李志强 2026-04-13 09:24:42 +08:00
parent fa72952f15
commit ccad4c05f7
2 changed files with 211 additions and 0 deletions

207
controllers/api_getcard.go Normal file
View File

@ -0,0 +1,207 @@
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.Data["json"] = map[string]interface{}{"code": code, "msg": msg}
_ = c.ServeJSON()
}
func (c *ApiGetCardController) cardOK(data interface{}) {
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success", "data": data}
_ = c.ServeJSON()
}
// 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) map[string]interface{} {
result := map[string]interface{}{
"type": dataType,
}
acc := ""
pwd := ""
if account != nil {
acc = *account
}
if password != nil {
pwd = *password
}
switch dataType {
case "account":
result["account"] = acc
result["password"] = pwd
case "tk":
result["token"] = token
case "account_tk":
result["account"] = acc
result["password"] = pwd
result["token"] = token
}
return result
}

View File

@ -10,4 +10,8 @@ import (
func Register() { func Register() {
// 客户端检查更新(无需登录) // 客户端检查更新(无需登录)
beego.Router("/api/softwareupgrade/check", &controllers.ApiSoftwareUpgradeController{}, "get:Check") beego.Router("/api/softwareupgrade/check", &controllers.ApiSoftwareUpgradeController{}, "get:Check")
// 对外提卡接口(无需登录)
// GET /api/getcard?type=xianyu&module=cursor&data_type=tk
beego.Router("/api/getcard", &controllers.ApiGetCardController{}, "get:GetCard")
} }