7 changed files with 240 additions and 5 deletions
@ -0,0 +1 @@ |
|||||
|
package captchasolver |
@ -0,0 +1,103 @@ |
|||||
|
package captchasolver |
||||
|
|
||||
|
import ( |
||||
|
"io" |
||||
|
"log" |
||||
|
"net/http" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
func Provider2CaptchaCreateCaptchaRequestV3(apiKey string, url string, googleKey string, googleAction string) string { |
||||
|
client := &http.Client{} |
||||
|
req, err := http.NewRequest("GET", "https://2captcha.com/in.php", nil) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
q := req.URL.Query() |
||||
|
q.Add("key", apiKey) |
||||
|
q.Add("method", "userrecaptcha") |
||||
|
q.Add("version", "3") |
||||
|
q.Add("action", googleAction) |
||||
|
q.Add("min_score", "0.3") |
||||
|
q.Add("googlekey", googleKey) |
||||
|
q.Add("pageurl", url) |
||||
|
req.URL.RawQuery = q.Encode() |
||||
|
|
||||
|
res, err := client.Do(req) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
respBody, _ := io.ReadAll(res.Body) |
||||
|
respBodyStr := string(respBody) |
||||
|
|
||||
|
return respBodyStr[3:] |
||||
|
} |
||||
|
|
||||
|
func Provider2CaptchaCreateCaptchaRequestV2(apiKey string, url string, googleKey string) string { |
||||
|
client := &http.Client{} |
||||
|
req, err := http.NewRequest("GET", "https://2captcha.com/in.php", nil) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
q := req.URL.Query() |
||||
|
q.Add("key", apiKey) |
||||
|
q.Add("method", "userrecaptcha") |
||||
|
q.Add("googlekey", googleKey) |
||||
|
q.Add("pageurl", url) |
||||
|
req.URL.RawQuery = q.Encode() |
||||
|
|
||||
|
res, err := client.Do(req) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
respBody, _ := io.ReadAll(res.Body) |
||||
|
respBodyStr := string(respBody) |
||||
|
|
||||
|
return respBodyStr[3:] |
||||
|
} |
||||
|
|
||||
|
func Provider2CaptchaGetCaptchaResult(apiKey string, captchaID string) string { |
||||
|
client := &http.Client{} |
||||
|
|
||||
|
req, err := http.NewRequest("GET", "http://2captcha.com/res.php", nil) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
q := req.URL.Query() |
||||
|
q.Add("key", apiKey) |
||||
|
q.Add("action", "get") |
||||
|
q.Add("id", captchaID) |
||||
|
req.URL.RawQuery = q.Encode() |
||||
|
|
||||
|
res, err := client.Do(req) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
respBody, _ := io.ReadAll(res.Body) |
||||
|
respBodyStr := string(respBody) |
||||
|
|
||||
|
return respBodyStr |
||||
|
} |
||||
|
|
||||
|
func Provider2CaptchaV2E2E(apiKey string, url string, dataSiteKey string) string { |
||||
|
captchaReqID := Provider2CaptchaCreateCaptchaRequestV2(apiKey, url, dataSiteKey) |
||||
|
log.Println(captchaReqID) |
||||
|
captchaAnswer := "CAPCHA_NOT_READY" |
||||
|
for captchaAnswer == "CAPCHA_NOT_READY" { |
||||
|
time.Sleep(500 * time.Millisecond) |
||||
|
captchaAnswer = Provider2CaptchaGetCaptchaResult(apiKey, captchaReqID) |
||||
|
} |
||||
|
log.Printf("Captcha ID: %s; Captcha Answer: %s\n", captchaReqID, captchaAnswer) |
||||
|
captchaAnswer = captchaAnswer[3:] |
||||
|
|
||||
|
return captchaAnswer |
||||
|
} |
@ -0,0 +1,102 @@ |
|||||
|
package captchasolver |
||||
|
|
||||
|
import ( |
||||
|
"encoding/json" |
||||
|
"fmt" |
||||
|
"io" |
||||
|
"log" |
||||
|
"net/http" |
||||
|
"net/url" |
||||
|
"strings" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
func ProviderDeathByCaptchaCreateCaptchaRequestV2(deathByCaptchaUsername string, deathByCaptchaPassword string, captchaUrl string, googleKey string) string { |
||||
|
httpClient := http.Client{} |
||||
|
|
||||
|
formValues := url.Values{ |
||||
|
"username": {deathByCaptchaUsername}, |
||||
|
"password": {deathByCaptchaPassword}, |
||||
|
"type": {"4"}, |
||||
|
"token_params": {fmt.Sprintf(`{"proxy": "", "proxytype": "", "googlekey": "%s","pageurl": "%s"}`, googleKey, captchaUrl)}, |
||||
|
} |
||||
|
req, err := http.NewRequest("POST", "http://api.dbcapi.me/api/captcha", strings.NewReader(formValues.Encode())) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
req.Header.Add("Content-Type", "application/x-www-form-urlencoded") |
||||
|
req.Header.Add("Accept", "application/json") |
||||
|
req.Header.Add("Expect", "") |
||||
|
|
||||
|
resp, err := httpClient.Do(req) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
respBody, err := io.ReadAll(resp.Body) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
var resBodyJson map[string]any |
||||
|
err = json.Unmarshal(respBody, &resBodyJson) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
if _, exists := resBodyJson["captcha"]; !exists { |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
captchaIDFloat := resBodyJson["captcha"].(float64) |
||||
|
captchaID := int(captchaIDFloat) |
||||
|
captchaIDStr := fmt.Sprintf("%d", captchaID) |
||||
|
|
||||
|
return captchaIDStr |
||||
|
} |
||||
|
|
||||
|
func ProviderDeathByCaptchaGetCaptchaResult(captchaID string) string { |
||||
|
client := &http.Client{} |
||||
|
|
||||
|
req, err := http.NewRequest("GET", fmt.Sprintf("http://api.dbcapi.me/api/captcha/%s", captchaID), nil) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
req.Header.Add("Accept", "application/json") |
||||
|
res, err := client.Do(req) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
respBody, _ := io.ReadAll(res.Body) |
||||
|
var resBodyJson map[string]any |
||||
|
err = json.Unmarshal(respBody, &resBodyJson) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
return "" |
||||
|
} |
||||
|
if _, exists := resBodyJson["text"]; !exists { |
||||
|
return "" |
||||
|
} |
||||
|
|
||||
|
return resBodyJson["text"].(string) |
||||
|
} |
||||
|
|
||||
|
func ProviderDeathByCaptchaV2E2E(deathByCaptchaUsername string, deathByCaptchaPassword string, url string, dataSiteKey string) string { |
||||
|
captchaReqID := ProviderDeathByCaptchaCreateCaptchaRequestV2(deathByCaptchaUsername, deathByCaptchaPassword, url, dataSiteKey) |
||||
|
log.Println(captchaReqID) |
||||
|
captchaAnswer := "" |
||||
|
for captchaAnswer == "" { |
||||
|
time.Sleep(500 * time.Millisecond) |
||||
|
captchaAnswer = ProviderDeathByCaptchaGetCaptchaResult(captchaReqID) |
||||
|
} |
||||
|
log.Printf("Captcha ID: %s; Captcha Answer: %s\n", captchaReqID, captchaAnswer) |
||||
|
|
||||
|
return captchaAnswer |
||||
|
} |
Loading…
Reference in new issue