Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4584637
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: Python/Ruby

2014-02-07 12:30:58

文章来源:http://blog.csdn.net/aiuaiuaiu/article/details/7979030

这几天研究python(2.7)模拟新浪微博登陆,在网上找了一些资料并使用IE浏览器和httpwatch进行实践,总结出来新浪微博的登陆过程:2个get方法和1个post方法


第一个GET方法

首先当我们打开的时候就会从新浪服务器取得2个参数servertime和nonce,这两个参数提供给登陆微博使用,里面具体得到参数是通过http协议得到的。

得到的方法是 访问url:' + username + '&client=ssologin.js(v1.3.18),uersname是经过base64加密的结果即可通过解析json格式数据得到,其中username在打开时候被指定为undefine


第二个post方法

请求的消息都可以抄袭浏览器信息,需要自己填写的只有4个:su(加密的用户名),sp(加密密码),servertime,nonce,取得的结果正则一下得到location.replace里面的连接


第三个GET方法

访问上面的连接就可以得到cookie了


源码附上没有取得cookie的代码先记录一下

#coding=utf8
import urllib2
import urllib
import base64
import hashlib
import re
import sys


def encryptUserName(username):
    """
    先将username进行urlcode转码,再进行base64编码,如果模拟登陆使用还需要进行一次urlcode转码
    """
    username = urllib2.quote(username)
    username = base64.encodestring(username)[:-1]
    return username


def encryptPassword(pwd, servertime, nonce):
    """
    将密码进行sha1算法加密,将加密结果再次进行sha1算法加密,将得到的结果和servertime和nonce拼接然后再进行sha1加密
    """
    pwd1 = hashlib.sha1(pwd).hexdigest()  
    pwd2 = hashlib.sha1(pwd1).hexdigest()  
    pwd3_ = pwd2 + servertime + nonce  
    pwd3 = hashlib.sha1(pwd3_).hexdigest()  
    return pwd3
    
def getServerNonce(username):
    """
    取得新浪的servertime和nonce利用url取得结果再对结果进行解析
    url的拼写:' + username + '&client=ssologin.js(v1.3.18),uersname是经过base64加密的结果
    取得的是json格式的数据,然后解析正则匹配取得servertime和nonce    
    """
    username = encryptUserName(username)
    username = urllib2.quote(username)
    url = '' + username + '&client=ssologin.js(v1.3.18)'
    try:
        data = urllib2.urlopen(url).read()
        data = str(data)
        time = re.findall(r'.*?servertime":(.*?),', data)[0]
        nonce = re.findall(r'.*?nonce":"(.*?)".*?', data)[0]
        return time,nonce
    except:
        s=sys.exc_info()
        msg = (u"getPanelInfo Error %s happened on line %d" % (s[1],s[2].tb_lineno))
        raise Exception,msg


def login(username, password):
    """
    新浪登陆过程:
    1.在打开时候会向服务器取得nonce和servertime,调用getServerNonce函数得到参数为undefine
    2.然后利用nonce和servertime拼出post数据发送数据取得返回数据从里面提取到url
    3.再次进行交互取得登陆cookie
    """
    servertime=[]
    nonce=[]
    url = '(v1.4.2)'
    try:
        servertime,nonce = getServerNonce(username)
    except Exception,ex:
         raise Exception,ex


    postdata = {
    'encoding': 'UTF-8',
    'entry': 'weibo',  
    'gateway': '1',
    'nonce': '',  
    'from': '',
    'prelt':'18',
    'pwencode':'rsa2',
    'returntype': 'META',
    'savestate': '7',
    'service': 'miniblog',
    'ssosimplelogin': '1',
    'url': '', 
    'userticket': '1',    
    'vsnf': '1',  
    'vsnval': '',  
    'su': '',    
    'servertime': '',  
    'nonce': '',   
    'sp': '',  
    }
    postdata['servertime'] = servertime  
    postdata['nonce'] = nonce  
    postdata['su'] = encryptUserName(username)  
    postdata['sp'] = encryptPassword(password, servertime, nonce)  
    postdata = urllib.urlencode(postdata)
    headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'}
    req = urllib2.Request(  
        url=url,  
        data=postdata,  
        headers=headers
    )  
    try:
        result = urllib2.urlopen(req)
        text = result.read()
        text = str(text)
        login_url = re.findall(r'.*?location.replace..(.*)..;', text)[0]
        print login_url
        urllib2.urlopen(login_url)  
        print u"登录成功!"  
    except:  
        print 'Login error!'
    
if __name__ == '__main__':
        login('*', '*')


阅读(760) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~