环境介绍
Python:3.7.7
PyCharm:2019.2.6
Chrome浏览器:89.0.4389.114
创建三个python项目文件,分别存放主代码、对接第三方代码和账号密码
注册第三方平台账号
这里我用的是快识别:http://www.kuaishibie.cn/,注册后充值一元即可
填写账号与密码
userandpasswd.py
---
USER_NAME = **** #bilibili平台账号
USER_PASSWD = '****' #bilibili平台账号密码
KSB_NAME = '******' #快识别注册的账号
KSB_PASSWD = '******' #快识别的密码
对接第三方平台
kuaishibie.py
---
import base64
import json
import requests
def base64_api(uname, pwd, img):
with open(img, 'rb') as f:
base64_data = base64.b64encode(f.read())
b64 = base64_data.decode()
data = {"username": uname, "password": pwd, "image": b64,"typeid": '27'}
result = json.loads(requests.post("http://api.ttshitu.com/imageXYPlus", json=data).text)
if result['success']:
return result["data"]["result"]
else:
return result["message"]
获取Chrome驱动
下载地址:http://npm.taobao.org/mirrors/chromedriver/
要下载与电脑上Chrome浏览器版本一致的驱动,否则会报错
编写主程序
logging_bilibili.py
---
import time
from userandpasswd import USER_NAME,USER_PASSWD,KSB_PASSWD,KSB_NAME # 导入用户名和密码
from selenium import webdriver # 导入浏览器
from PIL import Image #用来剪切图像
from selenium.webdriver import ActionChains # 导入动作链模块
from kuaishibie import base64_api
add = "https://passport.bilibili.com/login" #bilibili登录地址
class loggin_in():
def __init__(self,url):
self.address = url
def loginweb(self):
# 创建一个浏览器对象
driver = webdriver.Chrome(executable_path='chromedriver.exe')
#打开请求的网页
driver.get(self.address)
#等待浏览器渲染加载页面完成,单位为秒,隐式等待
driver.implicitly_wait(20)
# 最大化浏览器
driver.maximize_window()
# 输入用户名
user_input = driver.find_element_by_xpath('//*[@id="login-username"]') #用户名标签
user_input.send_keys(USER_NAME)
time.sleep(1.5)
# 输入密码
passwd_input = driver.find_element_by_xpath('//*[@id="login-passwd"]') #密码框标签
passwd_input.send_keys(USER_PASSWD)
time.sleep(1.5)
#点击登录按钮
logging_input = driver.find_element_by_xpath('//*[@id="geetest-wrap"]/div/div[5]/a[1]') #点击登录
logging_input.click()
#找到验证码对应的图片标签,如果用xpath取不到图片可以用css选择器
img_label = driver.find_element_by_css_selector('body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_no_logo.geetest_panelshowclick > div.geetest_panel_next > div')
#保存图片
# img_label.screenshot('yzm.png')
#无法完整保存点选图片的可以通过截取浏览器全屏,然后再从大图截取点选图片
driver.save_screenshot('big.png') #截取全屏
#获取点选图片的像素大小
print('左上角坐标:'+str(img_label.location)) # location可以获取这个图片左上角坐标
print('图片大小:' + str(img_label.size))
print('图片高:'+ str(img_label.size['height'])) # size可以获取这个图片的宽(width)和高(height)
print('图片宽:' + str(img_label.size['width']))
#获取点选图片像素位置
top = img_label.location['y']
left = img_label.location['x']
right = img_label.location['x']+img_label.size['width']
down = img_label.location['y']+img_label.size['height']
# 截取需要的点选图片
im = Image.open('big.png') #打开图片
im = im.crop((left,top,right,down)) #参数按照左,上,右,下
im.save('yzm.png')
#对接打码平台识别验证码
code_result = base64_api(KSB_NAME,KSB_PASSWD,'yzm.png')
print(code_result)
result_list = code_result.split('|')
for result in result_list:
x = result.split(',')[0] #获取点选图片位置
y = result.split(',')[1]
ActionChains(driver).move_to_element_with_offset(img_label,int(x),int(y)).click().perform() #执行整个鼠标动作链
driver.find_element_by_css_selector('body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_no_logo.geetest_panelshowclick > div.geetest_panel_next > div > div > div.geetest_panel > a > div').click()
# input() #阻塞浏览器不被关闭
driver.quit() #关闭浏览器
if __name__ == '__main__':
run = loggin_in
run(add).loginweb()