• 实例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()
    
  • 相关阅读:
    docker运行爬虫代码
    python语法之流程控制(if while for)
    python基本数据类型
    python基本运算符
    python用户交互与格式化输出
    jieba模块基本介绍
    wordcloud库基本介绍
    计算机基础之编程语言
    计算机基础
    python入门之流程控制
  • 原文地址:https://www.cnblogs.com/xjl-dwy/p/10732769.html
Copyright © 2020-2023  润新知