ypj658
11/1/2017 - 7:27 AM

使用python登陆微博

#-------------------------------------------------------------------------------
# Name:        weibo登录模块
# Purpose:
#
# Author:      bluebird
#
# Created:     01/02/2016
# Copyright:   (c) bluebird 2016
# Licence:     <your licence>
#-------------------------------------------------------------------------------
from urllib import request
import re,json,base64

class WeiBoLogin:
    def __init__(self,uid,pwd,enableProxy=False):
        '''初始化WeiboLogin,enableProxy表示是否使用代理服务器,默认关闭'''

        print("正在初始化登录……")
        self.username=uid
        self.password=pwd
        self.enableProxy=enableProxy
        self.serverUrl= "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.11)&_=1379834957683"
        self.loginUrl= "http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)"
        self.posthead= {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0'}


    def login(self):
        self.EnableCookie(self.enableProxy) #cookie或代理服务器配置
        serverTime, nonce, pubkey, rsakv = GetServerData()#登陆的第一步
        postData = PostEncode(self.username, self.password, serverTime, nonce, pubkey, rsakv)#加密用户和密码
        print("Post data length:%s\n" %len(postData))

        req = request.Request(self.loginUrl, postData, self.posthead)
        result = request.urlopen(req)#登陆的第二步——解析新浪微博的登录过程中3
        text = result.read()
        try:
            p = re.compile('location\.replace\([\'"](.*?)[\'"]\)')
            loginUrl = p.search(text).group(1)  #解析重定位结果
            request.urlopen(loginUrl)
        except:
            print('Login error!')
            return False

        print('Login sucess!')
        return True


    def EnableCookie(self,enableProxy):
       cookiejar=cookiejar.LWPCookieJar()
       cookie_support=request.HTTPCookieProcessor(cookie)

       if enableProxy:
            proxy_support=request.ProxyHandler({'http':'http://xxxxx.pac'})
            opener=request.build_opener(proxy_support,cookie_support,request.HTTPHandler)
            print("已经支持代理")
       else:
            opener=request.build_opener(cookie_support,request.HTTPHandler)

       request.install_opener(opener)


    def GetServerData(self):
        serverdata=request.urlopen(self.serverUrl).read()

        p = re.compile('\((.*)\)')
        jsonData = p.search(serverdata).group(1)
        data = json.loads(jsonData)
        serverTime = str(data['servertime'])
        nonce = data['nonce']
        pubkey = data['pubkey']
        rsakv = data['rsakv']
##        servertime = re.findall('"servertime":(.*?),' , preLogin)[0]
##        pubkey = re.findall('"pubkey":"(.*?)",' , preLogin)[0]
##        rsakv = re.findall('"rsakv":"(.*?)",' , preLogin)[0]
##        nonce = re.findall('"nonce":"(.*?)",' , preLogin)[0]

        return serverTime, nonce, pubkey, rsakv

    def PostEncode(userName, passWord, serverTime, nonce, pubkey, rsakv):
        "Used to generate POST data"

        encodedUserName = GetUserName(userName)#用户名使用base64加密
        encodedPassWord = get_pwd(passWord, serverTime, nonce, pubkey)#目前密码采用rsa加密
        postPara = {
            'entry': 'weibo',
            'gateway': '1',
            'from': '',
            'savestate': '7',
            'userticket': '1',
            'ssosimplelogin': '1',
            'vsnf': '1',
            'vsnval': '',
            'su': encodedUserName,
            'service': 'miniblog',
            'servertime': serverTime,
            'nonce': nonce,
            'pwencode': 'rsa2',
            'sp': encodedPassWord,
            'encoding': 'UTF-8',
            'prelt': '115',
            'rsakv': rsakv,
            'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
            'returntype': 'META'
        }
        postData = urllib.parse.urlencode(postPara).encode('utf-8') #网络编码

        return postData

    def GetUserName(userName):
        "Used to encode user name"

        userNameTemp = request.quotee(userName)
        userNameEncoded = base64.encodestring(bytes(userNameTemp , encoding = 'utf-8'))
        return userNameEncoded


    def get_pwd(password, servertime, nonce, pubkey):
        rsaPublickey = int(pubkey, 16)
        key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
        message =  bytes(str(servertime) + '\t' + str(nonce) + '\n' + str(pwd) , encoding = 'utf-8') #拼接明文js加密文件中得到
        passwd = rsa.encrypt(message, key) #加密
        passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
        return passwd