Compare commits
1 Commits
master
...
anticaptch
Author | SHA1 | Date |
---|---|---|
Pedro de Oliveira Guedes | 1eba2aea9e |
|
@ -1,6 +1,8 @@
|
||||||
|
from asyncio.windows_events import NULL
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
import requests
|
import requests
|
||||||
|
import urllib
|
||||||
|
|
||||||
class AntiCaptcha:
|
class AntiCaptcha:
|
||||||
"""
|
"""
|
||||||
|
@ -11,28 +13,106 @@ class AntiCaptcha:
|
||||||
|
|
||||||
ep: str = ""
|
ep: str = ""
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self):
|
||||||
self.ep = "https://localhost:8443"
|
self.ep = "https://localhost:8443"
|
||||||
|
|
||||||
def __request_json_post__ (self, path: str, object: dict):
|
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.
|
|
||||||
|
|
||||||
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
|
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.
|
||||||
print("Calling: " + url)
|
"""
|
||||||
|
|
||||||
|
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')
|
def recaptcha_v2 (self, site: str, data_sitekey: str):
|
||||||
headers = {"X-API-KEY": apikey}
|
"""
|
||||||
res = requests.post(url, json = object, headers = headers, verify = False)
|
## Recaptcha V2
|
||||||
|
Este método realiza a quebra de Captchas do tipo V2.
|
||||||
|
|
||||||
if res.status_code >= 400:
|
- Exemplo de site com Captcha V2: https://2captcha.com/demo/recaptcha-v2
|
||||||
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:
|
#### Parâmetros:
|
||||||
return json.loads(res.text)
|
- site: Endereço (url) do site que se quer quebrar o Captcha
|
||||||
else:
|
- data_sitekey: Atributo data-sitekey presente no Captcha da página
|
||||||
return res.text
|
- 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)
|
||||||
|
|
Loading…
Reference in New Issue