diff --git a/api/AntiGateV2.go b/api/AntiGateV2.go index 76f582b..95fc526 100644 --- a/api/AntiGateV2.go +++ b/api/AntiGateV2.go @@ -115,19 +115,20 @@ func (a *antigateV2Api) getTaskResult(request struct { response.Status = "ready" response.EndTime = &task.EndTime response.Cost = task.Entity.Cost - switch task.Result.(type) { + switch result := task.Result.(type) { case *sati.ReCaptcha2Result: response.Solution = struct { GRecaptchaResponse string `json:"gRecaptchaResponse"` - }{task.Result.(*sati.ReCaptcha2Result).Token} + }{result.Token} case *sati.TurnstileResult: response.Solution = struct { Token string `json:"token"` UserAgent string `json:"userAgent"` - }{ - task.Result.(*sati.TurnstileResult).Token, - a.ctx.Config.AntiGateV2.TurnstileUserAgent, - } + }{result.Token, a.ctx.Config.AntiGateV2.TurnstileUserAgent} + case *sati.FunCaptchaResult: + response.Solution = struct { + Token string `json:"token"` + }{result.Token} default: return errorTaskNotSupported } @@ -169,6 +170,18 @@ func (a *antigateV2Api) createTask(request struct { PageUrl: task.WebsiteURL, SiteKey: task.WebsiteKey, }) + case "FunCaptchaTask", "FunCaptchaTaskProxyless": + var task struct { + WebsiteURL string `json:"websiteURL"` + WebsitePublicKey string `json:"websitePublicKey"` + Data map[string]string `json:"data"` + } + mapstructure.Decode(request.Task, &task) + id = a.ctx.Registry.CreateTask(&sati.FunCaptchaTask{ + PageUrl: task.WebsiteURL, + SiteKey: task.WebsitePublicKey, + Data: task.Data, + }) default: return errorTaskNotSupported } diff --git a/api/RuCaptcha.go b/api/RuCaptcha.go index f1c1f5e..b083768 100644 --- a/api/RuCaptcha.go +++ b/api/RuCaptcha.go @@ -72,6 +72,24 @@ type okResponse simpleResponse func (r *okResponse) text() string { return "OK|" + r.Request } +func parsePhpAssociativeArray(values map[string][]string, arrayName string) map[string]string { + result := make(map[string]string) + prefix := arrayName + "[" + suffix := "]" + + for key, values := range values { + if strings.HasPrefix(key, prefix) && strings.HasSuffix(key, suffix) && len(values) > 0 { + result[key[len(prefix):len(key)-len(suffix)]] = values[0] + } + } + + if len(result) == 0 { + return nil + } + + return result +} + func (a *ruCaptchaApi) endpointIn(params url.Values) ruCaptchaResponse { var id uint32 switch params.Get("method") { @@ -125,6 +143,26 @@ func (a *ruCaptchaApi) endpointIn(params url.Values) ruCaptchaResponse { Action: action, CData: cData, }) + case "funcaptcha": + siteKey := params.Get("publickey") + pageUrl := params.Get("pageurl") + data := parsePhpAssociativeArray(params, "data") + if siteKey == "" || pageUrl == "" { + return &simpleResponse{0, "ERROR_BAD_PARAMETERS"} + } + + var serviceUrl *string + if params.Has("surl") { + val := params.Get("surl") + serviceUrl = &val + } + + id = a.ctx.Registry.CreateTask(&sati.FunCaptchaTask{ + SiteKey: siteKey, + PageUrl: pageUrl, + ServiceUrl: serviceUrl, + Data: data, + }) default: return &simpleResponse{0, "ERROR_ZERO_CAPTCHA_FILESIZE"} } @@ -143,11 +181,13 @@ func (r *get2Response) text() string { } func (a *ruCaptchaApi) convertTaskResult(task *Task) string { - switch task.Result.(type) { + switch result := task.Result.(type) { case *sati.ReCaptcha2Result: - return task.Result.(*sati.ReCaptcha2Result).Token + return result.Token case *sati.TurnstileResult: - return task.Result.(*sati.TurnstileResult).Token + return result.Token + case *sati.FunCaptchaResult: + return result.Token } a.ctx.Logger.WithFields(logrus.Fields{ diff --git a/go.mod b/go.mod index d3c76f4..4491d2e 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module git.sati.ac/sati.ac/bridge go 1.20 -require git.sati.ac/sati.ac/sati-go v0.0.0-20230630184329-03a405a25122 +require git.sati.ac/sati.ac/sati-go v0.0.0-20230713145537-57719018ca00 require ( github.com/gorilla/websocket v1.5.0 // indirect diff --git a/go.sum b/go.sum index 6dfa06d..573f90a 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ git.sati.ac/sati.ac/sati-go v0.0.0-20230629103120-de6961c4f6ec h1:DHmxYp62PfGP+j git.sati.ac/sati.ac/sati-go v0.0.0-20230629103120-de6961c4f6ec/go.mod h1:dsLvwV5+2YUjWRAuTYFf/EMvoH/twUu/NWA0t5Yl3pQ= git.sati.ac/sati.ac/sati-go v0.0.0-20230630184329-03a405a25122 h1:Uff2QZeRDk+3cm3cN9tUiUoT2VoKcwbIf32wYgYSUNU= git.sati.ac/sati.ac/sati-go v0.0.0-20230630184329-03a405a25122/go.mod h1:dsLvwV5+2YUjWRAuTYFf/EMvoH/twUu/NWA0t5Yl3pQ= +git.sati.ac/sati.ac/sati-go v0.0.0-20230713145537-57719018ca00 h1:emjsk5AubG3EiCbiG0WAG6xAZXoNNwO/yteYj/J0TqA= +git.sati.ac/sati.ac/sati-go v0.0.0-20230713145537-57719018ca00/go.mod h1:dsLvwV5+2YUjWRAuTYFf/EMvoH/twUu/NWA0t5Yl3pQ= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=