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 相关文章推荐
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
May 07 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
python脚本执行CMD命令并返回结果的例子
Aug 14 Python
Django关于admin的使用技巧和知识点
Feb 10 Python
keras的ImageDataGenerator和flow()的用法说明
Jul 03 Python
Python爬虫实例——爬取美团美食数据
Jul 15 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
Python中logging日志的四个等级和使用
Nov 17 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 12 Python
Python快速实现一键抠图功能的全过程
Jun 29 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实现网上点歌(二)
2006/10/09 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
用dtree实现树形菜单 dtree使用说明
2011/10/17 Javascript
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
用客户端js实现带省略号的分页
2013/04/27 Javascript
url参数中有+、空格、=、%、&、#等特殊符号的问题解决
2013/05/15 Javascript
Javascript基础教程之for循环
2015/01/18 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
node 命令方式启动修改端口的方法
2018/05/12 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
2018/09/12 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
[07:20]2018DOTA2国际邀请赛寻真——逐梦Mineski
2018/08/10 DOTA
Python中的fileinput模块的简单实用示例
2015/07/09 Python
浅析使用Python搭建http服务器
2019/10/27 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
python 实现逻辑回归
2020/12/30 Python
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
销售人员职业生涯规划范文
2014/03/01 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
开学典礼策划方案
2014/05/28 职场文书
大学生简历求职信
2014/06/24 职场文书
学校就业保障协议书
2019/06/24 职场文书