zoukankan      html  css  js  c++  java
  • 新浪微博登陆




    import rsa
    import re
    import json
    import time
    import requests
    import base64
    import urllib3
    import binascii
    urllib3.disable_warnings()
    class Weibo_login():
    def __init__(self,username,password):
    self.user_name = username
    self.pass_word = password
    self.session = requests.session()
    def login(self):
    json_data = self.get_json_data() #第一次请求, 获取服务端返回的参数
    if not json_data:
    return False
    pass_word = self.get_password(json_data['servertime'],json_data['nonce'],json_data['pubkey'])

    post_data = {
    'entry': 'weibo',
    'gateway': '1',
    'from': '',
    'savestate': '7',
    'qrcode_flag': 'false',
    'useticket': '1',
    #'pagerefer': 'https://www.baidu.com/',
    'vsnf': '1',
    'su': self.username, #通过bs64加密后的得到的
    'service': 'miniblog',
    'servertime': json_data['servertime'],
    'nonce': json_data['nonce'],
    'pwencode': 'rsa2',
    'rsakv': json_data['rsakv'],
    'sp': pass_word, #通过rsa加密过的pass_word
    'sr': '1920*1080',
    'encoding': 'UTF-8',
    'prelt': 28,
    'url': 'https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
    'returntype': 'META'
    }
    login_url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'
    response_data = self.session.post(login_url,data=post_data,verify=False)

    print(response_data.content.decode('gbk')) #先转成二进制, 然后转成dbk

    #第一次跳转
    url1 = re.findall(r'location.replace\("(.*?)"\)',response_data.content.decode('gbk'))[0] #加上[0]就会变的 只剩下想要的数据
    print("要打印的url:",url1)

    #打印,获取第二次跳转的url
    result = self.session.get(url1).content.decode('gbk')
    print("result",result)

    #第三次跳转
    url1 = re.findall(r"location.replace\('(.*?)'\)",result)[0]
    print("打印url1******************:",url1)

    #访问url1
    self.session.get(url1,verify=False)
    print(self.session.get("https://weibo.com/u/6382564064/home",verify=False).content.decode()) #可以随意访问已经登录的网页

    def get_password(self,servertime,nonce,pubkey):
    s = str(servertime)+'\t'+str(nonce)+'\n'+str(self.pass_word)
    public_key = rsa.PublicKey(int(pubkey,16),int('10001',16))
    password = rsa.encrypt(s.encode(),public_key)
    #print(binascii.b2a_hex(password))
    return binascii.b2a_hex(password).decode()

    def get_username(self):
    self.username = base64.b64encode(self.user_name.encode()) #对传进去的进行编码
    def get_json_data(self,):
    '''
    #这个就是按下tab以后, 产生的get请求
    前面的请求就是为了给后面的post请求铺路
    '''
    params = {
    'entry':'weibo',
    'callback':'sinaSSOController.preloginCallBack',
    'su':self.username,
    'rsakt':'mod',
    'checkpin':'1',
    'client':'ssologin.js(v1.4.19)',
    '_':int(time.time()*1000),
    }
    response = self.session.get('https://login.sina.com.cn/sso/prelogin.php?',params = params,verify=False) #?号后面的都是一些参数
    #这个正则表达式很棒
    '''
    preloginCallBack\( 开始
    (.*?)这里面的都要
    \) 为结束

    json.loads 转成字典格式
    '''
    try:
    json_loads = json.loads(re.findall(r'preloginCallBack\((.*?)\)',response.text)[0]) #****重点来了\(的意思是从preloginCallBack(开始 ,到\)结束的所有都要 (.*?)匹配全部
    except:
    json_loads = {}
    #print(json_loads)
    return json_loads
    if __name__ == '__main__':
    login = Weibo_login('手机号','密码') #先设置账号密码
    login.get_username() #给传过去的账号密码进行加密
    login.get_json_data() #开始请求
    login.login()
  • 相关阅读:
    vue使用Highcharts图表
    Laya 骨骼动画播放
    unity3d学习笔记
    unity学习笔记
    Laya本地存储对象,读取上来之后没有类方法了
    Laya2学习笔记
    Laya vscode f5断点调试开启
    fairyGUI学习笔记
    使用docker安装swoole环境
    docker学习笔记
  • 原文地址:https://www.cnblogs.com/yuanjia8888/p/8822108.html
Copyright © 2011-2022 走看看