diff --git a/api/anticaptcha/cli.py b/api/anticaptcha/cli.py index 251604b..f582d69 100644 --- a/api/anticaptcha/cli.py +++ b/api/anticaptcha/cli.py @@ -1,6 +1,8 @@ +from asyncio.windows_events import NULL import os import json import requests +import urllib class AntiCaptcha: """ @@ -11,28 +13,106 @@ class AntiCaptcha: ep: str = "" - def __init__(self) -> None: + def __init__(self): self.ep = "https://localhost:8443" - def __request_json_post__ (self, path: str, object: dict): - """ - ## HTTP JSON POST - --- - Este método é responsável por realizar requisições HTTP do tipo POST para objetos JSON. + def __request_json_post__(self, path: str, object: dict): - Ele retorna o corpo de resposta da requisição, ou uma mensagem de erro, que indica qual foi a irregularidade ocorrida ao chamar a API. - """ + """ + ## HTTP JSON POST + --- + Este método é responsável por realizar requisições HTTP do tipo POST para objetos JSON. - url = self.ep + path - print("Calling: " + url) + Ele retorna o corpo de resposta da requisição, ou uma mensagem de erro, que indica qual foi a irregularidade ocorrida ao chamar a API. + """ + + url = self.ep + path + print("Calling: " + url) + + apikey = os.environ.get('REPLAY_APIKEY') + headers = {"X-API-KEY": apikey} + res = requests.post(url, json = object, headers = headers, verify = False) + + if res.status_code >= 400: + raise Exception(f"HTTP ERROR: {str(res.status_code)} - {res.text}") + if res.headers.get("Content-Type") != None and res.headers.get("Content-Type").find("json") != -1: + return json.loads(res.text) + else: + return res.text - apikey = os.environ.get('REPLAY_APIKEY') - headers = {"X-API-KEY": apikey} - res = requests.post(url, json = object, headers = headers, verify = False) + def recaptcha_v2 (self, site: str, data_sitekey: str): + """ + ## Recaptcha V2 + Este método realiza a quebra de Captchas do tipo V2. - if res.status_code >= 400: - raise Exception(f"HTTP ERROR: {str(res.status_code)} - {res.text}") - if res.headers.get("Content-Type") != None and res.headers.get("Content-Type").find("json") != -1: - return json.loads(res.text) - else: - return res.text \ No newline at end of file + - Exemplo de site com Captcha V2: https://2captcha.com/demo/recaptcha-v2 + --- + #### Parâmetros: + - site: Endereço (url) do site que se quer quebrar o Captcha + - data_sitekey: Atributo data-sitekey presente no Captcha da página + - Para encontrar este atributo, é possível utilizar a função Eval do Chrome com o comando: + + 'document.getElementById("g-recaptcha").getAttribute("data-sitekey")' + + --- + #### Retorna: + -> Solução do Captcha. Deve ser inserido no campo oculto do captcha na página. + - Para encontrar o campo oculto, pode-se utilizar o comando: + + 'document.getElementById("g-recaptcha-response")' + """ + + site = urllib.parse.quote (site, "") + + object = { + "Site": site, + "Data": data_sitekey, + "Img": "", + "To": 300 + } + + return self.__request_json_post__ ("/ipc/anticaptcha/recaptchav2", object) + + def image2text (self, site: str, img_b64: str): + """ + ## Image to text + Este método realiza a quebra de Captchas de imagem. + + - Exemplo de site com Captcha de Imagem: https://seguro.cesgranrio.org.br/login.aspx + --- + #### Parâmetros: + - site: Endereço (url) do site que se quer quebrar o Captcha + - img_b64: Imagem contendo o Captcha codificada em Base64. Não há forma simples e bem definida para conseguir isso, mas o código DOM JS abaixo talvez ajude: + + 'let img = document.getElementById("ImgCapcha1"); + + var canvas = document.createElement('CANVAS'); + + var ctx = canvas.getContext('2d'); + + var dataURL; + + canvas.height = img.naturalHeight; + + canvas.width = img.naturalWidth; + + ctx.drawImage(img, 0, 0); + + dataURL = canvas.toDataURL(); + + dataURL.split(",")[1]' + + --- + #### Retorna: + -> Solução do Captcha. Deve ser inserido no campo de resposta do Captcha para prosseguir. + """ + + site = urllib.parse.quote (site, "") + + object = { + "Site": site, + "Img": img_b64, + "To": 300 + } + + return self.__request_json_post__ ("/ipc/anticaptcha/image2text", object)