Python 模拟登录新浪微博

# -*- coding: utf-8 -*-
########################
#author:Andrewseu
#date:2015/9/23
#login weibo
########################

import sys
import urllib
import urllib2
import cookielib
import base64
import re
import json
import rsa
import binascii
#import requests
#from bs4 import BeautifulSoup

#新浪微博的模拟登陆
class weiboLogin:
    def enableCookies(self):
            #获取一个保存cookies的对象
            cj = cookielib.CookieJar()
            #将一个保存cookies对象和一个HTTP的cookie的处理器绑定
            cookie_support = urllib2.HTTPCookieProcessor(cj)
            #创建一个opener,设置一个handler用于处理http的url打开
            opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
            #安装opener,此后调用urlopen()时会使用安装过的opener对象
            urllib2.install_opener(opener)

    #预登陆获得 servertime, nonce, pubkey, rsakv
    def getServerData(self):
            url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=ZW5nbGFuZHNldSU0MDE2My5jb20%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=1442991685270'
            data = urllib2.urlopen(url).read()
            p = re.compile('\((.*)\)')
            try:
                    json_data = p.search(data).group(1)
                    data = json.loads(json_data)
                    servertime = str(data['servertime'])
                    nonce = data['nonce']
                    pubkey = data['pubkey']
                    rsakv = data['rsakv']
                    return servertime, nonce, pubkey, rsakv
            except:
                    print 'Get severtime error!'
                    return None


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

    #获取加密的用户名
    def getUsername(self, username):
            username_ = urllib.quote(username)
            username = base64.encodestring(username_)[:-1]
            return username

     #获取需要提交的表单数据
    def getFormData(self,userName,password,servertime,nonce,pubkey,rsakv):
        userName = self.getUsername(userName)
        psw = self.getPassword(password,servertime,nonce,pubkey)

        form_data = {
            'entry':'weibo',
            'gateway':'1',
            'from':'',
            'savestate':'7',
            'useticket':'1',
            'pagerefer':'http://weibo.com/p/1005052679342531/home?from=page_100505&mod=TAB&pids=plc_main',
            'vsnf':'1',
            'su':userName,
            'service':'miniblog',
            'servertime':servertime,
            'nonce':nonce,
            'pwencode':'rsa2',
            'rsakv':rsakv,
            'sp':psw,
            'sr':'1366*768',
            'encoding':'UTF-8',
            'prelt':'115',
            'url':'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
            'returntype':'META'
            }
        formData = urllib.urlencode(form_data)
        return formData

    #登陆函数
    def login(self,username,psw):
            self.enableCookies()
            url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)'
            servertime,nonce,pubkey,rsakv = self.getServerData()
            formData = self.getFormData(username,psw,servertime,nonce,pubkey,rsakv)
            headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0'}
            req  = urllib2.Request(
                    url = url,
                    data = formData,
                    headers = headers
            )
            result = urllib2.urlopen(req)
            text = result.read()
            print text
            #还没完!!!这边有一个重定位网址,包含在脚本中,获取到之后才能真正地登陆
            p = re.compile('location\.replace\([\'"](.*?)[\'"]\)')
            try:
                    login_url = p.search(text).group(1)
                    print login_url
                    #由于之前的绑定,cookies信息会直接写入
                    urllib2.urlopen(login_url)
                    print "Login success!"
            except:
                    print 'Login error!'
                    return 0

            #访问主页,把主页写入到文件中
            url = 'http://weibo.com/u/2679342531/home?topnav=1&wvr=6'
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            text = response.read()
            fp_raw = open("e://weibo.html","w+")
            fp_raw.write(text)
            fp_raw.close()
            #print text

wblogin = weiboLogin()
print '新浪微博模拟登陆:'
username = raw_input(u'用户名:')
password = raw_input(u'密码:')
wblogin.login(username,password)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值