CrackTouClick icon indicating copy to clipboard operation
CrackTouClick copied to clipboard

网站不可用了,建议更新下,并使用12306作为示例

Open Switch-vov opened this issue 6 years ago • 9 comments

@Germey 以下是根据CrackTouClick写的12306登录

import time
from io import BytesIO

from PIL import Image
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from verifycode.chaojiying.chaojiying import Chaojiying
from verifycode.chaojiying.config import *


class Crack12306:
    def __init__(self):
        self._url = 'https://kyfw.12306.cn/otn/login/init'
        self._browser = webdriver.Chrome()
        self._wait = WebDriverWait(self._browser, 20)
        self._username = USERNAME
        self._password = PASSWORD
        self._chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
        self._pic_id = None

    def __del__(self):
        self._browser.close()

    def open(self):
        """
        打开网页输入用户名密码
        :return: None
        """
        self._browser.get(self._url)
        username = self._wait.until(EC.presence_of_element_located((By.ID, 'username')))
        password = self._wait.until(EC.presence_of_element_located((By.ID, 'password')))
        username.send_keys(self._username)
        password.send_keys(self._password)

    def get_12306_element(self):
        """
        获取验证图片对象
        :return: 图片对象
        """
        element = self._wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.touclick .touclick-image')))
        return element

    def get_position(self):
        """
        获取验证码位置
        :return:  验证码位置元组
        """
        element = self.get_12306_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 top, bottom, left, right

    def get_screen_shot(self):
        """
        获取网页截图
        :return:  截图对象
        """
        screen_shot = self._browser.get_screenshot_as_png()
        screen_shot = Image.open(BytesIO(screen_shot))
        return screen_shot

    def get_12306_image(self, name='captcha.png'):
        """
        获取验证码图片
        :return: 图片对象
        """
        top, bottom, left, right = self.get_position()
        print('验证码位置', top, bottom, left, right)
        screen_shot = self.get_screen_shot()
        captcha = screen_shot.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
        """
        element = self.get_12306_element()
        for location in locations:
            print(location)
            ActionChains(self._browser).move_to_element_with_offset(element, location[0], location[1]).click().perform()
            time.sleep(1)

    def login(self):
        """
        登录
        :return: None
        """
        submit = self._wait.until(EC.element_to_be_clickable((By.ID, 'loginSub')))
        submit.click()
        time.sleep(10)

    def check_login_success(self):
        """
        检查是否登录成功
        :return: None
        """
        success = False
        try:
            self._browser.find_element_by_id('loginSub')
            self._chaojiying.report_error(self._pic_id)
        except NoSuchElementException:
            success = True
        return success

    def crack(self):
        """
        破解入口
        :return: None
        """
        self.open()

        # 获取验证码图片
        image = self.get_12306_image()
        bytes_array = BytesIO()
        image.save(bytes_array, format='PNG')

        # 识别验证码
        result = self._chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND)
        self._pic_id = result.get('pic_id')
        print(result)
        locations = self.get_points(result)
        self.touch_click_words(locations)

        # 登录
        self.login()

        # 失败后重试
        success = self.check_login_success()
        if not success:
            self.crack()
        else:
            print('登录成功')


if __name__ == '__main__':
    crack = Crack12306()
    crack.crack()

Switch-vov avatar Aug 04 '18 09:08 Switch-vov

验证码位置 219 409.0 398 691.0 {'pic_id': '6041815561703000001', 'err_str': 'OK', 'err_no': 0, 'md5': 'a7364ccaec556bf25a87e2ec333f6d8f', 'pic_str': '43,87|234,177'} Traceback (most recent call last): File "E:\Desktop\crack.py", line 171, in crack.crack() File "E:\Desktop\crack.py", line 156, in crack self.touch_click_words(locations) File "E:\Desktop\crack.py", line 111, in touch_click_words element = self.get_12306_element() File "E:\Desktop\crack.py", line 58, in get_12306_element element = self._wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.touclick .touclick-image'))) File "D:\python35\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until value = method(self._driver) File "D:\python35\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 63, in call return _find_element(driver, self.locator) File "D:\python35\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 397, in _find_element return driver.find_element(*by) File "D:\python35\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 955, in find_element 'value': value})['value'] File "D:\python35\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 310, in execute response = self.command_executor.execute(driver_command, params) File "D:\python35\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 466, in execute return self._request(command_info[0], url, body=data) File "D:\python35\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 489, in _request self._conn.request(method, parsed_url.path, body, headers) File "D:\python35\lib\http\client.py", line 1107, in request self._send_request(method, url, body, headers) File "D:\python35\lib\http\client.py", line 1152, in _send_request self.endheaders(body) File "D:\python35\lib\http\client.py", line 1103, in endheaders self._send_output(message_body) File "D:\python35\lib\http\client.py", line 936, in _send_output self.send(message_body) File "D:\python35\lib\http\client.py", line 908, in send self.sock.sendall(data) ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。

goodbad3 avatar Aug 26 '18 07:08 goodbad3

@Germey 以下是根据CrackTouClick写的12306登录

import time
from io import BytesIO

from PIL import Image
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from verifycode.chaojiying.chaojiying import Chaojiying
from verifycode.chaojiying.config import *


class Crack12306:
    def __init__(self):
        self._url = 'https://kyfw.12306.cn/otn/login/init'
        self._browser = webdriver.Chrome()
        self._wait = WebDriverWait(self._browser, 20)
        self._username = USERNAME
        self._password = PASSWORD
        self._chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
        self._pic_id = None

    def __del__(self):
        self._browser.close()

    def open(self):
        """
        打开网页输入用户名密码
        :return: None
        """
        self._browser.get(self._url)
        username = self._wait.until(EC.presence_of_element_located((By.ID, 'username')))
        password = self._wait.until(EC.presence_of_element_located((By.ID, 'password')))
        username.send_keys(self._username)
        password.send_keys(self._password)

    def get_12306_element(self):
        """
        获取验证图片对象
        :return: 图片对象
        """
        element = self._wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.touclick .touclick-image')))
        return element

    def get_position(self):
        """
        获取验证码位置
        :return:  验证码位置元组
        """
        element = self.get_12306_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 top, bottom, left, right

    def get_screen_shot(self):
        """
        获取网页截图
        :return:  截图对象
        """
        screen_shot = self._browser.get_screenshot_as_png()
        screen_shot = Image.open(BytesIO(screen_shot))
        return screen_shot

    def get_12306_image(self, name='captcha.png'):
        """
        获取验证码图片
        :return: 图片对象
        """
        top, bottom, left, right = self.get_position()
        print('验证码位置', top, bottom, left, right)
        screen_shot = self.get_screen_shot()
        captcha = screen_shot.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
        """
        element = self.get_12306_element()
        for location in locations:
            print(location)
            ActionChains(self._browser).move_to_element_with_offset(element, location[0], location[1]).click().perform()
            time.sleep(1)

    def login(self):
        """
        登录
        :return: None
        """
        submit = self._wait.until(EC.element_to_be_clickable((By.ID, 'loginSub')))
        submit.click()
        time.sleep(10)

    def check_login_success(self):
        """
        检查是否登录成功
        :return: None
        """
        success = False
        try:
            self._browser.find_element_by_id('loginSub')
            self._chaojiying.report_error(self._pic_id)
        except NoSuchElementException:
            success = True
        return success

    def crack(self):
        """
        破解入口
        :return: None
        """
        self.open()

        # 获取验证码图片
        image = self.get_12306_image()
        bytes_array = BytesIO()
        image.save(bytes_array, format='PNG')

        # 识别验证码
        result = self._chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND)
        self._pic_id = result.get('pic_id')
        print(result)
        locations = self.get_points(result)
        self.touch_click_words(locations)

        # 登录
        self.login()

        # 失败后重试
        success = self.check_login_success()
        if not success:
            self.crack()
        else:
            print('登录成功')


if __name__ == '__main__':
    crack = Crack12306()
    crack.crack()

我也在看这本书,为这本书建了一个QQ群805370297,方便大家讨论

aesdhj avatar Oct 02 '18 17:10 aesdhj

captcha 您好,我截取的图片都是这种没有对齐的,代码也是一模一样的,请问造成这种情况的原因可能是什么呢?比如Chrome的字体被改过了?

CoolerMe avatar Oct 04 '18 13:10 CoolerMe

谢谢,我准备在第二版书籍中更正为 12306

Germey avatar Oct 05 '18 15:10 Germey

captcha 您好,我截取的图片都是这种没有对齐的,代码也是一模一样的,请问造成这种情况的原因可能是什么呢?比如Chrome的字体被改过了?

我也是这样的问题,左边截取不出来,右边有四分之一空白,请问是什么原因

shenzijing avatar Jan 14 '19 02:01 shenzijing

captcha 您好,我截取的图片都是这种没有对齐的,代码也是一模一样的,请问造成这种情况的原因可能是什么呢?比如Chrome的字体被改过了?

我也是这个问题,然后,我找了一天原因,有两个,1,较新的电脑对高分辨率设置了缩放,比如我的联想y470,默认缩放比例是125%,然后因为缩放的原因,导致截到的图的位置是不对的。2,我不知道你们的selenium打开的浏览器默认是不是最大化的,我的不是,如果不是最大化,截到的图也是不全的,可以用browser.maximize_window方法把浏览器最大化后再进行后续操作。我改了两个点后成功了。

xiezhedaima9591 avatar Jan 14 '19 03:01 xiezhedaima9591

captcha 您好,我截取的图片都是这种没有对齐的,代码也是一模一样的,请问造成这种情况的原因可能是什么呢?比如Chrome的字体被改过了?

我也是这样的问题,左边截取不出来,右边有四分之一空白,请问是什么原因

我也是这个问题,然后,我找了一天原因,有两个,1,较新的电脑对高分辨率设置了缩放,比如我的联想y470,默认缩放比例是125%,然后因为缩放的原因,导致截到的图的位置是不对的。2,我不知道你们的selenium打开的浏览器默认是不是最大化的,我的不是,如果不是最大化,截到的图也是不全的,可以用browser.maximize_window方法把浏览器最大化后再进行后续操作。我改了两个点后成功了。

xiezhedaima9591 avatar Jan 14 '19 03:01 xiezhedaima9591

captcha 您好,我截取的图片都是这种没有对齐的,代码也是一模一样的,请问造成这种情况的原因可能是什么呢?比如Chrome的字体被改过了?

我也是这样的问题,左边截取不出来,右边有四分之一空白,请问是什么原因

我也是这个问题,然后,我找了一天原因,有两个,1,较新的电脑对高分辨率设置了缩放,比如我的联想y470,默认缩放比例是125%,然后因为缩放的原因,导致截到的图的位置是不对的。2,我不知道你们的selenium打开的浏览器默认是不是最大化的,我的不是,如果不是最大化,截到的图也是不全的,可以用browser.maximize_window方法把浏览器最大化后再进行后续操作。我改了两个点后成功了。

我也解决了,应该就是浏览器的问题,我设置了self.browser.set_window_size(1920, 1080)以后,把页面显示全就好了,我再试试你这个浏览器最大化的方法。感谢指点!

shenzijing avatar Jan 14 '19 03:01 shenzijing

self.browser.set_window_size(1920, 1080)

我经过尝试发现只改了电脑缩放就可以了,没有最大化窗口, 使用headless也可以

literence avatar Mar 24 '20 01:03 literence