代码仅供学习交流,请勿用于非法用途
# -*- coding:utf-8 -*-
import requests
import execjs
import hashlib
import json
import cv2
import os
import random
from selenium import webdriver
import configparser
import base64
import numpy as np
# ----------- 浏览器模块 -----------
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("log-level=2")
# ----------- 配置模块 -----------
cf = configparser.ConfigParser()
try:
cf.read(os.getcwd() + "/conf.ini", encoding="utf-8-sig")
except Exception as e:
print("程序目录下不存在conf.ini配置文件~")
exit(0)
def getConf(sec, key):
try:
return cf.get(sec, key)
except Exception as e:
print(e)
print("未得到以下配置:" + sec + " - " + key)
exit(0)
chromeDriverPath = getConf("app-sys", "chromeDriverPath")
js = '''
'''
ctx = execjs.compile(js)
def decrypt(resp, a, c):
'''
解密函数
:param resp:
:param a:
:param c:
:return:
'''
return ctx.call("decrypt", resp, a, c)
def encrypt(params, method):
'''
加密函数
:param params:
:param method:
:return:
'''
return ctx.call("encrypt", params, method)
def getSignalBrowser():
try:
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("log-level=2")
browser = webdriver.Chrome(chrome_options=options,
executable_path=chromeDriverPath)
return browser
except Exception as e:
pass
def quitSignalBrowser(browser):
try:
browser.close()
except Exception as e:
pass
try:
browser.quit()
except Exception as e:
pass
def getHash(s):
m = hashlib.md5()
m.update(s.encode("utf-8"))
return m.hexdigest()
def getSign(param, secretKey):
return getHash(signStr)
def getDEndata(sessionID, shumeiId, sk):
browser = getSignalBrowser()
try:
js = '''
'''
res = browser.execute_script(js)
quitSignalBrowser(browser)
return res
except Exception as e:
quitSignalBrowser(browser)
def getDEngjData(shumeiId, sessionID, sk, width, x, xys):
browser = getSignalBrowser()
try:
js = '''
'''
res = browser.execute_script(js)
quitSignalBrowser(browser)
return res
except Exception as e:
quitSignalBrowser(browser)
def getCaptcha(sessionID, shumeiId, sk):
url = "https://app.dewu.com/api/v1/h5/risk-stone-captcha/captcha/call"
data = getDEndata(sessionID, )
resp = requests.post(url, data=json.dumps(data), timeout=20, headers=headers)
res = resp.json()
return {"target": res['data']['image'].replace("data:image/png;base64,", ""), "background": res['data']['bgImage'].replace("data:image/png;base64,", "")}
def base64_cv2(base64_str):
image_str = base64.b64decode(base64_str)
str_array = np.fromstring(image_str, np.uint8)
cv2_image = cv2.imdecode(str_array, cv2.IMREAD_COLOR)
return cv2_image
def identify_gap(captcha):
# 读取背景图片和缺口图片
bg_img = base64_cv2(captcha['background']) # 背景图片
tp_img = base64_cv2(captcha['target']) # 缺口图片
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
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)
# 返回缺口的X坐标
return tl[0]
def getXys(captcha):
qkxm= identify_gap(captcha)
y = 757
xyList = []
currentX = qkwm
xyList.append()
return "".join(xyList), qkx, bgw
def passCaptcha(shumeiId, sessionID, sk):
# 获取滑块
captcha = getCaptcha(sessionID, shumeiId, sk)
print("获取验证码-------------------------------------------------------------")
print(captcha)
print("获取验证码-------------------------------------------------------------")
# 获取参数
xys, x, width = getXys(captcha)
print("获取参数--------------------------------------------------------")
print(xys, x, width)
print("获取参数--------------------------------------------------------")
data = getDEngjData(shumeiId, sessionID, sk, width, x, xys)
resp = requests.post(url, data=json.dumps(data), timeout=20, headers=headers)
print("请求结束")
print(resp.status_code)
print(resp.json())
if __name__ == '__main__':
passCaptcha(shumeiId, sessionID, sk)
,
附运行截图



