话不多说,自己看代码
import time
from PIL import Image
from io import BytesIO
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import ActionChains
import requests
from hashlib import md5
class Chaojiying_Client(object):
def __init__(self, username, password, soft_id):
self.username = username
self.password = md5(password.encode('utf8')).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 PostPic(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 ReportError(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()
# 哔哩哔哩的用户名. 密码
UERSNAME = ' '
PASSWORD = ' '
# '超级鹰用户名', '超级鹰用户名的密码',软件ID
Chaojiying_UERSNAME = ' '
Chaojiying_PASSWORD = ''
Chaojiying_ID = ' '
Chaojiying_TYPE = ' '
class jianshuLogin():
'''
方法类里面的写法----------用反向思维
'''
def __init__(self):
self.driver = webdriver.Chrome()
self.url = 'https://passport.bilibili.com/login'
# 显示等待
self.show_wait = WebDriverWait(self.driver, 30)
self.username = UERSNAME
self.password = PASSWORD
self.Chaojiying_Client = Chaojiying_Client(Chaojiying_UERSNAME, Chaojiying_PASSWORD, Chaojiying_ID)
def click_qr(self):
'''
验证码的点击确认按钮
:return:
元素:geetest_commit_tip
'''
self.driver.find_element_by_class_name('geetest_commit_tip').click()
def click_words(self, locations):
'''
点击文字验证图片
:param locations:
:return:
'''
for location in locations:
print(location)
ActionChains(self.driver).move_to_element_with_offset(self.get_image_element(), location[0], location[1]).click().perform()
time.sleep(2)
def get_image_points(self, captcha_results):
'''
获取超级鹰识别图片中文字所在的位置坐标,然后把结果做返回
:param identify_results: 识别图片后的结果
:return:
'''
list_all = captcha_results.get('pic_str').split('|')
# str ----int i list
locations = [[int(number) for number in list1.split(',')] for list1 in list_all]
return locations
def get_image_element(self):
'''
获取验证图片CCS div元素所有的元素。
:return:
获取整个验证图片。
'''
element = self.show_wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.geetest_silver')))
return element
def get_positon(self):
'''
获取验证码的位置
:return:
'''
element = self.get_image_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_image_touch(self, name='Captcha.png'):
'''
获取点击验证码的图片
:return:
'''
top, bottom, left, right = self.get_positon()
print('验证码位置', top, bottom, left, right)
screenshot = self.get_screenshot()
captcha = screenshot.crop((left, top, right, bottom))
captcha.save(name)
return captcha
def get_screenshot(self):
'''
获取页面截图 ,并且以BytesIO进行保存
:return:
'''
screenshot = self.driver.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
return screenshot
def get_login_button(self):
'''
找到登陆的按钮
:return:
sign-in-form-submit-btn
'''
button = self.show_wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@class="btn btn-login"]')))
return button
def enter_account(self):
'''
请求登陆页面, 在输入账号和密码
:return:
session_email_or_mobile_number
session_password
'''
# 原始第一步, 请求登陆的url
self.driver.get(self.url)
time.sleep(2)
self.driver.find_element_by_id('login-username').send_keys(self.username)
time.sleep(5)
self.driver.find_element_by_id('login-passwd').send_keys(self.password)
time.sleep(5)
# MVT ---- V
def login(self):
'''
登陆逻辑 , ----- 正向的思维
:return:
'''
# 打开简书登陆页面
self.enter_account()
# 找到登录页面按钮, click
click_button = self.get_login_button()
click_button.click()
# 获取点触的验证码图片------ 超级鹰 ----
img = self.get_image_touch()
# 把图片以一种bytes类型保存到内存中 BytesIO
# 想要操作二进制数据,就需要使用BytesIO。
# 实例化BytesIO对像
f = BytesIO()
# upper()小写变大写 lower()大写变小写
img.save(f, format='png')
# 两种方法可以把原图片以二进制的形式读取出来在做传参
# im = open('Captcha.png', 'rb').read()
# 识别验证码
response = self.Chaojiying_Client.PostPic(f.getvalue(), Chaojiying_TYPE)
print(response)
# 获取点击的坐标位置
locations = self.get_image_points(response)
# 点击位置
self.click_words(locations)
# 点击验证码的确认按钮
self.click_qr()
print("登陆成功")
if __name__ == '__main__':
jianshuLogin = jianshuLogin()
jianshuLogin.login()