使用第三方打码平台图鉴识别滑动验证码模拟登录

一.图鉴的账户注册

图鉴网页地址: http://www.ttshitu.com/

登录后充值一个提分
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

把这个python脚本复制保存到一个python文件中去

识别流程

首先你要先确定验证码的类型,然后选择类型对应的编号

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二.欧模网案例滑动验证码模拟登录

页面分析

我们就用邮箱登录为例
在这里插入图片描述
我们点击登录后会有一个滑动验证码的验证,这就是我们主要的问题,下面我们将用代码来实现它
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三.代码分析

这个距离是验证码相对原背景图片的距离
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这里可以看出小图片的宽为340px,而大图片的宽为670px,且缺口距离大图边缘398px,这里设小图片缺口距离小图片边缘Xpx,利用相似的性质可以得到
X = (398/670)*340
在这里插入图片描述

在这里插入图片描述

这里减去了30px是因为验证码不需要滑动前面的那段距离

在这里插入图片描述

实行了一切动作链的操作,实行之前记得要导入一个第三方库from selenium.webdriver.common.action_chains import ActionChains,而且当你实行了动作链操作后要记得使用action.perform()方法提交动作链操作,最后要再次去实例化一个动作链去松开鼠标,因为前面有一个click and hold()按住鼠标的方法,要用action.release()去松开鼠标
在这里插入图片描述
最后是一个模拟客户端滑动验证码的操作,这里为了避免验证码验证出错,做了一个异常捕获,并且点击刷新按钮,让它重新获取验证滑块进行拖动滑块验证

四.欧模网案例展示

from selenium import webdriver
import base64
import json
import requests
from PIL import Image
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains


def base64_api(uname, pwd, img, typeid):
    with open(img, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        b64 = base64_data.decode()
    data = {
    
    "username": uname, "password": pwd, "typeid": typeid, "image": b64}
    result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
    if result['success']:
        return result["data"]["result"]
    else:
        return result["message"]
    return ""


driver = webdriver.Chrome()
driver.maximize_window()

driver.get('https://www.om.cn/login')

# 点击 手机/邮箱
driver.find_element_by_xpath('//*[@id="__layout"]/div/div/div/div[2]/div/div[1]/div[3]/div/div[1]/span').click()

# 点击 邮箱登录
driver.find_element_by_xpath('//*[@id="__layout"]/div/div/div/div[2]/div/div[1]/div[2]/div[1]/div[2]/span').click()

# 输入邮箱
driver.find_element_by_xpath('//*[@id="__layout"]/div/div/div/div[2]/div/div[1]/div[2]/div[2]/div[2]/input').send_keys(
    '你注册的邮箱')

# 输入密码
driver.find_element_by_xpath('//*[@id="__layout"]/div/div/div/div[2]/div/div[1]/div[2]/div[2]/div[4]/input').send_keys(
    '你注册的网页密码')

# 点击登录按钮
driver.find_element_by_xpath('//*[@id="__layout"]/div/div/div/div[2]/div/div[1]/div[2]/div[2]/button').click()
sleep(1)  # 加载验证码

# 切换框架
driver.switch_to.frame('tcaptcha_iframe_dy')

element = driver.find_element_by_id('slideBg')
src = 'https://t.captcha.qq.com' + element.get_attribute('style').split(r'"')[1]  # 背景图片
exit()
content = requests.get(url=src).content

with open('./code.png', 'wb') as f:
    f.write(content)

# 识别图片验证码的位置
img_path = "./code.png"
result = base64_api(uname='xpBear', pwd='xp1693889638', img=img_path, typeid=33)
print('距离: ', result)

num = (int(result) / 672) * 340 - 30  # 滑块移动的距离

print('真实距离: ', num)

while True:
    div = driver.find_element_by_xpath('//*[@id="tcOperation"]/div[8]')
    action = ActionChains(driver)
    action.click_and_hold(div)  # 长按滑块
    for i in range(10):
        action.move_by_offset(num / 10, 0)  # 移动的距离
        sleep(0.3)
    action.perform()  # 执行上面的动作

    action = ActionChains(driver)
    action.release().perform()  # 释放滑块
    sleep(1)

    if driver.title == '欧模网-账户登录':
        try:
            driver.find_element_by_xpath('//*[@id="reload"]/img').click()
            sleep(1)
        except:
            break
    else:
        print('登录成功!')
        break

sleep(1)

print(driver.page_source)

以上代码由于有涉及到账户隐私我用中文描述代替了,大家可以自己注册一个账号去使用这个代码模拟客户端滑动验证码登录,从中去感受一下,相信会有意想不到的乐趣

总结

本篇文章主要是解决爬虫过程中一个滑动验证码如何进行登录的,模拟客户端进行滑动验证的过程,希望本篇文章可以帮助到大家,可以这篇文章在排版上有点乱,但是上面的知识都是我学习成果的分享,给个三连支持一波吧!

猜你喜欢

转载自blog.csdn.net/qq_63713328/article/details/127572028