From 2444fc7fd00249403fff56ab8b39f996676892e0 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 14:52:08 -0400 Subject: [PATCH 01/12] Update .env.example --- .env.example | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 131e8bc..b9df749 100644 --- a/.env.example +++ b/.env.example @@ -8,4 +8,7 @@ CAPSOLVER_KEY="" ANTICAPTCHA_KEY="" # API key for capmonster -CAPMONSTER_KEY="" \ No newline at end of file +CAPMONSTER_KEY="" + +# API key for captchaai +CAPTCHAAI_KEY="" \ No newline at end of file From 4bdba74991e658761eb3a18a912fee8e403a5496 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 16:45:31 -0400 Subject: [PATCH 02/12] V2 Solving --- captchatools-go/captchaai.go | 204 ++++++++++++++++++++++++++++++ captchatools-go/captchaai_test.go | 38 ++++++ 2 files changed, 242 insertions(+) create mode 100644 captchatools-go/captchaai.go create mode 100644 captchatools-go/captchaai_test.go diff --git a/captchatools-go/captchaai.go b/captchatools-go/captchaai.go new file mode 100644 index 0000000..f08af5c --- /dev/null +++ b/captchatools-go/captchaai.go @@ -0,0 +1,204 @@ +package captchatoolsgo + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "net/url" + "strconv" + "time" +) + +type CaptchaAi struct { + *Config +} + +func (t CaptchaAi) GetToken(additional ...*AdditionalData) (*CaptchaAnswer, error) { + return t.getCaptchaAnswer(context.Background(), additional...) +} + +func (t CaptchaAi) GetTokenWithContext(ctx context.Context, additional ...*AdditionalData) (*CaptchaAnswer, error) { + return t.getCaptchaAnswer(ctx, additional...) +} + +func (t CaptchaAi) GetBalance() (float32, error) { + return t.getBalance() +} + +// Method to get Queue ID from the API. +func (t CaptchaAi) getID(data *AdditionalData) (string, error) { + // Get Payload + uri, err := t.createUrl(data) + if err != nil { + return "", err + } + + // Make request to get answer + response := &struct { + Status int `json:"status"` + Request int `json:"request"` + }{} + for i := 0; i < 100; i++ { + resp, err := http.Get(uri) + if err != nil { + time.Sleep(3 * time.Second) + continue + } + body, _ := io.ReadAll(resp.Body) + resp.Body.Close() + json.Unmarshal(body, response) + + // Parse the response + if response.Status != 1 { // Means there was an error + // Have to read the error into an interface + temp := make(map[string]string) + json.Unmarshal(body, &temp) + return "", errCodeToError(temp["request"]) + } + return strconv.Itoa(response.Request), nil + } + return "", ErrMaxAttempts +} + +// This method gets the captcha token from the Capmonster API +func (t CaptchaAi) getCaptchaAnswer(ctx context.Context, additional ...*AdditionalData) (*CaptchaAnswer, error) { + var data *AdditionalData = nil + if len(additional) > 0 { + data = additional[0] + } + + // Get Queue ID + queueID, err := t.getID(data) + if err != nil { + return nil, err + } + + // Get Captcha Answer + response := &twocaptchaResponse{} + urlToAnswer := fmt.Sprintf( + "https://ocr.captchaai.com/res.php?key=%v&action=get&id=%v&json=1", + t.Api_key, + queueID, + ) + for i := 0; i < 100; i++ { + req, _ := http.NewRequestWithContext(ctx, "GET", urlToAnswer, nil) + resp, err := makeRequest(req) + if err != nil { + if errors.Is(err, context.DeadlineExceeded) { + return nil, fmt.Errorf("getCaptchaAnswer error: %w", err) + } + time.Sleep(3 * time.Second) + continue + } + + // Parse Response + body, _ := io.ReadAll(resp.Body) + resp.Body.Close() + json.Unmarshal(body, response) + + // Check for any errors + if response.Status == 0 && response.Request != "CAPCHA_NOT_READY" { + return nil, errCodeToError(response.Request) + } + + // Check if captcha is ready + if response.Request == "CAPCHA_NOT_READY" { + time.Sleep(3 * time.Second) + continue + } + return newCaptchaAnswer( + queueID, + response.Request, + t.Api_key, + t.CaptchaType, + TwoCaptchaSite, //TODO change this + "", + ), nil + } + return nil, ErrMaxAttempts +} + +func (t CaptchaAi) getBalance() (float32, error) { + // Attempt to get the balance from the API + // Max attempts is 5 + url := fmt.Sprintf("https://2captcha.com/res.php?key=%v&action=getbalance&json=1", t.Api_key) + response := &twocaptchaResponse{} + for i := 0; i < 5; i++ { + resp, err := http.Get(url) + if err != nil { + time.Sleep(1 * time.Second) + continue + } + + // Parse Response + body, _ := io.ReadAll(resp.Body) + resp.Body.Close() + json.Unmarshal(body, response) + if response.Status == 0 { + return 0, errCodeToError(response.Request) + } + + // Convert to float32 + var balance float32 + value, err := strconv.ParseFloat(response.Request, 32) + if err != nil { + return 0, errors.New("unable to convert balance") + } + balance = float32(value) + return balance, nil + } + return 0, ErrMaxAttempts +} + +/* +createUrl creates the Uri needed to submit data to CaptchaAi + +Possible errors that can be returned: +1) ErrIncorrectCapType +*/ +func (t CaptchaAi) createUrl(data *AdditionalData) (string, error) { + + // Create base uri + u, err := url.Parse("https://ocr.captchaai.com/in.php") + if err != nil { + return "", fmt.Errorf("createUrl error: %w", err) + } + + // Dynamically add queries + query := u.Query() + query.Add("key", t.Api_key) + query.Add("json", "1") + query.Add("pageurl", t.CaptchaURL) + switch t.CaptchaType { + case ImageCaptcha: + case V2Captcha: + query.Add("method", "userrecaptcha") + query.Add("googlekey", t.Sitekey) + if t.IsInvisibleCaptcha { + query.Add("invisible", "1") + } + case V3Captcha: + case HCaptcha: + case CFTurnstile: + // TODO return `Not Supported` eror + default: + return "", ErrIncorrectCapType + } + if data != nil && t.CaptchaType != ImageCaptcha { + if data.UserAgent != "" { + query.Add("userAgent", data.UserAgent) + } + if data.Proxy != nil { + query.Add("proxy", data.Proxy.StringFormatted()) + } + if data.ProxyType != "" { + query.Add("proxytype", data.ProxyType) + } + } + + u.RawQuery = query.Encode() + return u.String(), nil +} diff --git a/captchatools-go/captchaai_test.go b/captchatools-go/captchaai_test.go new file mode 100644 index 0000000..c51ea71 --- /dev/null +++ b/captchatools-go/captchaai_test.go @@ -0,0 +1,38 @@ +package captchatoolsgo + +import ( + "fmt" + "os" + "testing" + + "github.com/joho/godotenv" +) + +// Test getting a recap V2 token +// go test -v -run ^TestCaptchaAiV2$ github.com/Matthew17-21/Captcha-Tools/captchatools-go +func TestCaptchaAiV2(t *testing.T) { + // Load ENV + if err := godotenv.Load("../.env"); err != nil { + t.Fatalf("Failed to load .env file: %v", err) + } + + // Create tests + configs := []Config{ + {Api_key: os.Getenv("CAPTCHAAI_KEY"), Sitekey: "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-", CaptchaURL: "https://www.google.com/recaptcha/api2/demo", CaptchaType: V2Captcha}, + } + // TODO invisible captcha test + + // Run tests + for testNum, config := range configs { + t.Run(fmt.Sprintf("Test #%v", testNum+1), func(t *testing.T) { + h := CaptchaAi{&config} + answer, err := h.GetToken() + if err != nil { + t.Fatalf("Error getting token: %v", err) + } + fmt.Println(answer) + + }) + } + +} From 7daad8cc49ec903aac4aefa639f11ed31c70d122 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 17:00:33 -0400 Subject: [PATCH 03/12] Added invisible captcha test --- captchatools-go/captchaai_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/captchatools-go/captchaai_test.go b/captchatools-go/captchaai_test.go index c51ea71..9d617ea 100644 --- a/captchatools-go/captchaai_test.go +++ b/captchatools-go/captchaai_test.go @@ -19,8 +19,8 @@ func TestCaptchaAiV2(t *testing.T) { // Create tests configs := []Config{ {Api_key: os.Getenv("CAPTCHAAI_KEY"), Sitekey: "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-", CaptchaURL: "https://www.google.com/recaptcha/api2/demo", CaptchaType: V2Captcha}, + {Api_key: os.Getenv("CAPTCHAAI_KEY"), Sitekey: "6LcmDCcUAAAAAL5QmnMvDFnfPTP4iCUYRk2MwC0-", CaptchaURL: "https://recaptcha-demo.appspot.com/recaptcha-v2-invisible.php", CaptchaType: V2Captcha, IsInvisibleCaptcha: true}, } - // TODO invisible captcha test // Run tests for testNum, config := range configs { From b86885b5fe877a4dd5fc348d03f232143a7fbed4 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 17:07:14 -0400 Subject: [PATCH 04/12] V3 Support --- captchatools-go/captchaai.go | 9 +++++++++ captchatools-go/captchaai_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/captchatools-go/captchaai.go b/captchatools-go/captchaai.go index f08af5c..9bf29b5 100644 --- a/captchatools-go/captchaai.go +++ b/captchatools-go/captchaai.go @@ -181,6 +181,15 @@ func (t CaptchaAi) createUrl(data *AdditionalData) (string, error) { query.Add("invisible", "1") } case V3Captcha: + query.Add("method", "userrecaptcha") + query.Add("version", "v3") + query.Add("googlekey", t.Sitekey) + if t.Action != "" { + query.Add("action", t.Action) + } + if t.MinScore > 0 { + query.Add("min_score", fmt.Sprintf("%v", t.MinScore)) + } case HCaptcha: case CFTurnstile: // TODO return `Not Supported` eror diff --git a/captchatools-go/captchaai_test.go b/captchatools-go/captchaai_test.go index 9d617ea..6746cd0 100644 --- a/captchatools-go/captchaai_test.go +++ b/captchatools-go/captchaai_test.go @@ -36,3 +36,31 @@ func TestCaptchaAiV2(t *testing.T) { } } + +// Test getting a recap V3 token +// go test -v -run ^TestCaptchaAiV3$ github.com/Matthew17-21/Captcha-Tools/captchatools-go +func TestCaptchaAiV3(t *testing.T) { + // Load ENV + if err := godotenv.Load("../.env"); err != nil { + t.Fatalf("Failed to load .env file: %v", err) + } + + // Create tests + configs := []Config{ + {Api_key: os.Getenv("CAPTCHAAI_KEY"), Sitekey: "6LcR_okUAAAAAPYrPe-HK_0RULO1aZM15ENyM-Mf", CaptchaURL: "https://antcpt.com/score_detector/", CaptchaType: V3Captcha, Action: "homepage", MinScore: 0.7}, + } + + // Run tests + for testNum, config := range configs { + t.Run(fmt.Sprintf("Test #%v", testNum+1), func(t *testing.T) { + h := CaptchaAi{&config} + answer, err := h.GetToken() + if err != nil { + t.Fatalf("Error getting token: %v", err) + } + fmt.Println(answer) + + }) + } + +} From a873fe7bf965401697246a5256c53450bf2e24df Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 17:14:25 -0400 Subject: [PATCH 05/12] Hcaptcha Support --- captchatools-go/captchaai.go | 8 +++++--- captchatools-go/captchaai_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/captchatools-go/captchaai.go b/captchatools-go/captchaai.go index 9bf29b5..df5d03a 100644 --- a/captchatools-go/captchaai.go +++ b/captchatools-go/captchaai.go @@ -173,7 +173,7 @@ func (t CaptchaAi) createUrl(data *AdditionalData) (string, error) { query.Add("json", "1") query.Add("pageurl", t.CaptchaURL) switch t.CaptchaType { - case ImageCaptcha: + case ImageCaptcha: // TODO case V2Captcha: query.Add("method", "userrecaptcha") query.Add("googlekey", t.Sitekey) @@ -191,8 +191,10 @@ func (t CaptchaAi) createUrl(data *AdditionalData) (string, error) { query.Add("min_score", fmt.Sprintf("%v", t.MinScore)) } case HCaptcha: - case CFTurnstile: - // TODO return `Not Supported` eror + query.Add("method", "hcaptcha") + query.Add("sitekey", t.Sitekey) + + case CFTurnstile: // TODO return `Not Supported` eror default: return "", ErrIncorrectCapType } diff --git a/captchatools-go/captchaai_test.go b/captchatools-go/captchaai_test.go index 6746cd0..42bd3e7 100644 --- a/captchatools-go/captchaai_test.go +++ b/captchatools-go/captchaai_test.go @@ -64,3 +64,31 @@ func TestCaptchaAiV3(t *testing.T) { } } + +// Test getting a recap V3 token +// go test -v -run ^TestCaptchaAiHCap$ github.com/Matthew17-21/Captcha-Tools/captchatools-go +func TestCaptchaAiHCap(t *testing.T) { + // Load ENV + if err := godotenv.Load("../.env"); err != nil { + t.Fatalf("Failed to load .env file: %v", err) + } + + // Create tests + configs := []Config{ + {Api_key: os.Getenv("CAPTCHAAI_KEY"), Sitekey: "a5f74b19-9e45-40e0-b45d-47ff91b7a6c2", CaptchaURL: "https://accounts.hcaptcha.com/demo", CaptchaType: HCaptcha}, + } + + // Run tests + for testNum, config := range configs { + t.Run(fmt.Sprintf("Test #%v", testNum+1), func(t *testing.T) { + h := CaptchaAi{&config} + answer, err := h.GetToken() + if err != nil { + t.Fatalf("Error getting token: %v", err) + } + fmt.Println(answer) + + }) + } + +} From f4b70dee28addd9555b3c8b429fdcf1cc14543e7 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 17:21:40 -0400 Subject: [PATCH 06/12] Image Captcha support --- captchatools-go/captchaai.go | 4 ++++ captchatools-go/captchaai_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/captchatools-go/captchaai.go b/captchatools-go/captchaai.go index df5d03a..e131a3b 100644 --- a/captchatools-go/captchaai.go +++ b/captchatools-go/captchaai.go @@ -174,6 +174,10 @@ func (t CaptchaAi) createUrl(data *AdditionalData) (string, error) { query.Add("pageurl", t.CaptchaURL) switch t.CaptchaType { case ImageCaptcha: // TODO + query.Add("method", "base64") + if data != nil && data.B64Img != "" { + query.Add("body", data.B64Img) + } case V2Captcha: query.Add("method", "userrecaptcha") query.Add("googlekey", t.Sitekey) diff --git a/captchatools-go/captchaai_test.go b/captchatools-go/captchaai_test.go index 42bd3e7..99f9c9d 100644 --- a/captchatools-go/captchaai_test.go +++ b/captchatools-go/captchaai_test.go @@ -92,3 +92,32 @@ func TestCaptchaAiHCap(t *testing.T) { } } + +// Test getting a Image captcha +// go test -v -run ^TestCaptchaAiNormalCap$ github.com/Matthew17-21/Captcha-Tools/captchatools-go +func TestCaptchaAiNormalCap(t *testing.T) { + // Load ENV + if err := godotenv.Load("../.env"); err != nil { + t.Fatalf("Failed to load .env file: %v", err) + } + + // Create tests + configs := []Config{ + {Api_key: os.Getenv("CAPTCHAAI_KEY"), CaptchaType: ImageCaptcha}, + } + + // Run tests + for testNum, config := range configs { + t.Run(fmt.Sprintf("Test #%v", testNum+1), func(t *testing.T) { + h := CaptchaAi{&config} + answer, err := h.GetToken(&AdditionalData{ + B64Img: "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", + }) + if err != nil { + t.Fatalf("Error getting token: %v", err) + } + fmt.Println(answer) + }) + } + +} From 014da6e16f565353f9320836be57cf712f69bfc0 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 17:24:57 -0400 Subject: [PATCH 07/12] Get balance support --- captchatools-go/captchaai.go | 2 +- captchatools-go/captchaai_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/captchatools-go/captchaai.go b/captchatools-go/captchaai.go index e131a3b..44f1465 100644 --- a/captchatools-go/captchaai.go +++ b/captchatools-go/captchaai.go @@ -124,7 +124,7 @@ func (t CaptchaAi) getCaptchaAnswer(ctx context.Context, additional ...*Addition func (t CaptchaAi) getBalance() (float32, error) { // Attempt to get the balance from the API // Max attempts is 5 - url := fmt.Sprintf("https://2captcha.com/res.php?key=%v&action=getbalance&json=1", t.Api_key) + url := fmt.Sprintf("https://ocr.captchaai.com/res.php?key=%v&action=getbalance&json=1", t.Api_key) response := &twocaptchaResponse{} for i := 0; i < 5; i++ { resp, err := http.Get(url) diff --git a/captchatools-go/captchaai_test.go b/captchatools-go/captchaai_test.go index 99f9c9d..4b5c07e 100644 --- a/captchatools-go/captchaai_test.go +++ b/captchatools-go/captchaai_test.go @@ -121,3 +121,30 @@ func TestCaptchaAiNormalCap(t *testing.T) { } } + +// Test getting balance info +// go test -v -run ^TestCaptchaAiGetBalance$ github.com/Matthew17-21/Captcha-Tools/captchatools-go +func TestCaptchaAiGetBalance(t *testing.T) { + // Load ENV + if err := godotenv.Load("../.env"); err != nil { + t.Fatalf("Failed to load .env file: %v", err) + } + + // Create tests + configs := []Config{ + {Api_key: os.Getenv("CAPTCHAAI_KEY"), CaptchaType: ImageCaptcha}, + } + + // Run tests + for testNum, config := range configs { + t.Run(fmt.Sprintf("Test #%v", testNum+1), func(t *testing.T) { + h := CaptchaAi{&config} + balance, err := h.GetBalance() + if err != nil { + t.Fatalf("Error getting balance: %v", err) + } + fmt.Println(balance) + }) + } + +} From f042e4be59959bdf21b849696df72a8906ca3f96 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 17:29:35 -0400 Subject: [PATCH 08/12] Return CFTurnstile not supported --- captchatools-go/captchaai.go | 5 +++-- captchatools-go/errors.go | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/captchatools-go/captchaai.go b/captchatools-go/captchaai.go index 44f1465..9302d8a 100644 --- a/captchatools-go/captchaai.go +++ b/captchatools-go/captchaai.go @@ -173,7 +173,7 @@ func (t CaptchaAi) createUrl(data *AdditionalData) (string, error) { query.Add("json", "1") query.Add("pageurl", t.CaptchaURL) switch t.CaptchaType { - case ImageCaptcha: // TODO + case ImageCaptcha: query.Add("method", "base64") if data != nil && data.B64Img != "" { query.Add("body", data.B64Img) @@ -198,7 +198,8 @@ func (t CaptchaAi) createUrl(data *AdditionalData) (string, error) { query.Add("method", "hcaptcha") query.Add("sitekey", t.Sitekey) - case CFTurnstile: // TODO return `Not Supported` eror + case CFTurnstile: + return "", ErrNotSupported default: return "", ErrIncorrectCapType } diff --git a/captchatools-go/errors.go b/captchatools-go/errors.go index b8cf441..c8366e7 100644 --- a/captchatools-go/errors.go +++ b/captchatools-go/errors.go @@ -28,6 +28,7 @@ var ( ErrMissingValues = errors.New("some of the required values for successive user emulation are missing") ErrAddionalDataMissing = errors.New("additional data is missing. Refer to guide") ErrProxyEmpty = errors.New("proxy is blank") + ErrNotSupported = errors.New("captcha type not supported") ) // errCodeToError converts an error ID returned from the site and From d0174ab3e29faf757efe56472d9a57b6b64e48b2 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 17:35:33 -0400 Subject: [PATCH 09/12] Added CaptchaAI to harvesters --- captchatools-go/common.go | 1 + captchatools-go/harvester.go | 2 ++ 2 files changed, 3 insertions(+) diff --git a/captchatools-go/common.go b/captchatools-go/common.go index bd03585..0230e0e 100644 --- a/captchatools-go/common.go +++ b/captchatools-go/common.go @@ -6,6 +6,7 @@ const ( AnticaptchaSite // The int 2 will represent Anticaptcha TwoCaptchaSite // The int 3 will represent 2captcha CapsolverSite + CaptchaAiSite ) const ( diff --git a/captchatools-go/harvester.go b/captchatools-go/harvester.go index ea6f9af..76a96e7 100644 --- a/captchatools-go/harvester.go +++ b/captchatools-go/harvester.go @@ -76,6 +76,8 @@ func NewHarvester(solving_site site, config *Config) (Harvester, error) { h = &Twocaptcha{config: config} case CapsolverSite: h = &Capsolver{config} + case CaptchaAiSite: + h = &CaptchaAi{config} default: return nil, ErrNoHarvester } From c8fad70eb02a609e35027d313e243b0023bc3bef Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 17:35:47 -0400 Subject: [PATCH 10/12] Fix CaptchaAI answer being same as 2cap --- captchatools-go/captchaai.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/captchatools-go/captchaai.go b/captchatools-go/captchaai.go index 9302d8a..6d04f7e 100644 --- a/captchatools-go/captchaai.go +++ b/captchatools-go/captchaai.go @@ -114,7 +114,7 @@ func (t CaptchaAi) getCaptchaAnswer(ctx context.Context, additional ...*Addition response.Request, t.Api_key, t.CaptchaType, - TwoCaptchaSite, //TODO change this + CaptchaAiSite, "", ), nil } From b455bdf1bebd59f90d8b658af5631ed40efba910 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 17:37:20 -0400 Subject: [PATCH 11/12] Update README --- captchatools-go/README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/captchatools-go/README.md b/captchatools-go/README.md index 50ac50b..da55c97 100644 --- a/captchatools-go/README.md +++ b/captchatools-go/README.md @@ -263,16 +263,16 @@ func addtional_data() { - **[Capsolver](https://capsolver.com/)** ### Site-Specific Support: -| Captcha Type |2Captcha | Anticaptcha | Capmonster| Capsolver | -| :-------------: |:-------------:| :-----:| :-----:| :-----:| -| Recaptcha V2 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| Recaptcha V3 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| Hcaptcha | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| Image Captcha | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| Cloudflare Turnstile | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| Funcaptcha |:x: | :x: | :x: | :x: | -| GeeTest |:x: | :x: | :x: | :x: | -| Amazon WAF |:x: | :x: | :x: | :x: | +| Captcha Type |2Captcha | Anticaptcha | Capmonster| Capsolver | CaptchaAI| +| :-------------: |:-------------:| :-----:| :-----:| :-----:| :-----:| +| Recaptcha V2 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Recaptcha V3 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Hcaptcha | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Image Captcha | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Cloudflare Turnstile | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| Funcaptcha |:x: | :x: | :x: | :x: | :x: | +| GeeTest |:x: | :x: | :x: | :x: | :x: | +| Amazon WAF |:x: | :x: | :x: | :x: | :x: | From 38b7110d7482152b7c785894d0eace0fd1233c6f Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 17 Aug 2023 17:39:02 -0400 Subject: [PATCH 12/12] Update README.md --- captchatools-go/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/captchatools-go/README.md b/captchatools-go/README.md index da55c97..24d30ef 100644 --- a/captchatools-go/README.md +++ b/captchatools-go/README.md @@ -261,6 +261,7 @@ func addtional_data() { - **[2Captcha](https://www.2captcha.com/)** - **[Anticaptcha](https://www.anti-captcha.com/)** - **[Capsolver](https://capsolver.com/)** +- **[CaptchaAI](https://captchaai.com/)** ### Site-Specific Support: | Captcha Type |2Captcha | Anticaptcha | Capmonster| Capsolver | CaptchaAI|