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程序实例(通讯录)
Nov 29 Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
python读取Excel实例详解
Aug 17 Python
python opencv 二值化 计算白色像素点的实例
Jul 03 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
Python龙贝格法求积分实例
Feb 29 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
Python-split()函数实例用法讲解
Dec 18 Python
使用Django实现商城验证码模块的方法
Jun 01 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自定义函数实现代码
2011/12/30 PHP
PHP多例模式介绍
2013/06/24 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
jQuery实现冻结表头的方法
2015/03/09 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
Python读写配置文件的方法
2015/06/03 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
美国折扣宠物药房:Total Pet Supply
2018/05/27 全球购物
Vision Direct比利时:在线订购隐形眼镜
2019/08/27 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
大学毕业生通用自荐信范文
2013/10/31 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
创意婚礼策划方案
2014/05/18 职场文书
运动会跳远广播稿5篇
2014/09/17 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
党支部半年考察意见
2015/06/01 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏
Fluentd搭建日志收集服务
2022/09/23 Servers