文章日期:2024.07.25
使用工具:Python
文章类型:自动化过极验消消乐
文章全程已做去敏处理!!! 【需要做的可联系我】
AES解密处理(直接解密即可)(crypto-js.js 标准算法):在线AES加解密工具
**【点赞 收藏 关注 】**仅供学习,仅供学习。
注意:要用Google浏览器和Google驱动,可以在这里下载Google浏览器 和 浏览器驱动下载 教程分享
今天用Python 的 selenium模块,自动化过极验消消乐,先看视频
1、其实很简单,给大家讲一下原理,首先我们会先获取到【9张图片】(默认按网站里的顺序),然后将9张图片进行哈希运算,这是关键,因为相同的图片,他的哈希也一样,所以我们就有对比的方法
2、因为中间那一排是关联性最重要的一排,所以单独拿出来写代码,你仔细观察可以看出来,无论怎么运算都少不了中间的那一排,十字架,然而第一排和最后一排是可以循环写的,不懂的可以去玩玩魔方,魔方同似
3、然后检测第一排和第三排,在检测的时候,因为都需要对比第二排,所以可以加循环,然后我在图里面标记了两排对比的方法,可以看一下
4、刚刚的方法的是一排一排的,无法全部检测,然后我们复制刚刚的代码,只需要重新排列哈希即可,然后就变成了由列排序对比,无论怎样都不会有缺漏
【附上代码】 教程可能不是很清晰明了,有不懂可以留言或私信
python
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import re
import requests
import hashlib
# 安装库 pip install ddddocr
import ddddocr
# 运行脚本实列化一次即可,不要重复实列化,会浪费时间
det = ddddocr.DdddOcr(det=False, ocr=False)
# MD5 - SHA3_512 加密
def md5_encrypt(string):
'''
'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
'blake2b', 'blake2s',
'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512',
'shake_128', 'shake_256'
'''
md5 = hashlib.md5()
md5.update(string.encode('utf-8'))
return md5.hexdigest()
# 配置 Chrome 浏览器
chrome_options = webdriver.ChromeOptions()
chrome_options.binary_location = "chrome/chrome.exe" # 指定 Chrome 浏览器的路径
chrome_options.add_argument("--disable-infobars") # 禁用浏览器中的"信息栏",避免干扰测试。
# 启动浏览器
driver = webdriver.Chrome(options=chrome_options)
# 打开 Google
driver.get("http://gt4.geetest.com/")
print('点击开始验证')
time.sleep(0.5)
# 点击配置
driver.find_element(By.XPATH,r'/html/body/div/div/div[4]/div[1]').click()
time.sleep(0.5)
# 点击消消乐验证
driver.find_element(By.XPATH,r'/html/body/div/div/div[4]/div[2]/div[2]/div[1]/div[2]/div[3]/div[2]').click()
time.sleep(0.5)
# 点击验证按钮
driver.find_element(By.XPATH,r'/html/body/div/div/div[2]/div[2]/form/div[3]/div[3]/div[1]/div[1]').click()
print('等待加载')
data = driver.page_source
chart_url = re.findall('geetest_img-.*?url\("(.*?)"\)',data)
print(f'图片已获取{len(chart_url)}张')
# MD5识别ID(不唯一)
md5_chart = [md5_encrypt((str(requests.get(_).content))) for _ in chart_url]
print('哈希已列完成')
print('开始计算消消乐目标!!!')
# 从左到右 横向排列
def left_right(md5_chart):
# 从左到右 横向排列
md5_chart_list_1 = [{'0':md5_chart[0]},{'3':md5_chart[3]},{'6':md5_chart[6]}]
md5_chart_list_2 = [{'1':md5_chart[1]},{'4':md5_chart[4]},{'7':md5_chart[7]}]
md5_chart_list_3 = [{'2':md5_chart[2]},{'5':md5_chart[5]},{'8':md5_chart[8]}]
# 存放结果
data_list = []
if len(set([list(md5_chart_list_2[0].values())[0],list(md5_chart_list_2[1].values())[0],list(md5_chart_list_1[2].values())[0]])) == 1:
data_list = [list(md5_chart_list_1[2].keys())[0],list(md5_chart_list_2[2].keys())[0]]
if len(set([list(md5_chart_list_2[1].values())[0],list(md5_chart_list_2[2].values())[0],list(md5_chart_list_1[0].values())[0]])) == 1:
data_list = [list(md5_chart_list_1[0].keys())[0],list(md5_chart_list_2[0].keys())[0]]
if len(set([list(md5_chart_list_2[2].values())[0],list(md5_chart_list_2[0].values())[0],list(md5_chart_list_1[1].values())[0]])) == 1:
data_list = [list(md5_chart_list_1[1].keys())[0],list(md5_chart_list_2[1].keys())[0]]
if len(set([list(md5_chart_list_2[0].values())[0],list(md5_chart_list_2[1].values())[0],list(md5_chart_list_3[2].values())[0]])) == 1:
data_list = [list(md5_chart_list_3[2].keys())[0],list(md5_chart_list_2[2].keys())[0]]
if len(set([list(md5_chart_list_2[1].values())[0],list(md5_chart_list_2[2].values())[0],list(md5_chart_list_3[0].values())[0]])) == 1:
data_list = [list(md5_chart_list_3[0].keys())[0],list(md5_chart_list_2[0].keys())[0]]
if len(set([list(md5_chart_list_2[2].values())[0],list(md5_chart_list_2[0].values())[0],list(md5_chart_list_3[1].values())[0]])) == 1:
data_list = [list(md5_chart_list_3[1].keys())[0],list(md5_chart_list_2[1].keys())[0]]
for a in range(3):
if data_list:
break
k1 = [0,1,2]
k2 = [1,2,0]
kk = [2,0,1]
l1 = len(set([list(md5_chart_list_1[k1[a]].values())[0],list(md5_chart_list_1[k2[a]].values())[0],list(md5_chart_list_2[kk[a]].values())[0]])) == 1
l2 = len(set([list(md5_chart_list_3[k1[a]].values())[0],list(md5_chart_list_3[k2[a]].values())[0],list(md5_chart_list_2[kk[a]].values())[0]])) == 1
if l1:
data_list = [list(md5_chart_list_2[kk[a]].keys())[0],list(md5_chart_list_1[kk[a]].keys())[0]]
break
if l2:
data_list = [list(md5_chart_list_2[kk[a]].keys())[0],list(md5_chart_list_3[kk[a]].keys())[0]]
break
if len(set([list(md5_chart_list_2[k1[a]].values())[0], list(md5_chart_list_2[k2[a]].values())[0],list(md5_chart_list_1[kk[a]].values())[0]])) == 1:
data_list = [list(md5_chart_list_1[kk[a]].keys())[0], list(md5_chart_list_2[kk[a]].keys())[0]]
if len(set([list(md5_chart_list_2[k1[a]].values())[0], list(md5_chart_list_2[k2[a]].values())[0],list(md5_chart_list_3[kk[a]].values())[0]])) == 1:
data_list = [list(md5_chart_list_3[kk[a]].keys())[0], list(md5_chart_list_2[kk[a]].keys())[0]]
return data_list
# 从上到下 竖向排列检测
def top_bottom(md5_chart):
# 从左到右 横向排列
md5_chart_list_1 = [{'0':md5_chart[0]},{'1':md5_chart[1]},{'2':md5_chart[2]}]
md5_chart_list_2 = [{'3':md5_chart[3]},{'4':md5_chart[4]},{'5':md5_chart[5]}]
md5_chart_list_3 = [{'6':md5_chart[6]},{'7':md5_chart[7]},{'8':md5_chart[8]}]
# 存放结果
data_list = []
if len(set([list(md5_chart_list_2[0].values())[0],list(md5_chart_list_2[1].values())[0],list(md5_chart_list_1[2].values())[0]])) == 1:
data_list = [list(md5_chart_list_1[2].keys())[0],list(md5_chart_list_2[2].keys())[0]]
if len(set([list(md5_chart_list_2[1].values())[0],list(md5_chart_list_2[2].values())[0],list(md5_chart_list_1[0].values())[0]])) == 1:
data_list = [list(md5_chart_list_1[0].keys())[0],list(md5_chart_list_2[0].keys())[0]]
if len(set([list(md5_chart_list_2[2].values())[0],list(md5_chart_list_2[0].values())[0],list(md5_chart_list_1[1].values())[0]])) == 1:
data_list = [list(md5_chart_list_1[1].keys())[0],list(md5_chart_list_2[1].keys())[0]]
if len(set([list(md5_chart_list_2[0].values())[0],list(md5_chart_list_2[1].values())[0],list(md5_chart_list_3[2].values())[0]])) == 1:
data_list = [list(md5_chart_list_3[2].keys())[0],list(md5_chart_list_2[2].keys())[0]]
if len(set([list(md5_chart_list_2[1].values())[0],list(md5_chart_list_2[2].values())[0],list(md5_chart_list_3[0].values())[0]])) == 1:
data_list = [list(md5_chart_list_3[0].keys())[0],list(md5_chart_list_2[0].keys())[0]]
if len(set([list(md5_chart_list_2[2].values())[0],list(md5_chart_list_2[0].values())[0],list(md5_chart_list_3[1].values())[0]])) == 1:
data_list = [list(md5_chart_list_3[1].keys())[0],list(md5_chart_list_2[1].keys())[0]]
for a in range(3):
if data_list:
break
k1 = [0,1,2]
k2 = [1,2,0]
kk = [2,0,1]
l1 = len(set([list(md5_chart_list_1[k1[a]].values())[0],list(md5_chart_list_1[k2[a]].values())[0],list(md5_chart_list_2[kk[a]].values())[0]])) == 1
l2 = len(set([list(md5_chart_list_3[k1[a]].values())[0],list(md5_chart_list_3[k2[a]].values())[0],list(md5_chart_list_2[kk[a]].values())[0]])) == 1
if l1:
data_list = [list(md5_chart_list_2[kk[a]].keys())[0],list(md5_chart_list_1[kk[a]].keys())[0]]
break
if l2:
data_list = [list(md5_chart_list_2[kk[a]].keys())[0],list(md5_chart_list_3[kk[a]].keys())[0]]
break
if len(set([list(md5_chart_list_2[k1[a]].values())[0], list(md5_chart_list_2[k2[a]].values())[0],list(md5_chart_list_1[kk[a]].values())[0]])) == 1:
data_list = [list(md5_chart_list_1[kk[a]].keys())[0], list(md5_chart_list_2[kk[a]].keys())[0]]
if len(set([list(md5_chart_list_2[k1[a]].values())[0], list(md5_chart_list_2[k2[a]].values())[0],list(md5_chart_list_3[kk[a]].values())[0]])) == 1:
data_list = [list(md5_chart_list_3[kk[a]].keys())[0], list(md5_chart_list_2[kk[a]].keys())[0]]
return data_list
u = (lambda x: x if x else top_bottom(md5_chart))(left_right(md5_chart))
print(f'计算完成:{u}\n等待点击!!!')
# 此处要加间隔时间,防止图片没有加载出来
time.sleep(2)
driver.find_element(By.XPATH,rf'/html/body/div/div/div[2]/div[2]/form/div[3]/div[3]/div[1]/div[4]/div[1]/div[2]/div/div[2]/div[{2*int(u[0])+2}]').click()
time.sleep(0.1)
driver.find_element(By.XPATH,rf'/html/body/div/div/div[2]/div[2]/form/div[3]/div[3]/div[1]/div[4]/div[1]/div[2]/div/div[2]/div[{2*int(u[1])+2}]').click()
print('验证成功!!!')
print('等待执行其他操作!!!')
time.sleep(1000)
# 关闭浏览器
driver.quit()