CrackTouClick
CrackTouClick copied to clipboard
网站不可用了,建议更新下,并使用12306作为示例
@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()
验证码位置 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
@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,方便大家讨论
您好,我截取的图片都是这种没有对齐的,代码也是一模一样的,请问造成这种情况的原因可能是什么呢?比如Chrome的字体被改过了?
谢谢,我准备在第二版书籍中更正为 12306
您好,我截取的图片都是这种没有对齐的,代码也是一模一样的,请问造成这种情况的原因可能是什么呢?比如Chrome的字体被改过了?
我也是这样的问题,左边截取不出来,右边有四分之一空白,请问是什么原因
您好,我截取的图片都是这种没有对齐的,代码也是一模一样的,请问造成这种情况的原因可能是什么呢?比如Chrome的字体被改过了?
我也是这个问题,然后,我找了一天原因,有两个,1,较新的电脑对高分辨率设置了缩放,比如我的联想y470,默认缩放比例是125%,然后因为缩放的原因,导致截到的图的位置是不对的。2,我不知道你们的selenium打开的浏览器默认是不是最大化的,我的不是,如果不是最大化,截到的图也是不全的,可以用browser.maximize_window方法把浏览器最大化后再进行后续操作。我改了两个点后成功了。
您好,我截取的图片都是这种没有对齐的,代码也是一模一样的,请问造成这种情况的原因可能是什么呢?比如Chrome的字体被改过了?
我也是这样的问题,左边截取不出来,右边有四分之一空白,请问是什么原因
我也是这个问题,然后,我找了一天原因,有两个,1,较新的电脑对高分辨率设置了缩放,比如我的联想y470,默认缩放比例是125%,然后因为缩放的原因,导致截到的图的位置是不对的。2,我不知道你们的selenium打开的浏览器默认是不是最大化的,我的不是,如果不是最大化,截到的图也是不全的,可以用browser.maximize_window方法把浏览器最大化后再进行后续操作。我改了两个点后成功了。
您好,我截取的图片都是这种没有对齐的,代码也是一模一样的,请问造成这种情况的原因可能是什么呢?比如Chrome的字体被改过了?
我也是这样的问题,左边截取不出来,右边有四分之一空白,请问是什么原因
我也是这个问题,然后,我找了一天原因,有两个,1,较新的电脑对高分辨率设置了缩放,比如我的联想y470,默认缩放比例是125%,然后因为缩放的原因,导致截到的图的位置是不对的。2,我不知道你们的selenium打开的浏览器默认是不是最大化的,我的不是,如果不是最大化,截到的图也是不全的,可以用browser.maximize_window方法把浏览器最大化后再进行后续操作。我改了两个点后成功了。
我也解决了,应该就是浏览器的问题,我设置了self.browser.set_window_size(1920, 1080)以后,把页面显示全就好了,我再试试你这个浏览器最大化的方法。感谢指点!
self.browser.set_window_size(1920, 1080)
我经过尝试发现只改了电脑缩放就可以了,没有最大化窗口, 使用headless也可以