python-新浪微博自动化登录

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-新浪微博自动化登录)