【Python selenium过极验消消乐】轻松越过极验消消乐,还不会的看过了,代码都给你

文章日期: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()
相关推荐
Dream_Snowar1 小时前
速通Python 第四节——函数
开发语言·python·算法
西猫雷婶1 小时前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
汪洪墩2 小时前
【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换
开发语言·javascript·python·ecmascript·webgl·cesium
程序员shen1616113 小时前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法
人人人人一样一样3 小时前
作业Python
python
四口鲸鱼爱吃盐3 小时前
Pytorch | 利用VMI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python
四口鲸鱼爱吃盐3 小时前
Pytorch | 利用PI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python
小陈phd4 小时前
深度学习之超分辨率算法——SRCNN
python·深度学习·tensorflow·卷积
CodeClimb4 小时前
【华为OD-E卷-简单的自动曝光 100分(python、java、c++、js、c)】
java·python·华为od