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字符串str和字节数组相互转化方法
Mar 18 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
Python批量安装卸载1000个apk的方法
Apr 10 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 Python
浅谈sklearn中predict与predict_proba区别
Jun 28 Python
Pytho爬虫中Requests设置请求头Headers的方法
Sep 22 Python
Django数据统计功能count()的使用
Nov 30 Python
Python 使用dict实现switch的操作
Apr 07 Python
教你用Python写一个植物大战僵尸小游戏
Apr 25 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
PHP设计模式之适配器模式代码实例
2015/05/11 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
JavaScript Prototype对象
2009/01/07 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
利用JS实现数字增长
2016/07/28 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
在Python程序中进行文件读取和写入操作的教程
2015/04/28 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
Python中return函数返回值实例用法
2020/11/19 Python
python包的导入方式总结
2021/03/02 Python
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
linux面试题参考答案(10)
2016/10/26 面试题
个人求职信范文分享
2014/01/06 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书