python使用rsa加密算法模块模拟新浪微博登录


Posted in Python onJanuary 22, 2014

PC登录新浪微博时,在客户端用js预先对用户名、密码都进行了加密,而且在POST之前会GET一组参数,这也将作为POST_DATA的一部分。这样,就不能用通常的那种简单方法来模拟POST登录(比如人人网)。

通过爬虫获取新浪微博数据,模拟登录是必不可少的。

1、在提交POST请求之前,需要GET获取四个参数(servertime,nonce,pubkey和rsakv),不是之前提到的只是获取简单的servertime,nonce,这里主要是由于js对用户名、密码加密方式改变了。

1.1 由于加密方式的改变,我们这里将使用到RSA模块,有关RSA公钥加密算法的介绍可以参考网络中的有关内容。下载并安装rsa模块:

下载:https://pypi.python.org/pypi/rsa/3.1.1

rsa模块文档地址:http://stuvel.eu/files/python-rsa-doc/index.html

根据自己的Python版本选择适合自己的rsa安装包(.egg),在win下安装需要通过命令行使用easy_install.exe(win上安装setuptool从这里下载:setuptools-0.6c11.win32-py2.6.exe 安装文件 )进行安装,例如:easy_install rsa-3.1.1-py2.6.egg,最终命令行下测试import rsa,未报错则安装成功。

1.2 获得以及查看新浪微博登录js文件

查看新浪通行证url (http://login.sina.com.cn/signup/signin.php)的源代码,其中可以找到该js的地址 http://login.sina.com.cn/js/sso/ssologin.js,不过打开后里面的内容是加密过的,可以在网上找个在线解密站点解密,查看最终用户名和密码的加密方式。

1.3 登录

登录第一步,添加自己的用户名(username),请求prelogin_url链接地址:

prelogin_url = 'http://login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&client=ssologin.js(v1.4.4)' % username

使用get方法得到以下类似内容:

sinaSSOController.preloginCallBack({"retcode":0,"servertime":1362041092,"pcid":"gz-6664c3dea2bfdaa3c94e8734c9ec2c9e6a1f","nonce":"IRYP4N","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","exectime":1})

进而从中提取到我们想要的servertime,nonce,pubkey和rsakv。当然,pubkey和rsakv的值我们可以写死在代码中,它们是固定值。

 

2、之前username 经过BASE64计算:

username_ = urllib.quote(username)
username = base64.encodestring(username)[:-1]

password经过三次SHA1加密,且其中加入了 servertime 和 nonce 的值来干扰。即:两次SHA1加密后,结果加上servertime和nonce的值,再SHA1算一次。

在最新的rsa加密方法中,username还是以前一样的处理;

password加密方式和原来有所不同:

2.1 先创建一个rsa公钥,公钥的两个参数新浪微博都给了固定值,不过给的都是16进制的字符串,第一个是登录第一步中的pubkey,第二个是js加密文件中的‘10001'。

这两个值需要先从16进制转换成10进制,不过也可以写死在代码里。这里就把10001直接写死为65537。代码如下:

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进制。

2.2 请求通行证url:login_url =‘http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)'

需要发送的报头信息

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'
    }

请求的内容中添加了rsakv,将pwencode的值修改为rsa2,其他跟以前一致。

将参数组织好,POST请求。检验是否登录成功,可以参考POST后得到的内容中的一句 location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3");

如果retcode=101则表示登录失败。登录成功后结果与之类似,不过retcode的值是0。

3、登录成功后,在body中的replace信息中的url就是我们下一步要使用的url。然后对上面的url使用GET方法来向服务器发请求,保存这次请求的Cookie信息,就是我们需要的登录Cookie了。

Python 相关文章推荐
python使用百度翻译进行中翻英示例
Apr 14 Python
python人人网登录应用实例
Sep 26 Python
编写Python的web框架中的Model的教程
Apr 29 Python
深入分析python中整型不会溢出问题
Jun 18 Python
python爱心表白 每天都是浪漫七夕!
Aug 18 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
Django model select的多种用法详解
Jul 16 Python
Pycharm中Python环境配置常见问题解析
Jan 16 Python
Tensorflow不支持AVX2指令集的解决方法
Feb 03 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
Python  序列化反序列化和异常处理的问题小结
Dec 24 Python
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
Jan 22 #Python
使用python的chardet库获得文件编码并修改编码
Jan 22 #Python
使用go和python递归删除.ds store文件的方法
Jan 22 #Python
python学习手册中的python多态示例代码
Jan 21 #Python
python pdb调试方法分享
Jan 21 #Python
python发送邮件接收邮件示例分享
Jan 21 #Python
python逐行读取文件内容的三种方法
Jan 20 #Python
You might like
第1次亲密接触PHP5(2)
2006/10/09 PHP
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
PHP处理excel cvs表格的方法实例介绍
2013/05/13 PHP
php分页函数完整实例代码
2014/09/22 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
javascript每日必学之封装
2016/02/23 Javascript
浅谈js基本数据类型和typeof
2016/08/09 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
事业单位接收函
2014/01/10 职场文书
校运会入场式解说词
2014/02/10 职场文书
保安队长职务说明书
2014/02/23 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
简易版租房协议书范本
2014/10/13 职场文书
数学教师个人总结
2015/02/06 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
JVM钩子函数的使用场景详解
2021/08/23 Java/Android