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

两个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()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 11,136评论 0 10
  • (一)、启动服务器 (二)、创建数据库表 或 更改数据库表或字段 Django 1.7.1及以上 用以下命令 1....
    夏天夏星阅读 11,038评论 0 17
  • 模块和包 一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是...
    go以恒阅读 6,729评论 0 4
  • 一年一度的暑假终于来临,杨凌这座小城,靓丽帅气的大学生们,都开始打点行装,准备回家啦! 街上多了很...
    微荷阅读 1,521评论 6 2
  • 2.1 日精进:敬畏—进入—体验—交给—持续 1,缺啥补啥,怕啥练啥; 2,一切为我所用,所用为团队家; 3,我...
    京心达毕玉娜阅读 1,183评论 0 0