21、关于破解点触的验证码

点触验证码是一种常见的反爬手段
解决方案有两种:一种是直接解决,这需要深度学习机器学习等图像处理技术,以大量的数据训练识别模型,最终达到模型足矣识别图片中的文字提示和应该点击的区域之间的对应关系。
这需要非常专业的设备,比如TPU运算,和专业的开发和维护人员。
因此市面上有专业解决此类问题的OCR解决提供商。也就是第二种间接解决的方案,调用第三方接口。

12306自动登录

整体代码文件

其中pw文件下的password存放着需要的超级鹰账号与12306账号

12306_selenium.py

登录的步骤分为

1.找到登录页面2.输入用户名和密码3.获取验证码图片4.超级鹰识别图片5.点击图片验证6.点击登录

重难点:

  1. 超级鹰识别图片,这需要调用超级鹰的代码,并且选择准确类别.图片验证,我们自己做起来比较困难,所以交个超级鹰;
  2. 点击图片验证 使用动作链
import time
from selenium  import   webdriver
from selenium.webdriver import ActionChains

from chaojiying import Chaojiying_Client
from PW.password import P,CP

def input_username_password(username,password):
    username_tag=wd.find_element_by_id("J-userName")
    username_tag.send_keys(username)
    password_tag=wd.find_element_by_id("J-password")
    password_tag.send_keys(password)
def get_captcha():
    captcha_local_path="D:/data_analysis\python_spider/tzAdvanceSpider/9.点触验证码/12306login.png"
    wd.find_element_by_id("J-loginImg").screenshot(captcha_local_path)
    return captcha_local_path

def  picture_recognize(captcha_local_path):

    with open(captcha_local_path,"rb") as  f:
        img=f.read()
    #传给超级鹰识别
    chaojiyingObj=Chaojiying_Client(username="douli666",password=CP,soft_id=906011)
    dc=chaojiyingObj.PostPic(img,9004)
    print(dc)
    #解析获取合适的坐标数
    # dc={'err_no': 0, 'err_str': 'OK', 'pic_id': '3108522174449000010',
    #     'pic_str': '46,72|117,73', 'md5': 'a3e6a80ff994ad2bfc72041d645d1612'}
    temp_list=dc["pic_str"].split("|")
    print(temp_list)
    position_list=[position.split(",") for  position in temp_list ]
    print(position_list)  #[['46', '72'], ['117', '73']]  帮助我们定位图片位置
    return  position_list

def picture_click(position_list):
    loginImg_ele=wd.find_element_by_id("J-loginImg")
    for  position in position_list:
        x=int(position[0])
        y=int(position[1])
        ActionChains(wd).move_to_element_with_offset(loginImg_ele,x,y).click().perform()

if __name__ == '__main__':
    wd=webdriver.Chrome()
    #1.找登录页面
    wd.get("https://kyfw.12306.cn/otn/resources/login.html")
    time.sleep(1)
    wd.maximize_window()
    wd.implicitly_wait(10)
    time.sleep(1)
    a_tag=wd.find_element_by_xpath("//li[@class='login-hd-account']/a")
    a_tag.click()

    #2输入用户名和密码
    input_username_password("514833906@qq.com",P)
    #3.获取验证码图片
    time.sleep(1)
    captcha_local_path=get_captcha()
    #4.超级鹰识别图片
    time.sleep(1)
    position_list=picture_recognize(captcha_local_path)
    #5.点击图片进行验证
    time.sleep(2)
    picture_click(position_list)
    #6.点击登录  获取cookies 进行后续操作
    time.sleep(3)
    login_tag=wd.find_element_by_id("J-login")
    login_tag.click()
    cookies=wd.get_cookies()
    print(cookies)

chaojiying.py

原先是python2的版本,需要稍微做一些修改调整,以下代码是修改后的python3的语法

#!/usr/bin/env python
# coding:utf-8

import requests
from hashlib import md5

class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
      # password =  password.encode('utf8')
        # self.password = md5(password).hexdigest()
        self.password = md5(password.encode('utf8')).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()


if __name__ == '__main__':
   chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001') #用户中心>>软件ID 生成一个替换 96001
   im = open('a.jpg', 'rb').read()                                        #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
   print (chaojiying.PostPic(im, 1902))                                    #1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()

版权声明:本文为qwe863226687原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。