zoukankan      html  css  js  c++  java
  • 模拟登陆12306

    1.封装在线打码平台--超级鹰


    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.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()

    2.

    def get_img_text(imgPath):
        chaojiying = Chaojiying_Client('bobo328410948', 'bobo328410948', '899370')#用户中心>>软件ID 生成一个替换 96001
        im = open(imgPath, 'rb').read()#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        return chaojiying.PostPic(im, 9004)['pic_str']

    3.对12306进行模拟登录:验证码图片必须通过裁剪图片的形式获取

    3.1.浏览器实例化 bro = webdriver.Chrome(executable_path='./chromedriver.exe') 

    3.2.发起请求 bro.get('https://kyfw.12306.cn/otn/login/init') 

    3.3.输入用户名和密码

    3.4.标签定位验证图片 code_img_ele=bro.find_element_by_xpath('//*@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img') 

    3.5.验证码  左上角坐标location location = code_img_ele.location 

    3.6.验证码  长度size size = code_img_ele.size 

    3.7.指定矩形区域

    rangle=(int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))

    3.8.截图整张页面save_screenshot()

    3.9.指定区域截图crop

    3.10.调用超级鹰对验证码进行识别  

    3.11.将x,y变成[[x,y]]

    3.12.基于动作链,将x,y的参照系转移到指定的标签中  move_to_element_with_offse

    3.13.点击登录

    from selenium import webdriver
    from lxml import etree
    from selenium.webdriver import ActionChains
    from PIL import Image
    from time import sleep
    
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    bro.get('https://kyfw.12306.cn/otn/login/init')
    sleep(2)
    bro.find_element_by_id('username').send_keys('用户名')
    bro.find_element_by_id('password').send_keys('密码')
    
    
    #想要获取验证码图片左上角和右下角亮点坐标,通过这亮点坐标可以形成一个裁剪的矩形区域
    code_img_ele = bro.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
    location = code_img_ele.location  # 验证码图片左上角坐标
    size = code_img_ele.size #验证码图片的长宽
    #指定矩形区域
    rangle = (int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
    
    #截图 bro.save_screenshot('aa.png')
    #在指定区域截图crop i = Image.open('./aa.png') code_img_name = 'code.png' frame = i.crop(rangle) frame.save(code_img_name)
    #进行验证码的识别,调用超级鹰 result = get_img_text(code_img_name) print(result) # x1,y1|x2,y2|x3,y3 x,y #[[x1,y1],[x2,y2],[x3,y3]] [[x,y]]
    #将x,y变成[[x,y]] all_list = [] if '|' in result: list_1 = result.split('|') count_1 = len(list_1) for i in range(count_1): xy_list = [] x = int(list_1[i].split(',')[0]) y = int(list_1[i].split(',')[1]) xy_list.append(x) xy_list.append(y) all_list.append(xy_list) else: x = int(result.split(',')[0]) y = int(result.split(',')[1]) xy_list = [] xy_list.append(x) xy_list.append(y) all_list.append(xy_list)
    for l in all_list: #x,y就是需要点击的某一个点的坐标 x = l[0] y = l[1] #move_to_element_with_offset就是将x,y的参照系转移到指定的标签中 #每一个动作连的操作都必须基于一个单独的动作连 ActionChains(bro).move_to_element_with_offset(code_img_ele,x,y).click().perform() sleep(2) bro.find_element_by_id('loginSub').click() sleep(10) bro.quit()
  • 相关阅读:
    【mysql】sum处理null的结果
    【ELK】【docker】6.Elasticsearch 集群启动多节点 + 解决ES节点集群状态为yellow
    【ELK】5.spring boot日志集成ELK,搭建日志系统
    【MySQL】EXPLAIN命令详解--解释执行计划
    【java】ThreadLocal线程变量的实现原理和使用场景
    【工具类】根据IP获取IP归属地,国家,城市信息
    【POI】maven引用POI的依赖,XSSFWorkbook依旧无法使用的问题。
    Spring Boot 2实现分布式锁——这才是实现分布式锁的正确姿势!
    frp服务搭建
    RedisTemplate的key默认序列化器问题
  • 原文地址:https://www.cnblogs.com/l1222514/p/11063936.html
Copyright © 2011-2022 走看看