prefácio
A quarta geração de experiência extrema parece ser muito mais simples, sem nenhuma habilidade, a parte ambiental ganhou diretamente em 5 minutos.
URL: aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vYWRhcHRpdmUtY2FwdGNoYS1kZW1v
1. Análise
Vá diretamente para o site oficial, deslize o controle deslizante para abrir o console e você
verá que há uma solicitação de verificação. A solicitação retornada por ele deve ser o local para enviar a distância móvel. Em seguida, observe quais dados são enviados, e você pode ver o extremo O teste antigo ainda é o parâmetro w. (Outros parâmetros podem ser obtidos na solicitação de carregamento, então não vou entrar em detalhes aqui, os leitores podem ir e ver por si mesmos)
Abra o iniciador, suba para a pilha e esta etapa é quase a mesma
. w parâmetro que queremos
. Olhando para o acima, o método de chamada de r é dado diretamente desta forma. Agora siga e olhe para ele. Este método
pode ver os dois parâmetros passados. O primeiro parâmetro é obviamente a informação do movimento distância e tempo. Independentemente disso, olhe o segundo parâmetro, isso é um objeto, e não há como copiá-lo diretamente (sou muito preguiçoso, tenho que baixá-lo, clique duas vezes no segundo parâmetro, você pode descobrir que neste método r, apenas um de seus valores é usado)
Podemos copiar este valor (isso seria muito confortável), e aqui, a entrada de parâmetros é basicamente clara.
A seguir, não se preocupe, crie o ambiente, economize tempo, então começaremos a observar seu js diretamente, podemos descobrir que é um js inteiro carregado e depois mexer nele, isso não está certo, apenas pegue tudo para baixo, um garanhão.
Depois de derrubá-lo, o Xiaomo alterou o código e analisamos diretamente, aqui é necessário apenas um valor de t, então é só passar esse valor como parâmetro.
Em seguida, exporte o r inteiro e pronto.
Em seguida, é claro, em vez de executá-lo diretamente localmente, jogue-o no navegador para ver se o código pode ser executado normalmente. O valor é normal, e aí esse parâmetro pode ser passado na requisição (não vou demonstrar aqui, é perda de tempo)
Depois é claro que é jogado direto no nosso nodejs para construir.
window=global;
document={
};
better_proxy = function (o, callerName){
return new Proxy(o, {
set(target, property, value){
console.table([{
"类型":"set-->","调用者":callerName,"属性":property,"值":value}]);
return Reflect.set(...arguments);
},
get(target, property, receiver){
console.table([{
"类型":"get<--","调用者":callerName,"属性":property,"值":target[property]}]);
return Reflect.get(...arguments);
},
}
);
}
window = better_proxy(window, "window")
document = better_proxy(document, "document")
Aqui está um proxy simples para você, assim que criar um objeto (o método é um pouco estúpido, mas não precisa pensar muito, basta preenchê-lo sem pensar). .
A seguir estão os dois que adicionei casualmente: Sempre que adicionar um objeto, lembre-se de adicionar um proxy a ele.
window=global;
document={
};
better_proxy = function (o, callerName){
return new Proxy(o, {
set(target, property, value){
console.table([{
"类型":"set-->","调用者":callerName,"属性":property,"值":value}]);
return Reflect.set(...arguments);
},
get(target, property, receiver){
console.table([{
"类型":"get<--","调用者":callerName,"属性":property,"值":target[property]}]);
return Reflect.get(...arguments);
},
}
);
}
window = better_proxy(window, "window")
document = better_proxy(document, "document")
window.location = {
"ancestorOrigins": {
},
"href": "https://www.geetest.com/adaptive-captcha-demo",
"origin": "https://www.geetest.com",
"protocol": "https:",
"host": "www.geetest.com",
"hostname": "www.geetest.com",
"port": "",
"pathname": "/adaptive-captcha-demo",
"search": "",
"hash": ""
};
window.navigator= {
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
appName:'Netscape'
}
document.body = {
}
document.head = {
}
document.documentElement = {
}
window.location = better_proxy(window.location, "window.location")
window.navigator = better_proxy(window.navigator, "window.navigator")
document.body = better_proxy(document.body, "document.body")
document.documentElement = better_proxy(document.documentElement, "document.documentElement")
Na verdade, todos os suplementos acima estão quase prontos, faltando o último (faça você mesmo), parece que não é muito bom dar todos.
O resultado é o seguinte:
não fale sobre nenhuma confusão, apenas invente violentamente, mas, existem tantos segundos parâmetros, todos eles são usados para criptografia?
Como uma pessoa preguiçosa, coloquei diretamente um agente nele e você pode ver que um pt é usado para tantos, então apenas dê um pt e pronto.
Neste ponto, este experimento extremo 4 acabou.
Dois, verificação
Então acabou, vamos jogar sem verificação, volte para a solicitação de carregamento anterior e você pode ver que muitos parâmetros são exigidos pela solicitação de verificação. Ele também contém a imagem de fundo do código de verificação e a imagem da lacuna do código de verificação.
Peça ao carteiro para convertê-lo em python e, em seguida, podemos executar a próxima etapa, o reconhecimento da lacuna do código de verificação.
Usei o código do grandalhão abaixo.
Como usar python para identificar a lacuna na verificação do slider code_python
import cv2
def identify_gap(bg,tp,out):
'''
bg: 背景图片
tp: 缺口图片
out:输出图片
'''
# 读取背景图片和缺口图片
bg_img = cv2.imread(bg) # 背景图片
tp_img = cv2.imread(tp) # 缺口图片
# 识别图片边缘
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
# 转换图片格式
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
# 缺口匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
# 绘制方框
th, tw = tp_pic.shape[:2]
tl = max_loc # 左上角点的坐标
br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标
cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
cv2.imwrite(out, bg_img) # 保存在本地
# 返回缺口的X坐标
return tl[0]
Basta passar duas fotos, e o último parâmetro é a posição da imagem do resultado de entrada. (As duas fotos estão no corpo de retorno devolvido pela solicitação de carga)
Finalmente, obtém-se a distância que ele precisa percorrer.
Chame js novamente, apenas passe na distância do movimento (passe para o primeiro parâmetro)
function init(data_x){
let mydata = '{"setLeft":'+data_x+',"passtime":1915,"userresponse":'+data_x+'.81178591310345,"device_id":"自己搞(网页上都有的)","lot_number":"自己搞(网页上都有的)","pow_msg":"自己搞(网页上都有的)","pow_sign":"自己搞(网页上都有的)","geetest":"captcha","lang":"zh","ep":"123","rigp":"199241198","yeg6":"d6w9","em":{"ph":0,"cp":0,"ek":"11","wd":1,"nt":0,"si":0,"sc":0}}'
mydata_obj={
"pt": "1",
}
mydata_obj = better_proxy(mydata_obj, "mydata_obj")
result = window.code(mydata, mydata_obj)
console.log(result)
}
module.exports = {
init
}
Resumir
Não é difícil, está ficando cada vez mais fácil, e os iniciantes podem usá-lo como um curso introdutório
aprender de
Como identificar lacunas no slider captcha com python_python