如何用python md5加密自动登陆一些加密的网站

用Python模拟登录网站 -- 简明现代魔法您所在的位置: &
用Python模拟网站中对JavaScript加密需要的两种方法
用Python模拟网站中对JavaScript加密需要的两种方法
如果你很喜欢用python来做网络爬虫的话,那么就需要在Python模拟网站的JavaScript加密过程中需要两种方法对其进行操作。
如果你在做网络爬虫时,你是否觉得自己的&虫&不如别人的?如果你想了解别人的网络爬虫到底是怎样运行以及如何对其进行加密,下面的文章就是介绍如何在python中模拟相关网站的JavaScript加密的实际步骤等相关内容的介绍。
在做网络爬虫中很多人都会遇到,做得比较好的一些企业级网站,对于登陆或者其他操作都会对用户的输入做一些加密处理后再post到服务器上去,而加密这部分几乎都是通过JavaScript来完成的,所以要做爬虫,需要模拟 这些加密的处理。
我比较喜欢Python来做爬虫,urllib/urllib2库用起来真的是很方便,所以很多时候遇到需要在python中来模拟网站的JavaScript加密过程。暂时总结起来有两种方法:
第一种是改写JavaScript的代码
这没什么好说的,不过只适用于比较小而且不复杂的JavaScript代码片段。比如人人网上发站内信的页面有这样的一个隐藏post数据:
&type=&hidden&&name=&biz&&value=0&id=&xn_biz&&
在页面上biz的值为0,但是post的时候就会变成类似于941_232的字串,仔细看一下页面的源代码,就会发现这段验证的加密字串是通过一段JavaScript的代码生成的:
var&mREOQQ=&A`ZDu^`&;var&VKMHX=&^&+*L/~&;var&uCHKAU=0;var&rTIU;var&wCJS=&;var&yAYH=Math.floor(VKMHX.length/2);while(uCHKAU){rTIU=mREOQQ.charCodeAt(uCHKAU++);var&aYDG=VKMHX.charCodeAt(rTIU%VKMHX.length);aYDG=String.fromCharCode(aYDG);if(aYDG==&L')aYDG=&&;if(aYDG==&~')wCJS+=~rTIU*(-1);else{wCJS+=Math.floor(eval(rTIU+aYDG+yAYH));}}var&ab=941;ab+=&_&;ab+=wCJS;&document.getElementById(&xn_biz&).value=ab;&&
这其实类似一段小型的验证加密,它先随机生产一段字串,复制给随机产生的一个变量名,再随机生成一段运算符,复制给另一个随机生成的变量名,然后对这两个变量进行一系列操作和运算,生成一个类似于941_232的字串。每次刷新页面这段代码中产生的字串和变量名都是不一样的,但是仔细研究这段代码,算法都是相同的,只要得到字串和运算符串,就可以生成这串验证密钥了。
所以将这段代码简单的改写成python代码,问题得到解决,在python模拟网站的JavaScript加密过程下面代码中code就是提取出来的上述JavaScript代码中的mREOQQ,operator代表VKMHX,而xn则代表ab的初始值,最后得到的xn_biz就是我们最终需要的验证密钥了。
def&__genBizCode(code,&operator,&xn): &rXHU&=&unicode(&code&) &yAMKEN&=&operator&VCHEN,&yEEJ,&eLKKIH&=&(0,&0,&&);& &KFNQH&=&int(&len(yAMKEN)/2&); &while&VCHEN&&(rXHU): &yEEJ&=&ord(rXHU[VCHEN]) &VCHEN&+=&1 &index&=&yEEJ&%&len(yAMKEN) &dDWE&=&ord(&yAMKEN[index]&) &dDWE&=&chr(dDWE) &if&dDWE==&L': &dDWE&=&&& &if&dDWE==&~': &eLKKIH&+=&str(&~yEEJ*(-1)&) &else: &reg&=&&%d%s%d&&%&(&yEEJ,&dDWE,&KFNQH) &eLKKIH&+=&str(&int(&eval(reg)&)&) &xnxn_biz&=&xn&+&&_& &xn_biz&+=&eLKKIH &return&xn_biz& &&
这种方法没有依赖性,但是使用的范围较窄,一是要求算法简单才能改写,二是要求算法固定,如果每次刷新页面算法都不一样,这种方法就不使用了。下面会谈到一种通用性的方法。
第二种是在python中运行js代码由于QZone和QQ校友登陆的时候,post的密码都进行了加密,搜索了一下,发现很多人都研究过这个东东。腾讯将用户的密码和验证码一起,通过一些js代码进行加密,生成一个32为的密钥最终post到服务器上。
对于这个加密算法,网上大部分流传的说法是,先将用户密码进行3次md5的加密,转成大写的32位字符串,再将验证转换成大写,与前面的32位md5大写字符串相加,得到一个36位的字符串,最后对这个36位的字串进行md5加密并转换成大写字串,得到最终post的密钥。
网上很多人说用标准的md5加密,但是我用python的hashlib里的md5进行上述的加密,得到的结果却与标准结果不同,于是只能寻求其他办法。后来在Google的时候搜到了在python中利用windows的插件Windows ScriptControl运行其他脚本语言的方法,不仅适用js,还可以运行vbs等。
首先需要安装Windows ScriptControl插件,可以去微软的官网上下载。其次还需要安装python的win32库,然后就可以简单的如下执行:
import&win32com.client &def&readJsFile(filename): &fp&=&file(&filename,&&r&&) &lines&=&& &for&line&in&fp: &lines&+=&line &return&lines &def&driveJsCode(code,&func,&paras=None): &js&=&win32com.client.Dispatch(&MSScriptControl.ScriptControl&) &js.Language&=&&JavaScript& &js.AllowUI&=&False&js.AddCode(&code&) &if&paras: &return&js.Run(func,&paras[0],&paras[1]) &else: &return&js.Run(func) &if&__name__&==&&__main__&: &code&=&readJsFile(&&comm.js&&) &p&=&driveJsCode(&code,&&myPreProcess&,&[password,&verfcode]&) &print&&The&decoded&code&is&%s&&%&p& &
这种方法通用性强,而且即使服务器改变算法,依然可以得到正确的加密验证码。以上的相关内容就是对Python模拟网页的javascript加密验证处理的相关内容的介绍。
【编辑推荐】
【责任编辑: TEL:(010)】
关于的更多文章
Python是一种即译式的,互动的,面向对象的编程语言,它包含了模
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
讲师: 26人学习过讲师: 14人学习过讲师: 35人学习过
AngularJS是很多Web开发人员在打造单页面应用程序时的
针对大数据来说,2016年将是令人振奋的一年。智能算法
当下HTML5技术一直受到各方关注,“HTML5颠覆原生App
《网管员必读――网络组建(第2版)》仍是以一个中等规模的模拟局域网组建为思路,较全面地介绍了与局域网组建相关的各方面知识
51CTO旗下网站图文详解Python模拟登录新浪微博流程 - Python - 伯乐在线
& 图文详解Python模拟登录新浪微博流程
原文地址:,更多内容请关注个人伯乐在线专栏或知乎专栏-。
干货来啦,如果你想学习Python模拟登陆,如果你想知道如何利用抓包工具一步步获得网站登陆流程,如果你想破解网站登陆加密算法,那么这篇文章绝对对得起你!
这篇文章详细解析了新浪微博登录流程,包括各种加密算法解析、验证码解析、跳转解析等等。另外还有登录的代码供参考,代码在文章最后给出,同时也上传到了GitHub,大家可以参考一下。
登录代码地址:。代码中用到了我自己的爬虫框架中的一些工具类,具体见:。
如果你想用Python模拟登陆新浪微博,首先肯定要去百度一些相关的知识,了解各位前辈们已经做得一些工作。这里通过搜索可以知道,新浪微博在登录时,对用户名、密码进行了加密处理,也知道了加密算法(b64encode、rsa等等)。这里先有个大体印象,我会一步步交给大家怎么自己去发现新浪微博的加密算法,毕竟授人以鱼不如授人以渔嘛!
这里用到的工具是Charles,是Mac下的一个抓包工具。Windows下对应的是Fiddler。如果你不会用,或者不熟悉,建议先安装一个,自己动手熟悉一下软件的用法。
好了,准备工作完成了,废话不多说,开始干货!
(1)开启Charles后,打开新浪微博的登录页面,并输入用户名、密码、验证码后登录一遍,这时候会在Charles留下整个登录的流程,后边慢慢分析。
(2)分析的第一步,要知道用户名如何加密。在Charles中搜索“username”。为什么这么搜?你如果是做网站的,估计90%的可能都会把用户名变量命名为username吧!搜索后看到只有文件loginLayers.js中包含username,该文件的命名也说明跟文件相关,根据经验应该能判断出这个文件很重要。
(3)将这个文件的内容复制出来,放到一个文本文件中,搜索username,会找到下边图示中的这么几行代码,从而得知用户名的加密方式。用户名加密方法很简单,encode之后紧跟一个base64即可。具体用Python怎么写,自己看代码。
(4)用户名加密完了,应该要加密密码了。继续在这个文件中搜索password,得到:
这里可以推测出this.login中的参数b应该就是password。查看login函数,可以得到:
这里调用了loginByXMLHttpRequest函数,并传入参数b,即password。所以我们继续搜索loginByXMLHttpRequest,得到:
这里调用了makeXMLRequestQuery函数,并传入参数b,即password。所以我们继续搜索makeXMLRequestQuery,得到:
这里调用了makeRequest函数,并传入参数b,即password。所以我们继续搜索makeRequest,得到:
这里就可以清晰的看到密码加密流程。具体Python怎么实现,还是自己看代码。但是这里有个问题,密码加密的时候,会有几个参数需要传入,比如nonce、servertime、rsakv等等,这是什么鬼呢?继续往下看。
(5)在Charles中搜索servertime,会得到一个prelogin的请求,该请求返回servertime、nonce、pubkey等参数。这里返回的是一个json串。
查看该请求的request,可以看到他需要加密后的用户名su。根据这里的参数,就可以对密码进行加密了。这里稍微回想总结下整个流程:
根据用户名username得到加密后的用户名su
根据su得到一个json串,里边包含加密密码用到的各种参数,servertime、nonce等
根据json串和密码得到加密后的密码,然后就可以登陆了。
(6)在Charles中可以找到一个login.php请求,根据经验也可以大体判断这就是登录请求,事实证明也确实如此。根据该请求的request,自己构建postdata,并发送请求即可。
这里需要说明下验证码问题。有些账号登录需要验证码,有些不需要,这和账号设置有关,带有登录保护的就需要输入验证码。这里也可以根据上边得到的json串中的showpin参数得知(具体见上边的图)。如果需要验证码,则只需要找到验证码的地址,得到图片:
将这个图片保存到本地进行人工打码,或者接入打码平台,都可以获取验证码内容。在我的代码中,我原本封装了云打码平台的接口,直接调用即可,但为了方便大家测试,我改为人工打码的形式,具体见代码:
(7)构造postdata,发送请求,即便是请求成功了,其实还没登录成功。因为新浪微博还有一步跳转。是不是很麻烦?别着急,胜利马上就在眼前了。我们仔细查看Charles后,会发现在上个请求之后,有下边一个请求wbsso.login,这就是那个跳转,如下图。
该跳转请求的请求如何构建,大家看代码即可,这里就不多说了。代码如下:
代码中还检查登录是否成功,这里也不过多描述。到这为止,新浪微博就算是登录成功了。
这里还有一个问题没有说到,就是Cookie问题。本文中一直没有提到Cookie,是因为Python中的Cookiejar会帮我们自动处理所有的cookie问题。你只需要在模拟登陆之前,首先声明一个cookiejar和opener即可,具体这两个东西的用法,大家自行百度。代码如下:
模拟登陆微博真的很麻烦,也确实需要一定的经验,大家多多练习,熟练掌握了这个,相信你们在模拟登陆其他网站的时候,也能举一反三的去破解登录流程。有什么问题,可以在评论中指出,有时间我会帮大家解答的。
代码地址:
打赏支持我写出更多好文章,谢谢!
打赏支持我写出更多好文章,谢谢!
关于作者:
可能感兴趣的话题
o 236 回复
关于 Python 频道
Python频道分享 Python 开发技术、相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线

我要回帖

更多关于 python 加密 的文章

 

随机推荐