美文网首页
12306登陆(图片点击验证码)

12306登陆(图片点击验证码)

作者: 沫明 | 来源:发表于2018-11-14 22:38 被阅读0次

两个py文件
一个超级鹰文件,一个12306文件

文件一超级鹰py文件

        import requests
        from hashlib import md5
        
        
        class Chaojiying(object):
        
            def __init__(self, username, password, soft_id):
                self.username = username
                self.password = md5(password.encode('utf-8')).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 post_pic(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 report_error(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()

文件二12306py文件

    import time
    from io import BytesIO
    from PIL import Image
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from chaojiying import Chaojiying
    
    EMAIL = '12306账号'
    PASSWORD = '12306密码'
    
    #超级鹰账号
    CHAOJIYING_USERNAME = '超级鹰账号'
    CHAOJIYING_PASSWORD = '超级鹰密码'
    CHAOJIYING_SOFT_ID = '1bce712d583f72be3a40d5960a86c94f'
    CHAOJIYING_KIND = 9102
    
    
    class CrackTouClick():
        def __init__(self):
            self.url = 'https://kyfw.12306.cn/otn/login/init'
            self.browser = webdriver.Chrome(r"D:\chromedriver.exe")
            self.wait = WebDriverWait(self.browser, 20)
            self.email = EMAIL
            self.password = PASSWORD
            self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
    
        def __del__(self):
            print('close')
            self.browser.close()
    
        def open(self):
            """
            打开网页输入用户名密码
            :return: None
            """
            self.browser.get(self.url)
            print(self.browser.page_source)
            email = self.wait.until(EC.presence_of_element_located((By.ID, 'username')))
            password = self.wait.until(EC.presence_of_element_located((By.ID, 'password')))
            email.send_keys(self.email)
            password.send_keys(self.password)
    
        def get_touclick_button(self):
            """
            获取初始验证按钮element_to_be_clickable
            :return:
            touclick-bgimg touclick-reload touclick-reload-normal
            """
            button = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'touclick-reload')))
            return button
    
        def get_touclick_element(self):
            """
            获取验证图片对象
            :return: 图片对象
            """
            element = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'touclick-image')))
            return element
    
        def get_position(self):
            """
            获取验证码位置
            :return: 验证码位置元组
            """
            element = self.get_touclick_element()
            time.sleep(2)
            location = element.location
            size = element.size
            top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size[
                'width']
            return (left, top, right, bottom)
    
        def get_screenshot(self):
            """
            获取网页截图
            :return: 截图对象
            """
            screenshot = self.browser.get_screenshot_as_png()
            screenshot = Image.open(BytesIO(screenshot))
            return screenshot
    
        def get_touclick_image(self, name='captcha.png'):
            """
            获取验证码图片
            :return: 图片对象
            """
            left, top, right, bottom = self.get_position()
            print('验证码位置', top, bottom, left, right)
            screenshot = self.get_screenshot()
            captcha = screenshot.crop((left, top, right, bottom))
            captcha.save(name)
            return captcha
    
        def get_points(self, captcha_result):
            """
            解析识别结果
            :param captcha_result: 识别结果
            :return: 转化后的结果
            """
            groups = captcha_result.get('pic_str').split('|')
            locations = [[int(number) for number in group.split(',')] for group in groups]
            return locations
    
        def touch_click_words(self, locations):
            """
            点击验证图片
            :param locations: 点击位置
            :return: None
            """
            for location in locations:
                print(location)
                ActionChains(self.browser).move_to_element_with_offset(self.get_touclick_element(), location[0],
                                                                       location[1]).click().perform()
                time.sleep(1)
    
        def touch_click_verify(self):
            """
            点击验证按钮
            :return: None
            """
            button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'btn200s')))
            button.click()
    
        def login(self):
            """
            登录
            :return: None
            """
            submit = self.wait.until(EC.element_to_be_clickable((By.ID, 'loginSub')))
            submit.click()
            time.sleep(10)
            print('登录成功')
    
        def crack(self):
            """
            破解入口
            :return: None
            """
            self.open()
            time.sleep(2)
            # 点击验证按钮
            button = self.get_touclick_button()
            button.click()
            time.sleep(2)
            # 获取验证码图片
            image = self.get_touclick_image("./images/12306.png")
            bytes_array = BytesIO()   #传输验证码二进制数据
            image.save(bytes_array, format='PNG')
            # 识别验证码
            result = self.chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND)
            print(result)
            locations = self.get_points(result)
            self.touch_click_words(locations)
            self.touch_click_verify()
            # 判定是否成功
            elem = self.wait.until(
                # EC.text_to_be_present_in_element((By.CLASS_NAME, 'touclick-hod-note'), '验证成功'))
                EC.presence_of_element_located((By.ID, 'error_msgmypasscode1')))
    
            print(elem.text)
            print(111111111111111111111)
            time.sleep(22)
    
            # 失败后重试
            if len(elem.text) == 0:
                print('success!')
                # self.login()
    
            else:
                print('fail!')
                # self.crack()
    
    
    if __name__ == '__main__':
        crack = CrackTouClick()
        crack.crack()

相关文章

  • 12306登陆(图片点击验证码)

    两个py文件一个超级鹰文件,一个12306文件 文件一超级鹰py文件 文件二12306py文件

  • 43.处理验证码并完成登陆

    处理验证码并完成登陆 学习目标: 了解 使用打码平台处理验证图片 了解 实现12306登陆实现 2.1 获取前置c...

  • 2017.9.7登陆流程总结

    登陆校验:输入用户名密码、点击发送验证码,输入验证码,点击登陆,校验全部正确则登陆成功。点击获取验证码需要校验1、...

  • kotlin 随机生成图片验证码

    引言 图片随机验证码,登陆、注册经常用到,最近项目需要使用手机验证码和随机图片验证码两种方式进行注册登陆。从网上找...

  • 参考的文章

    验证码 图片验证码前端怎样获取后端生成的验证码图片,并且点击图片的时候改变验证码 记住密码 前端记住密码功能密码安...

  • 赞赞羊技术服务支持

    一、登陆页面 验证码登陆输入手机号获取验证码——输入获取的验证码——点击登录——进入首页 三方授权登录(仅微信授权...

  • 模拟登陆豆瓣

    伪造data,这里的验证码选择手打,将访问时候的验证码图片下载到本地 登陆结果显示,前面是没有登陆的结果 登陆后

  • 12306自动刷票下单-登录篇

    12306网站推出图片验证码以后,对于抢票软件就提出了更高的要求,本篇并不涉及自动识别验证码登录(主要是博主能力所...

  • 用python删除重复的图片

    如下目录下有一些图片(来自12306的验证码) 我怎么把重复的图片删除呢?当然如果不多,比如下面几张,都是人为复制...

  • SpringBoot SpringSecurity(三)添加登陆

    生成图形验证码 改造登陆页 认证流程添加验证码校验 添加验证码大致可以分为三个步骤:根据随机数生成验证码图片;将验...

网友评论

      本文标题:12306登陆(图片点击验证码)

      本文链接:https://www.haomeiwen.com/subject/bxwsfqtx.html