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)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值