parent
ad53b5fc8d
commit
0232b9a93c
@ -0,0 +1,142 @@
|
||||
import time
|
||||
from io import BytesIO
|
||||
from PIL import Image
|
||||
from selenium import webdriver
|
||||
from selenium.webdriver import ActionChains
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
from chaojiying import Chaojiying_Client
|
||||
|
||||
|
||||
#账号密码自行设定
|
||||
EMAIL = '18934861725' #b站账号
|
||||
PASSWORD = '1258490786' #b站密码
|
||||
# CHAOJIYING_USERNAME = '123456rom'
|
||||
# CHAOJIYING_PASSWORD = '1234567'
|
||||
CHAOJIYING_USERNAME = '123456yiyiyi' #超级鹰账号
|
||||
CHAOJIYING_PASSWORD = '123456789' #超级鹰密码
|
||||
|
||||
# CHAOJIYING_SOFT_ID = 932562
|
||||
CHAOJIYING_SOFT_ID = 932746 #用户中心>>软件ID 生成一个替换 96001
|
||||
CHAOJIYING_KIND = 9004 #验证码类型
|
||||
|
||||
class Crackclick():
|
||||
def __init__(self):
|
||||
self.url = 'https://passport.bilibili.com/login'
|
||||
self.browser = webdriver.Chrome() #谷歌浏览器
|
||||
self.wait = WebDriverWait(self.browser, 20)
|
||||
self.email = EMAIL
|
||||
self.password = PASSWORD
|
||||
self.chaojiying = Chaojiying_Client(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
|
||||
|
||||
def open(self):
|
||||
'''
|
||||
打开网页,切换验证模式
|
||||
'''
|
||||
self.browser.get(self.url)
|
||||
account = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'type-tab')))
|
||||
account.click()
|
||||
email = self.wait.until(EC.presence_of_element_located((By.ID, 'login-username')))
|
||||
password = self.wait.until(EC.presence_of_element_located((By.ID, 'login-passwd')))
|
||||
email.send_keys(self.email)
|
||||
password.send_keys(self.password)
|
||||
|
||||
def refresh_code(self):
|
||||
'''
|
||||
刷新验证码
|
||||
'''
|
||||
button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_refresh')))
|
||||
return button
|
||||
|
||||
#获取验证码图片
|
||||
def get_element(self):
|
||||
'''获取验证图片对象'''
|
||||
element = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_item_img')))
|
||||
return element
|
||||
|
||||
def get_position(self):
|
||||
'''获取验证码位置'''
|
||||
element = self.get_element()
|
||||
time.sleep(2)
|
||||
elementt = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_item_img')))
|
||||
location = elementt.location
|
||||
size = elementt.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):
|
||||
'''获取网页截图'''
|
||||
screenshot = self.browser.get_screenshot_as_png()#获取页面截图
|
||||
screenshot = Image.open(BytesIO(screenshot))
|
||||
return screenshot
|
||||
|
||||
def get_image(self,name='captcha.png'):
|
||||
'''获取验证码图片'''
|
||||
top, bottom, left, right = self.get_position()
|
||||
print('验证码位置',top,bottom,left,right)
|
||||
screenshot = self.get_screenshot()
|
||||
captcha = screenshot.crop((left,top,right,bottom))
|
||||
return captcha
|
||||
|
||||
#解析识别信息
|
||||
def get_points(self, captcha_result):
|
||||
'''
|
||||
解析识别信息
|
||||
'''
|
||||
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):
|
||||
'''
|
||||
点击验证码
|
||||
'''
|
||||
for location in locations:
|
||||
print(location)
|
||||
ActionChains(self.browser).move_to_element_with_offset(self.get_element(),location[0],location[1]).click().perform()
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
#点击登录
|
||||
def login(self):
|
||||
'''
|
||||
点击登录按钮
|
||||
'''
|
||||
button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'btn.btn-login')))
|
||||
button.click()
|
||||
time.sleep(5)
|
||||
|
||||
#点击确认
|
||||
def confirm(self):
|
||||
'''
|
||||
点击确认按钮
|
||||
'''
|
||||
button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_commit_tip')))
|
||||
button.click()
|
||||
|
||||
#控制流程
|
||||
def crack(self):
|
||||
'''入口'''
|
||||
self.open()
|
||||
self.login()
|
||||
# button = self.refresh_code()
|
||||
# button.click()
|
||||
image = self.get_image()
|
||||
bytes_array = BytesIO()
|
||||
image.save(bytes_array, format='PNG')
|
||||
# 识别验证码
|
||||
result = self.chaojiying.PostPic(bytes_array.getvalue(), CHAOJIYING_KIND)
|
||||
print(result)
|
||||
locations = self.get_points(result)
|
||||
self.touch_click_words(locations)
|
||||
self.confirm()
|
||||
|
||||
if __name__ == "__main__":
|
||||
crack = Crackclick()
|
||||
crack.crack()
|
||||
|
||||
|
||||
|
Loading…
Reference in new issue