def getCode(driver): # 保存浏览器当前页面 driver.save_screenshot("page.png") # 从页面中截取验证码 vcode = driver.find_element_by_xpath("//*[@id='app']/div/div/div/div[3]/form/div[3]/div/div[2]/img") # 1、获取验证码上下左右边界左边 loc = vcode.location print(loc) size = vcode.size print(size) left = loc['x'] * 2 top = loc['y'] * 2 right = (loc['x'] + size['width']) * 2 button = (loc['y'] + size['height']) * 2 # 截取页面中的验证码 page_pic = Image.open('page.png') # 进行截图:参数时一个元组(left,top,right,button) v_code_pic = page_pic.crop((left, top, right, button)) v_code_pic.save('yzm.png') # 利用超级鹰识别验证码中的内容,每次10分 yz = Chaojiying(username='******', password='******', soft_id='901845') with open('yzm.png', 'rb')as f: pic = f.read() # 得到验证码识别的结果 result = yz.post_pic(pic, codetype='1004')['pic_str'] return result
def __init__(self): self.url = 'http://admin.touclick.com/login.html' self.browser = webdriver.Chrome() self.wait = WebDriverWait(self.browser, 20) self.email = EMAIL self.password = PASSWORD self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
def __init__(self): self.url = 'https://kyfw.12306.cn/otn/login/init' self.browser = webdriver.Chrome(r"E:\myplugins\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 __init__(self): self.url = 'https://ostec.uestc.edu.cn/authcas/login?service=http://202.115.16.61/eems/Login/doLogin' 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)
def __init__(self, username, password): self.url = 'https://passport.weibo.cn/signin/login' self.browser = webdriver.Chrome(chrome_options=chrome_options) self.wait = WebDriverWait(self.browser, 20) self.phone = username self.password = password self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
def __init__(self): self.url = 'https://passport.bilibili.com/login' self.browser = webdriver.Firefox() self.wait = WebDriverWait(self.browser, 20) self.phone = PHONE self.password = PASSWORD self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
def __init__(self): self.url = 'https://captcha3.scrape.cuiqingcai.com/' 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)
def __init__(self): self.url = 'https://passport.douyu.com/member/login?' self.browser = webdriver.Chrome() self.wait = WebDriverWait(self.browser, 20) self.email = EMAIL self.password = PASSWORD self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
def login(): ''' 微博的登陆 :return: ''' driver = webdriver.Chrome() try: driver.maximize_window() # 加载登录页面 url = 'http://www.weibo.com/login.php' driver.get(url) time.sleep(2) print('输入用户名...') elem_user = driver.find_element_by_id("loginname") elem_user.clear() elem_user.send_keys(loginname) time.sleep(2) print('输入密码...') elem_pwd = driver.find_element_by_name("password") elem_pwd.clear() elem_pwd.send_keys(password) time.sleep(3) checkCode = driver.find_element_by_xpath( '//*[@id="pl_login_form"]/div/div[3]/div[3]/div/input') driver.save_screenshot('./images/weibo.png') img = driver.find_element_by_xpath( '//*[@id="pl_login_form"]/div/div[3]/div[3]/a/img') left = img.location['x'] # 验证码图片左上角横坐标 top = img.location['y'] # 验证码图片左上角纵坐标 right = left + img.size['width'] # 验证码图片右下角横坐标 bottom = top + img.size['height'] # 验证码图片右下角纵坐标 im = Image.open('./images/weibo.png') im_crop = im.crop( (left, top, right, bottom)) # 这个im_crop就是从整个页面截图中再截出来的验证码的图片 im_crop.save('./images/zrecaptchar.png') chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID) # 识别验证码 bytes_array = BytesIO() im_crop.save(bytes_array, format='PNG') strcode = chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND) print(strcode) print(strcode['pic_str']) checkCode.send_keys(strcode['pic_str']) print('登陆微博...') '//*[@id="pl_login_form"]/div/div[3]/div[6]/a' login_btn = driver.find_element_by_xpath( '//*[@id="pl_login_form"]/div/div[3]/div[6]/a') login_btn.click() print('已经点击') time.sleep(10) print(driver.current_url) driver.quit() except Exception as e: print('login error.')
def __init__(self, username, passwd): self.url = 'https://passport.bilibili.com/login' self.browser = webdriver.Chrome() self.wait = WebDriverWait(self.browser, 100) self.BORDER = 31 self.passwd = passwd self.username = username self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
def __init__(self): self.url = 'https://kyfw.12306.cn/otn/login/init' self.browser = webdriver.Chrome() # self.browser.set_window_size(1920, 1080) self.wait = WebDriverWait(self.browser, 20) self.username = USERNAME self.password = PASSWORD self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
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 __init__(self, params): self.url = 'http://www.baidu.com' self.KeyUrl = 'https://ticket.urbtix.hk/internet/zh_TW/eventDetail/38663' self.browser = webdriver.Chrome() # self.browser_headless = True self.wait = WebDriverWait(self.browser, 20) self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID) # self.pool = redis.ConnectionPool(host='47.56.66.23', password='******', port=6379, db=0, max_connections=2) # self.red = redis.Redis(connection_pool=self.pool) self.params = params
def __init__(self): self.url = 'https://fishc.com.cn/forum-173-1.html' self.option = ChromeOptions() self.option.add_experimental_option('excludeSwitches', ['enable-automation']) self.browser = Chrome(options=self.option) self.wait = WebDriverWait(self.browser, 20) self.email = EMAIL self.password = PASSWORD self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
def __init__(self): """ 初始化 """ self.url = URL self.driver = webdriver.Chrome() # 声明浏览器对象 self.wait = WebDriverWait(self.driver, 5) # 设置显式等待5秒 self.user_phone = USER_PHONENUMBER # 简书账号 self.password = PASSWORD # 密码 self.chaojiying = Chaojiying(CHAIJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAIJIYING_SOFT_ID) # 创建超级鹰对象
def __init__(self): """ 初始化数据 """ self.url = 'https://kyfw.12306.cn/otn/login/init' self.browser = webdriver.Chrome() self.wait = WebDriverWait(self.browser, 20) self.username = '******' self.password = '******' self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOLD_ID)
def __init__(self, username, password, browser): self.url = 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https://m.weibo.cn/' self.browser = browser self.wait = WebDriverWait(self.browser, 20) self.username = username self.password = password self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID) self.scale = 1.25 self.kind = CHAOJIYING_KIND_CLICK self.font = ImageFont.truetype("msyh.ttc", 28) self.sliver_text = "请点击阴影凹槽左上角"
def __init__(self, driver, class_name, identifying_name): """ :param driver: 浏览器对象 :param class_name: 图片元素的class属性名称 :param identifying_name: 判断是否登陆成功的验证信息 """ self.browser = driver self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID) self.name = class_name self.wait = WebDriverWait(self.browser, 15) self.identifying_name = identifying_name
def __init__(self, code=None): """ 初始化注册信息 :param code: 验证码 """ self.url = URL # 目标站点 self.browser = webdriver.Chrome() # 声明浏览器对象 self.browser.get(self.url) # 访问网页 self.wait = WebDriverWait(self.browser, 5) # 显式等待5秒,待节点元素全部加载 self.username = USERNAME # 用户名 self.password = PASSWORD # 密码 self.email = EMAIL # 邮箱 self.code = code # 图形验证码 self.chaojiying = Chaojiying(CHAIJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAIJIYING_SOFT_ID) # 创建超级鹰对象
def __init__(self): self.url = 'https://login.flyme.cn' self.browser = webdriver.Chrome() self.wait = WebDriverWait(self.browser, 20) self.account = ACCOUNT self.password = PASSWORD self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
def __init__(self): self.url = 'https://kyfw.12306.cn/otn/resources/login.html' self.browser = webdriver.Chrome() self.wait = WebDriverWait(self.browser, 20) # self.email = EMAIL # self.password = PASSWORD self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
def pick_code(self): time.sleep(3) pick_img_label = self.browser.find_element_by_css_selector('img.geetest_item_img') # 获取点触图片标签 src = pick_img_label.get_attribute('src') # 获取点触图片链接 img_content = requests.get(src).content # 获取图片二进制内容 f = BytesIO() f.write(img_content) img0 = Image.open(f) # 将图片以文件的形式打开,主要是为了获取图片的大小 scale = [pick_img_label.size['width'] / img0.size[0], pick_img_label.size['height'] / img0.size[1]] # 获取图片与浏览器该标签大小的比例 cjy = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID) result = cjy.post_pic(img_content, '9005') # 发送图片并获取结果 if result['err_no'] == 0: # 对结果进行分析 position = result['pic_str'].split('|') # position = ['110,234','145,247','25,185'] position = [[int(j) for j in i.split(',')] for i in position] # position = [[110,234],[145,247],[25,185]] for items in position: # 模拟点击 ActionChains(self.browser).move_to_element_with_offset(pick_img_label, items[0] * scale[0], items[1] * scale[1]).click().perform() time.sleep(1) time.sleep(2) # 点击登录 certern_btn = self.browser.find_element_by_css_selector('div.geetest_commit_tip') certern_btn.click() return cjy, result
def __init__(self): self.url = 'https://captcha3.scrape.center/' self.username = USERNAME self.password = PASSWORD self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID) self.options = webdriver.ChromeOptions() # self.options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) # 不加载图片,加快访问速度 self.options.add_experimental_option( 'excludeSwitches', ['enable-automation']) # 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium self.options.add_experimental_option('useAutomationExtension', False) self.options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en') self.options.add_argument( 'user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' ) # self.options.add_argument('user-agent="Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20"') self.options.add_argument('--ignore-certificate-errors') self.options.add_argument('--ignore-ssl-errors') # prefs = {"profile.managed_default_content_settings.images": 2, "webrtc.ip_handling_policy": "disable_non_proxied_udp", "webrtc.multiple_routes_enabled": False, "webrtc.nonproxied_udp_enabled": False} prefs = { "webrtc.ip_handling_policy": "disable_non_proxied_udp", "webrtc.multiple_routes_enabled": False, "webrtc.nonproxied_udp_enabled": False } self.options.add_experimental_option("prefs", prefs) # self.options.add_argument('--disable-extensions') # self.options.add_experimental_option('excludeSwitches',['ignore-certificate-errors']) # self.options.add_argument('--start-maximized') self.options.add_argument('disable-blink-features=AutomationControlled' ) #告诉chrome去掉了webdriver痕迹 self.browser = webdriver.Chrome(executable_path=chromedriver_path, options=self.options) self.wait = WebDriverWait(self.browser, 20) #超时时长为10s
class CrackCaptcha(): def __init__(self): self.url = 'https://captcha3.scrape.cuiqingcai.com/' 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) 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.CSS_SELECTOR, 'input[type="text"]'))) password = self.wait.until( EC.presence_of_element_located( (By.CSS_SELECTOR, 'input[type="password"]'))) username.send_keys(self.username) password.send_keys(self.password) def get_captcha_button(self): """ 获取初始验证按钮 :return: """ button = self.wait.until( EC.presence_of_element_located( (By.CSS_SELECTOR, 'button[type="button"]'))) return button def get_captcha_element(self): """ 获取验证图片对象 :return: 图片对象 """ # 验证码图片加载出来 self.wait.until( EC.presence_of_element_located( (By.CSS_SELECTOR, 'img.geetest_item_img'))) # 验证码完整节点 element = self.wait.until( EC.presence_of_element_located( (By.CLASS_NAME, 'geetest_panel_box'))) print('成功获取验证码节点') return element def get_captcha_position(self): """ 获取验证码位置 :return: 验证码位置元组 """ element = self.get_captcha_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_screenshot(self): """ 获取网页截图 :return: 截图对象 """ screenshot = self.browser.get_screenshot_as_png() screenshot = Image.open(BytesIO(screenshot)) screenshot.save('screenshot.png') return screenshot def get_captcha_image(self, name='captcha.png'): """ 获取验证码图片 :return: 图片对象 """ top, bottom, left, right = self.get_captcha_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: ActionChains(self.browser).move_to_element_with_offset( self.get_captcha_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, 'geetest_commit'))) button.click() def crack(self): """ 破解入口 :return: None """ self.open() time.sleep(5) # 点击验证按钮 button = self.get_captcha_button() button.click() # 获取验证码图片 image = self.get_captcha_image() 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() # 判定是否成功 success = self.wait.until( EC.text_to_be_present_in_element((By.TAG_NAME, 'h2'), '登录成功')) time.sleep(5) if success: print('登录成功!')
class CrackTouClick(): def __init__(self): self.url = 'https://fishc.com.cn/forum-173-1.html' self.option = ChromeOptions() self.option.add_experimental_option('excludeSwitches', ['enable-automation']) self.browser = Chrome(options=self.option) self.wait = WebDriverWait(self.browser, 20) self.email = EMAIL self.password = PASSWORD self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID) def open(self): """ 打开网页输入用户名密码 :return: None """ self.browser.get(self.url) email = self.wait.until( EC.presence_of_element_located((By.ID, 'ls_username'))) password = self.wait.until( EC.presence_of_element_located((By.ID, 'ls_password'))) email.send_keys(self.email) password.send_keys(self.password) button = self.wait.until( EC.element_to_be_clickable((By.CLASS_NAME, 'pn'))).click() try: slider = self.wait.until( EC.element_to_be_clickable( (By.CLASS_NAME, 'td-pop-slidetrigger'))) CHAOJIYING_KIND = 9202 print('这是滑块验证码') image = self.get_touclick_image() bytes_array = BytesIO() image.save(bytes_array, format='PNG') # 识别验证码 result = self.chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND) print('验证码位置', result['pic_str']) print(result) locations = self.get_points(result) self.touch_click_words(locations) print('正在检测错误,此处延迟3秒,以便等待页面加载') time.sleep(3) self.img_error(result) except Exception as e: print('这是字体验证码', e) CHAOJIYING_KIND = 9103 # 获取验证码图片 image = self.get_touclick_image() 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_words2(locations) print('正在检测错误,此处延迟3秒,以便等待页面加载') time.sleep(3) self.img_error(result) def touch_click_verify(self): """ 获取滑块按钮 :return: None """ slider = self.wait.until( EC.element_to_be_clickable((By.CLASS_NAME, 'td-pop-slidetrigger'))) return slider def get_touclick_element(self): """ 获取验证图片对象 :return: 图片对象 """ element = self.wait.until( EC.presence_of_element_located((By.CLASS_NAME, 'td-bg-img'))) 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 (top, bottom, left, right) 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: 图片对象 """ top, bottom, left, right = self.get_position() 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).drag_and_drop_by_offset( self.touch_click_verify(), location[0], location[1]).perform() time.sleep(1) def touch_click_words2(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 img_error(self, result): #检测验证码有没有出错,这步老是报出栈错误 #无奈之下只能采取解析式来判断登录前后页面的数据了 #不得不吐槽的是,这里的滑块验证码坐标识别率低到了令人发指的地步 test = etree.HTML(self.browser.page_source) title = test.xpath('//*[@id="um"]/p[1]/strong/a/@title') print('爬取登陆前后的数据变化', title) if title == []: img_id = result['pic_id'] self.chaojiying.report_error(img_id) print('登录失败,已发送错误验证码') self.open() else: print('登录成功')
class Train(): """ 模拟登录12306 """ def __init__(self): """ 初始化数据 """ self.url = 'https://kyfw.12306.cn/otn/login/init' self.browser = webdriver.Chrome() self.wait = WebDriverWait(self.browser, 20) self.username = '******' self.password = '******' self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOLD_ID) def __del__(self): """ 关闭浏览器 :return: None """ time.sleep(10) self.browser.close() def open_page(self): """ 打开网页,并输入账号密码 :return:None """ self.browser.get(self.url) username = self.wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#username'))) password = self.wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#password'))) username.send_keys(self.username) time.sleep(0.8) password.send_keys(self.password) def get_touclick_element(self): """ 获取图片对象 :return: 图片对象 """ img = self.wait.until( EC.presence_of_element_located((By.CLASS_NAME, 'touclick-image'))) return img def get_position(self): """ 获取验证码图片位置信息 :return: 验证码位置信息元组 """ img = self.get_touclick_element() time.sleep(2) location = img.location size = img.size top, bottom, left, right = location['y'], location['y'] + size[ 'height'], location['x'], location['x'] + size['width'] return (top, bottom, left, right) def get_screenshot(self): """ 获取网页截图 :return: 截图 """ screenshot = self.browser.get_screenshot_as_png() screenshot = Image.open(BytesIO(screenshot)) return screenshot def get_image(self, name='image.png'): """ 将验证码图片从网页截图中裁剪出来 :return:验证码图片 """ top, bottom, left, right = 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 verification_code_recognition(self, image): """ 利用超级鹰识别验证码 :return: 识别结果 """ bytes_array = BytesIO() image.save(bytes_array, format='PNG') result = self.chaojiying.post_pic(bytes_array.getvalue(), 9004) return result def get_point(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 click_word(self, locations): """ 点击验证图片 :param locations: 验证码的坐标 :return: Nome """ 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 login(self): """ 登录12306 :return:None """ login = self.wait.until( EC.element_to_be_clickable((By.CLASS_NAME, 'btn200s'))) login.click() def main(self): """ 执行 :return:None """ # 打开网页,输入账号密码 self.open_page() # 获取验证码图片 image = self.get_image() # 识别验证码,其中9004是超级鹰的验证码类型 result = self.verification_code_recognition(image) print(result) # 获取验证码坐标信息 locations = self.get_point(result) # 点击验证码 self.click_word(locations) # 点击登录 time.sleep(1) self.login()
class CrackTouClick(): def __init__(self): self.url = 'http://admin.touclick.com/login.html' self.browser = webdriver.Chrome() 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): self.browser.close() def open(self): """ 打开网页输入用户名密码 :return: None """ self.browser.get(self.url) email = self.wait.until(EC.presence_of_element_located((By.ID, 'email'))) 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): """ 获取初始验证按钮 :return: """ button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'touclick-hod-wrap'))) return button def get_touclick_element(self): """ 获取验证图片对象 :return: 图片对象 """ element = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'touclick-pub-content'))) 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 (top, bottom, left, right) 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: 图片对象 """ top, bottom, left, right = 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, 'touclick-pub-submit'))) button.click() def login(self): """ 登录 :return: None """ submit = self.wait.until(EC.element_to_be_clickable((By.ID, '_submit'))) submit.click() time.sleep(10) print('登录成功') def crack(self): """ 破解入口 :return: None """ self.open() # 点击验证按钮 button = self.get_touclick_button() button.click() # 获取验证码图片 image = self.get_touclick_image() 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() # 判定是否成功 success = self.wait.until( EC.text_to_be_present_in_element((By.CLASS_NAME, 'touclick-hod-note'), '验证成功')) print(success) # 失败后重试 if not success: self.crack() else: self.login()
class CrackTouClick(object): def __init__(self, params): self.url = 'http://www.baidu.com' self.KeyUrl = 'https://ticket.urbtix.hk/internet/zh_TW/eventDetail/38663' self.browser = webdriver.Chrome() # self.browser_headless = True self.wait = WebDriverWait(self.browser, 20) self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID) # self.pool = redis.ConnectionPool(host='47.56.66.23', password='******', port=6379, db=0, max_connections=2) # self.red = redis.Redis(connection_pool=self.pool) self.params = params def __del__(self): self.browser.close() def open(self): """ 打开网页输入用户名密码 :return: None """ # self.params = self.get_redis() self.browser.get(self.url) search = self.wait.until(EC.presence_of_element_located((By.ID, 'kw'))) search.send_keys("城市售票网") baidu_click = self.wait.until(EC.presence_of_element_located((By.ID, 'su'))) baidu_click.click() spw = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="1"]/h3/a[1]'))) spw.click() self.browser.switch_to.window(self.browser.window_handles[1]) if self.browser.current_url == "https://busy.urbtix.hk/": time.sleep(4) if self.browser.current_url == "https://busy.urbtix.hk/redirect.html": time.sleep(4) try: self.browser.find_element_by_xpath('/html/body/div[2]/table/tbody/tr/td/table/tbody/tr[4]/td/a').Click() except Exception as E: print(E) def login(self): self.browser.get('https://ticket.urbtix.hk/internet/login/memberLogin') while True: time.sleep(2) try: j_username = self.wait.until(EC.presence_of_element_located((By.ID, 'j_username'))) j_username.clear() j_username.send_keys(self.params.get("account")) j_password = self.wait.until(EC.presence_of_element_located((By.ID, 'j_password'))) j_password.clear() j_password.send_keys(self.params.get("password")) break except Exception as E: print(E) def get_touclick_button(self): """ 获取初始验证按钮 :return: """ button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'touclick-hod-wrap'))) return button def get_touclick_element(self, kind): """ 获取验证图片对象 :return: 图片对象 """ if kind == 1: self.wait.until(EC.presence_of_element_located((By.ID, 'captchaImage'))) element = self.browser.find_element_by_xpath('//*[@id="captchaImage"]') # element = self.wait.until(EC.presence_of_element_located((By.ID, 'captchaImage'))) elif kind == 2: self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#captcha-image-input-key-container > table > tbody'))) element = self.browser.find_element_by_xpath('//*[@id="captcha-image-input-key-container"]/table/tbody/tr[1]') elif kind == 3: self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#captcha-image-input-key-container > table > tbody'))) element = self.browser.find_element_by_xpath('//*[@id="captcha-image-input-key-container"]/table/tbody/tr[2]') return element def get_position(self, kind): """ 获取验证码位置 :return: 验证码位置元组 """ element = self.get_touclick_element(kind) 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'] time.sleep(5) # 424,474,703,823 # 533 583 622 872 # 583 633 622 872 return top, bottom, left, right def get_screenshot(self): """ 获取网页截图 :return: 截图对象 """ screenshot = self.browser.get_screenshot_as_png() screenshot = Image.open(BytesIO(screenshot)) return screenshot def get_touclick_image(self, kind=1): """ 获取验证码图片 :return: 图片对象 """ name = "captcha{}.png".format(kind) top, bottom, left, right = self.get_position(kind) print(top, bottom, left, right) im = self.get_screenshot() self.browser.save_screenshot('full_snap.png') if kind == 1 and self.browser_headless: self.browser.save_screenshot('full_snap.png') image = Image.open('full_snap.png') resized_image = image.resize((1920, 1080), Image.ANTIALIAS) resized_image.save('full_snap.png') im = Image.open('full_snap.png') # im = Image.open(name) captcha = im.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, 'touclick-pub-submit'))) button.click() def login_click(self): """ 登录 :return: None """ self.browser.find_element_by_xpath('//*[@id="login-submit"]/div/div').click() time.sleep(2) print('login success') def get_picture_result(self, kind): image = self.get_touclick_image(kind) bytes_array = BytesIO() image.save(bytes_array, format='PNG') # # # 识别验证码 if kind == 1: CHAOJIYING_CODE = CHAOJIYING_KIND else: CHAOJIYING_CODE = CHAOJIYING_KIND1 result = self.chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_CODE) print(result) return result['pic_str'] def refresh(self): self.browser.find_element_by_xpath('//*[@id="loginForm"]/div/div[2]/table/tbody/tr/td[1]/table/tbody/tr[8]/td[2]/img[2]').click() time.sleep(2) def click_code(self, key_index): for index in key_index: if index < 5: self.browser.find_element_by_xpath('//*[@id="captcha-image-input-key-container"]/table/tbody/tr[1]/td[{}]/img'.format(index + 1)).click() else: index = index - 5 self.browser.find_element_by_xpath( '//*[@id="captcha-image-input-key-container"]/table/tbody/tr[2]/td[{}]/img'.format( index + 1)).click() time.sleep(0.2) def choose_ticker(self): try: self.browser.find_element_by_xpath('//*[@id="concurrent-login-yes"]/div/div').click() except Exception as E: print(E) while True: if self.browser.current_url != self.params.get("key_url"): self.browser.get(self.params.get("key_url")) try: self.browser.find_element_by_xpath('//*[@id="evt-perf-items-tbl"]/tbody/tr[{}]/td[6]/div/img'.format(self.params.get('period'))).click() break except Exception as E: pass # self.browser.save_screenshot("choose_ticker.png") def choose_ticker_num(self): # print("start choose_ticker_num") self.wait.until(EC.presence_of_element_located((By.ID, 'ticket-quota-223-sel'))) html = self.browser.page_source.replace('xmlns="http://www.w3.org/1999/xhtml"', '') options = PyQuery(html).find('#ticket-quota-223-sel > option') num = PyQuery(options[-1]).val() self.browser.find_element_by_xpath('//*[@id="ticket-quota-223-sel"]').send_keys(1) # self.browser.find_element_by_xpath('//*[@id="ticket-quota-223-sel"]').send_keys(int(num)) self.browser.find_element_by_xpath('//*[@id="adjacent-seats-chk"]').click() try: self.browser.find_element_by_xpath('//*[@id="express-purchase-btn"]/div/span').click() except: self.browser.find_element_by_xpath('//*[@id="free-seat-purchase-btn"]/div/div/span').click() try: self.browser.find_element_by_xpath('/html/body/div[9]/div[3]/div/button[1]').click() except Exception as E: # self.browser.find_element_by_xpath('//*[@id="reviewTicketForm"]/div[8]/div/div').click() print(E) print("end choose_ticket_num") # self.browser.save_screenshot("choose_ticket_num.png") def insert_shopping(self): try: self.browser.find_element_by_xpath('//*[@id="checkbox-not-adjacent"]').click() except Exception as E: print(E) pass try: self.browser.find_element_by_xpath('//*[@id="reviewTicketForm"]/div[9]/div/div').click() except Exception as E: print(E) try: self.browser.find_element_by_xpath('//*[@id="reviewTicketForm"]/div[8]/div/div').click() except Exception as E: print(E) print("end insert shopping") # self.browser.save_screenshot("insert_shopping.png") def payment_area(self): print("start payment_area") time.sleep(1) try: self.browser.find_element_by_xpath('//*[@id="checkout-btn"]/div/div').click() except Exception as E: print(E) try: self.browser.find_element_by_xpath('//*[@id="checkbox-not-adjacent"]').click() except Exception as E: print(E) print("end payment_area") # self.browser.save_screenshot("payment_area.png") def personal_data(self): self.wait.until(EC.presence_of_element_located((By.ID, 'delivery-method-select'))) self.browser.find_element_by_xpath('//*[@id="input-surname"]').clear() self.browser.find_element_by_xpath('//*[@id="input-surname"]').send_keys("cao") self.browser.find_element_by_xpath('//*[@id="input-first-name"]').clear() self.browser.find_element_by_xpath('//*[@id="input-first-name"]').send_keys('cao') self.browser.find_element_by_xpath('//*[@id="input-email"]').clear() self.browser.find_element_by_xpath('//*[@id="input-email"]').send_keys(self.params.get('email')) self.browser.find_element_by_xpath('//*[@id="delivery-method-select"]').click() time.sleep(2) self.browser.find_element_by_xpath('//*[@id="delivery_method_group_TDM"]').click() def choose_pay_mei(self): print("start choose_pay") self.browser.find_element_by_xpath('//*[@id="payment-type-select_title"]').click() time.sleep(3) self.browser.find_element_by_xpath('//*[@id="payment-type-select_child"]/ul/li[4]/img').click() time.sleep(0.5) self.browser.find_element_by_xpath('//*[@id="input-card-number"]').send_keys( self.params.get('input_card_number')) time.sleep(0.5) self.browser.find_element_by_xpath('//*[@id="input-security-code"]').send_keys( self.params.get('input_security_code')) time.sleep(0.5) self.browser.find_element_by_xpath('//*[@id="payment-expiry-month-select"]').send_keys( self.params.get('payment_expiry_month_select')) time.sleep(0.5) self.browser.find_element_by_xpath('//*[@id="payment-expiry-year-select"]').send_keys( self.params.get('payment_expiry_year_select')) time.sleep(0.5) self.browser.find_element_by_xpath('//*[@id="button-confirm"]/div/div/span').click() print("end choose_pay") self.browser.save_screenshot("choose_pay.png") def confirm_mei(self): print("start_confirm_mei") self.browser.find_element_by_xpath('//*[@id="checkbox-tnc"]').click() self.browser.find_element_by_xpath('//*[@id="button-confirm"]/div/div/span').click() print("end confirm_mei") def confirm(self): print("start confirm") self.browser.find_element_by_xpath('//*[@id="checkbox-tnc"]').click() self.browser.find_element_by_xpath('//*[@id="button-confirm"]/div/div').click() print("end confirm") self.browser.save_screenshot("confirm.png") def save_ticket(self): if self.browser.current_url == "": pass end = time.time() self.browser.save_screenshot("save_ticket{}.png".format(end)) def login_crack(self): """ 破解入口 :return: None """ self.open() self.login() while True: index = [] result_str = list() result = self.get_picture_result(1) for i in result: if i.isdigit(): result_str.append(i) elif i not in result_str: result_str.append(i.lower()) if len(result_str) != 4: self.refresh() continue str_list = list() result = self.get_picture_result(2) for i in result: if i.isdigit(): str_list.append(i) elif i.lower() in str_list and i.lower() not in result_str: str_list.append(i.lower()) else: str_list.append(i.lower()) if len(str_list) != 5: self.refresh() continue result = self.get_picture_result(3) for i in result: if i.isdigit(): str_list.append(i) elif i.lower() in str_list and i.lower() not in result_str: str_list.append(i.lower()) else: str_list.append(i.lower()) if len(str_list) != 10: self.refresh() continue result_list = list(result_str) for i in result_list: if not i.isdigit(): for k, v in enumerate(str_list): if i == v: index.append(k) else: if int(i) != 0: for k, v in enumerate(str_list): if i == v: index.append(k) else: for k, v in enumerate(str_list): if i == v or i == 'o': index.append(k) if len(index) != 4: self.refresh() continue key_index = index break self.click_code(key_index) self.login_click() start = time.clock() self.choose_ticker() self.choose_ticker_num() self.insert_shopping() print(time.clock() - start) self.payment_area() print(time.clock() - start) self.personal_data() self.choose_pay_mei() print(time.clock() - start) self.confirm_mei() time.sleep(120)
def crack(): # 保存网页截图 browser.save_screenshot('222.png') # 获取 验证码确定按钮 button = browser.find_element_by_xpath( xpath='//div[@class="geetest_panel"]/a/div') # 获取 验证码图片的 位置信息 img1 = browser.find_element_by_xpath( xpath='//div[@class="geetest_widget"]') location = img1.location size = img1.size top, bottom, left, right = location['y'], location['y'] + size[ 'height'], location['x'], location['x'] + size['width'] print('图片的宽:', img1.size['width']) print(top, bottom, left, right) # 根据获取的验证码位置信息和网页图片 对验证码图片进行裁剪 保存 img_1 = Image.open('222.png') capcha1 = img_1.crop((left, top, right, bottom - 54)) capcha1.save('tu1-1.png') # 接入超级鹰 API 获取图片中的一些参数 (返回的是一个字典) cjy = Chaojiying('zhoufang', '000000', '898324') im = open('tu1-1.png', 'rb').read() content = cjy.PostPic(im, 9004) print(content) # 将图片中汉字的坐标位置 提取出来 positions = content.get('pic_str').split('|') locations = [[int(number) for number in group.split(",")] for group in positions] print(positions) print(locations) # 根据获取的坐标信息 模仿鼠标点击验证码图片 for location1 in locations: print(location1) ActionChains(browser).move_to_element_with_offset( img1, location1[0], location1[1]).click().perform() time.sleep(2) button.click() time.sleep(2) # 失败后重试 lower = browser.find_element_by_xpath( '//div[@class="geetest_table_box"]/div[2]').text print('判断', lower) if '验证成功' in lower: print('登录成功') time.sleep(3) # if lower != '验证失败 请按提示重新操作' and lower != None: # print('登录成功') # time.sleep(3) else: time.sleep(3) print('登录失败') # 登录失败后 , 调用 该函数 , 后台 则对该次判断不做扣分处理 pic_id = content.get('pic_id') print('图片id为:', pic_id) cjy = Chaojiying('zhoufang', '000000', '898324') cjy.ReportError(pic_id) crack()
checkCode = browser.find_element_by_id('txtOldCheckCode') btnReg = browser.find_element_by_id('ButtonRegister') user.send_keys('*****@*****.**') time.sleep(2) pwd.send_keys('mimamima') time.sleep(2) email.send_keys('*****@*****.**') time.sleep(2) browser.save_screenshot('./images/zhiwang.png') img = browser.find_element_by_id('checkcode') left = img.location['x'] #验证码图片左上角横坐标 top = img.location['y'] #验证码图片左上角纵坐标 right = left + img.size['width'] #验证码图片右下角横坐标 bottom = top + img.size['height'] #验证码图片右下角纵坐标 im = Image.open('./images/zhiwang.png') im_crop = im.crop((left, top, right, bottom)) #这个im_crop就是从整个页面截图中再截出来的验证码的图片 im_crop.save('./images/zrecaptchar.png') chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID) # 识别验证码 bytes_array = BytesIO() im_crop.save(bytes_array, format='PNG') strcode = chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND) print(strcode) checkCode.send_keys(strcode['pic_str']) #模拟点击注册按钮 #btnReg.click()