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 相关文章推荐
记录Django开发心得
Jul 16 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
python实现图片处理和特征提取详解
Nov 13 Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 Python
Python的多维空数组赋值方法
Apr 13 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
利用PyTorch实现VGG16教程
Jun 24 Python
Python 中如何写注释
Aug 28 Python
Python实现socket库网络通信套接字
Jun 04 Python
Pytorch中Softmax和LogSoftmax的使用详解
Jun 05 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
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
PHP里的中文变量说明
2011/07/23 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
javascript 全等号运算符使用说明
2010/05/31 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
简介JavaScript中Boolean.toSource()方法的使用
2015/06/05 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
Python中实现从目录中过滤出指定文件类型的文件
2015/02/02 Python
python 数据的清理行为实例详解
2017/07/12 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
python:动态路由的Flask程序代码
2019/11/22 Python
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
中英文自我评价常用句型
2013/12/19 职场文书
物流管理专业毕业生求职信
2014/03/23 职场文书
生日寄语大全
2014/04/08 职场文书
2015年车间管理工作总结
2015/07/23 职场文书