import time
from io import BytesIO
from PIL import Image
from selenium.common.exceptions import TimeoutException
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 os import listdir
from os.path import abspath, dirname
from chaojiying import *
from selenium import webdriver
CHAOJIYING_USERNAME = '1179380391'
CHAOJIYING_PASSWORD = 'wjh07233'
CHAOJIYING_SOFT_ID = '893590'
CHAOJIYING_KIND = '1902'
TEMPLATES_FOLDER = dirname(abspath(__file__)) + '/templates/'
class WeiboCookies():
def __init__(self, username, password, browser):
self.url = 'https://weibo.com'
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)
def open(self):
"""
打开网页输入用户名密码并点击
:return: None
"""
self.browser.delete_all_cookies()
self.browser.get(self.url)
username = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'input[id="loginname"]')))
username.clear()
time.sleep(1)
username.send_keys(self.username)
time.sleep(1)
password = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'input[type="password"]')))
password.clear()
submit = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'div.login_innerwrap a[suda-data="key=tblog_weibologin3&value=click_sign"]')))
password.send_keys(self.password)
time.sleep(1)
submit.click()
def open_again(self,yzm):
yy=self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'input[value="验证码"]')))
submit = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'div.login_innerwrap a[suda-data="key=tblog_weibologin3&value=click_sign"]')))
yy.send_keys(yzm)
time.sleep(1)
submit.click()
def password_error(self):
"""
判断是否密码错误
:return:
"""
try:
return WebDriverWait(self.browser, 5).until(
EC.text_to_be_present_in_element((By.ID, 'errorMsg'), '用户名或密码错误'))
except TimeoutException:
return False
def login_successfully(self):
"""
判断是否登录成功
:return:
"""
try:
return bool(
WebDriverWait(self.browser, 5).until(
EC.presence_of_element_located((By.CLASS_NAME, 'lite-iconf-profile'))))
except TimeoutException:
return False
def get_position(self):
"""
获取验证码位置
:return: 验证码位置元组
"""
img = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'img[node-type="verifycode_image"]')))
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 * 1.25, bottom * 1.25, left * 1.25, right * 1.25)
def get_screenshot(self):
"""
获取网页截图
:return: 截图对象
"""
screenshot = self.browser.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
return screenshot
def get_image(self, name):
"""
获取验证码图片
: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)
bytes_array = BytesIO()
captcha.save(bytes_array, format='PNG')
result = self.chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND)
return result.get('pic_str')
def get_cookies(self):
"""
获取Cookies
:return:
"""
return self.browser.get_cookies()
def main(self):
"""
破解入口
:return:
"""
self.open()
if self.password_error():
return {
'status': 2,
'content': '用户名或密码错误'
}
# 获取验证码图片
yzm=self.get_image('captcha.png')
self.open_again(yzm)
if self.login_successfully():
cookies = self.get_cookies()
return {
'status': 1,
'content': cookies
}
else:
return {
'status': 3,
'content': '登录失败'
}
if __name__ == '__main__':
browser = webdriver.Chrome()
browser.set_window_size(1920, 1080)
result = WeiboCookies('*-****', '****',browser).main()
print(result)
python-新浪微博自动化登录
最新推荐文章于 2023-10-18 17:08:25 发布