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实现哈希表
Feb 07 Python
python基于xml parse实现解析cdatasection数据
Sep 30 Python
Python中的异常处理相关语句基础学习笔记
Jul 11 Python
教你利用Python玩转histogram直方图的五种方法
Jul 30 Python
对Python中Iterator和Iterable的区别详解
Oct 18 Python
python之yield和Generator深入解析
Sep 18 Python
wxPython:python首选的GUI库实例分享
Oct 05 Python
Python基于requests实现模拟上传文件
Apr 21 Python
Tensorflow--取tensorf指定列的操作方式
Jun 30 Python
基于Python+QT的gui程序开发实现
Jul 03 Python
Django如何继承AbstractUser扩展字段
Nov 27 Python
Jupyter Notebook 远程访问配置详解
Jan 11 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中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
php中设置index.php文件为只读的方法
2013/02/06 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
javascript生成json数据简单示例分享
2014/02/14 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
Python中map和列表推导效率比较实例分析
2015/06/17 Python
Python3如何解决字符编码问题详解
2017/04/23 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
python抖音表白程序源代码
2019/04/07 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
2019/12/10 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
求职信的最佳写作思路
2014/02/01 职场文书
上班离岗检讨书
2014/09/10 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android