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复制与引用用法分析
Apr 08 Python
Python计算三角函数之asin()方法的使用
May 15 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
python并发和异步编程实例
Nov 15 Python
解决python Markdown模块乱码的问题
Feb 14 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
Jul 03 Python
Scrapy实现模拟登录的示例代码
Feb 21 Python
Pytest allure 命令行参数的使用
Apr 18 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
mysql下创建字段并设置主键的php代码
2010/05/16 PHP
apache+php+mysql安装配置方法小结
2010/08/01 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
javascript Window及document对象详细整理
2011/01/12 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
2011/10/03 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
jquery实现图片切换代码
2016/10/13 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
8 个有用的JS技巧(推荐)
2019/07/03 Javascript
openlayers实现图标拖动获取坐标
2020/09/25 Javascript
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
详解python调用cmd命令三种方法
2019/07/08 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
python实现的Iou与Giou代码
2020/01/18 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
创业大赛策划书
2014/03/01 职场文书
小学生国庆节演讲稿
2014/09/05 职场文书
导游欢送词
2015/01/31 职场文书
2015中学政教处工作总结
2015/07/22 职场文书
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
2021/11/11 Python
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS