实例3:requests微博登录

实例网站:微博(https://login.sina.com.cn/sso/prelogin.php)

实例工具:requests

模块:re,io,requests,binascii,base64,json

import requests
import re
import base64
import time
import json
from io import BytesIO
from chaojiying import Chaojiying_Client
import rsa
import binascii


class CookieWeibo(object):
    def __init__(self, un, pw):
        self.un = self.enrcryt_un(un)
        self.pw = pw
        self.session = requests.session()
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
        }

    # 加密user
    def enrcryt_un(self, un):
        return base64.b64encode(un.encode())

    # 加密password
    def enrcrpy_pw(self, pw, result):
        pubkey = rsa.PublicKey(int(result['pubkey'], 16), int('10001', 16))
        pw_str = str(result['servertime']) + '	' + result['nonce'] + '
' + pw
        sp = binascii.b2a_hex(rsa.encrypt(pw_str.encode(), pubkey)).decode()
        # print(sp)
        return sp

    # 预登陆
    def prelogin(self):
        url = 'https://login.sina.com.cn/sso/prelogin.php'
        # 构建参数
        params = {
            'entry': 'weibo',
            'callback': 'sinaSSOController.preloginCallBack',
            'su': self.un,
            'rsakt': 'mod',
            'checkpin': '1',
            'client': 'ssologin.js(v1.4.19)',
            '_': round(time.time() * 1000)
        }
        resp = self.session.get(url, headers=self.headers, params=params, verify=False)
        result = re.findall('preloginCallBack((.*?))', resp.text)[0]
        return json.loads(result)

    # 获取验证码
    def get_yan(self, result):
        if result['showpin'] == 1:
            url = 'https://login.sina.com.cn/cgi/pin.php'
            params = {
                'r': '83661264',
                's': '0',
                'p': result['pcid']
            }
            resp = self.session.get(url, headers=self.headers, params=params, verify=False)
            pic = BytesIO(resp.content).getvalue()
            cjy = Chaojiying_Client('m125705171', 'm1257051717', '898279')
            yz = cjy.PostPic(pic, 1005)
            # print(yz)
            return yz['pic_str']
        else:
            return None

    # 模拟登陆
    def login(self, result, captcha):
        url = 'https://login.sina.com.cn/sso/login.php'
        data = {
            'entry': 'weibo',
            'gateway': '1',
            'from': '',
            'savestate': '7',
            'qrcode_flag': 'false',
            'useticket': '1',
            'pagerefer': '',
            'wsseretry': 'servertime_error',
            'vsnf': '1',
            'su': self.un,
            'service': 'miniblog',
            'servertime': result['servertime'],
            'nonce': result['nonce'],
            'pwencode': 'rsa2',
            'rsakv': result['rsakv'],
            'sp': self.enrcrpy_pw(self.pw, result),
            'sr': '1536*864',
            'encoding': 'UTF-8',
            'prelt': '231',
            'url': 'https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
            'returntype': 'META'
        }
        if captcha:
            data['pcid'] = result['pcid']
            data['door'] = captcha

        resp = self.session.post(url, headers=self.headers, data=data, verify=False)
        # print(resp.text)
        url_2 = re.findall(r'replace("(.*?)");', resp.text)[0]
        # print(url_2)
        return url_2

    # 模拟登陆,第二部
    def url_next(self, url_2):
        resp = self.session.get(url_2, headers=self.headers, verify=False)
        # print(resp.text)
        next_i = re.findall(r'arrURL":["(.*?)","(.*?)","(.*?)","(.*?)"]', resp.text)[0]
        # print(next_i)
        for i in next_i:
            i = i.replace('\', '')
            self.session.get(i, headers=self.headers, verify=False)

    # 启动程序
    def run(self):
        result = self.prelogin()
        url_2 = self.login(result, self.get_yan(result))
        print(url_2)
        self.url_next(url_2)
        self.verify()

    # 验证
    def verify(self):
        resp = self.session.get('https://weibo.com/u/3033624331/home', headers=self.headers)
        print(resp.text)


if __name__ == '__main__':
    a = Cookie_Weibo('user', 'password')
    a.run()
原文地址:https://www.cnblogs.com/xjl-dwy/p/10732769.html