用Python模拟网站中对JavaScript加密需要的两种方法

开发 后端
如果你很喜欢用python来做网络爬虫的话,那么就需要在Python模拟网站的JavaScript加密过程中需要两种方法对其进行操作。

如果你在做网络爬虫时,你是否觉得自己的“虫”不如别人的?如果你想了解别人的网络爬虫到底是怎样运行以及如何对其进行加密,下面的文章就是介绍如何在python中模拟相关网站的JavaScript加密的实际步骤等相关内容的介绍。

在做网络爬虫中很多人都会遇到,做得比较好的一些企业级网站,对于登陆或者其他操作都会对用户的输入做一些加密处理后再post到服务器上去,而加密这部分几乎都是通过JavaScript来完成的,所以要做爬虫,需要模拟 这些加密的处理。

我比较喜欢Python来做爬虫,urllib/urllib2库用起来真的是很方便,所以很多时候遇到需要在python中来模拟网站的JavaScript加密过程。暂时总结起来有两种方法:

***种是改写JavaScript的代码

这没什么好说的,不过只适用于比较小而且不复杂的JavaScript代码片段。比如人人网上发站内信的页面有这样的一个隐藏post数据:

 

  1. <input type="hidden" name="biz" value=0 id="xn_biz"/> 

在页面上biz的值为0,但是post的时候就会变成类似于941_683291223928232的字串,仔细看一下页面的源代码,就会发现这段验证的加密字串是通过一段JavaScript的代码生成的:

 

  1. <script>var mREOQQ=’A`ZDu^`’;var VKMHX=’^&+*L/~’;var 
    uCHKAU=0;var rTIU;var wCJS=”;var yAYH=Math.floor
    (VKMHX.length/2);while(uCHKAU
    <mREOQQ.length)
    {
    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;</script>  

 

这其实类似一段小型的验证加密,它先随机生产一段字串,复制给随机产生的一个变量名,再随机生成一段运算符,复制给另一个随机生成的变量名,然后对这两个变量进行一系列操作和运算,生成一个类似于941_683291223928232的字串。每次刷新页面这段代码中产生的字串和变量名都是不一样的,但是仔细研究这段代码,算法都是相同的,只要得到字串和运算符串,就可以生成这串验证密钥了。

所以将这段代码简单的改写成python代码,问题得到解决,在python模拟网站的JavaScript加密过程下面代码中code就是提取出来的上述JavaScript代码中的mREOQQ,operator代表VKMHX,而xn则代表ab的初始值,***得到的xn_biz就是我们最终需要的验证密钥了。

 

  1. def __genBizCode(code, operator, xn):  
  2. rXHU = unicode( code )  
  3. yAMKEN = operator 
  4. VCHEN, yEEJ, eLKKIH = (0, 0, ”);   
  5. KFNQH = int( len(yAMKEN)/2 );  
  6. while VCHEN < len(rXHU):  
  7. yEEJ = ord(rXHU[VCHEN])  
  8. VCHEN += 1  
  9. index = yEEJ % len(yAMKEN)  
  10. dDWE = ord( yAMKEN[index] )  
  11. dDWE = chr(dDWE)  
  12. if dDWE==’L':  
  13. dDWE = ‘<<’  
  14. if dDWE==’~':  
  15. eLKKIH += str( ~yEEJ*(-1) )  
  16. else:  
  17. reg = ‘%d%s%d’ % ( yEEJ, dDWE, KFNQH)  
  18. eLKKIH += str( int( eval(reg) ) )  
  19. xnxn_biz = xn + ‘_’  
  20. xn_biz += eLKKIH  
  21. return xn_biz   
  22.  

 

这种方法没有依赖性,但是使用的范围较窄,一是要求算法简单才能改写,二是要求算法固定,如果每次刷新页面算法都不一样,这种方法就不使用了。下面会谈到一种通用性的方法。

第二种是在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库,然后就可以简单的如下执行:

 

  1. import win32com.client  
  2. def readJsFile(filename):  
  3. fp = file( filename, ‘r’ )  
  4. lines = ”  
  5. for line in fp:  
  6. lines += line  
  7. return lines  
  8. def driveJsCode(code, func, paras=None):  
  9. js = win32com.client.Dispatch
    (’MSScriptControl.ScriptControl’)  
  10. js.Language = ‘JavaScript’  
  11. js.AllowUI = False 
  12. js.AddCode( code )  
  13. if paras:  
  14. return js.Run(func, paras[0], paras[1])  
  15. else:  
  16. return js.Run(func)  
  17. if __name__ == ‘__main__’:  
  18. code = readJsFile( ‘comm.js’ )  
  19. p = driveJsCode
    ( code, ‘myPreProcess’, [password, verfcode] )  
  20. print ‘The decoded code is %s’ % p   

 

这种方法通用性强,而且即使服务器改变算法,依然可以得到正确的加密验证码。以上的相关内容就是对Python模拟网页的javascript加密验证处理的相关内容的介绍。

【编辑推荐】

  1. Python语言中常用的四种工具的介绍
  2. Python语言功能中的宏编程语言的实际操作方案介绍
  3. Python unicode ascii编码在windows中的实际应用
  4. mod_python在性能上要优于传统CGI的缘由
  5. Python中文转换url编码的实际操作步骤介绍
责任编辑:佚名 来源: 互联网
相关推荐

2010-03-23 12:58:13

Python模拟网页

2020-07-01 17:05:05

Python方差分析代码

2010-08-04 17:41:52

挂载NFS

2009-09-25 14:04:09

Hibernate eHibernate h

2011-03-30 17:04:24

MySQL添加用户

2010-04-13 09:50:44

Oracle跟踪

2010-11-24 14:36:25

修复mysql表

2009-04-21 11:23:56

Oraclespool比较

2021-09-02 00:13:41

Windows 11Windows微软

2010-02-06 14:35:36

ibmdwRUP迭代

2010-09-09 19:53:50

2019-09-15 17:35:28

Wireshark解密HTTPS

2010-09-07 11:18:10

2010-11-12 11:44:37

SQL Server删

2020-09-16 18:27:36

Linux方法IP地址

2009-08-05 13:34:18

C#日期相减

2009-06-18 11:09:42

2009-11-06 09:48:40

WCF服务

2010-05-26 18:52:12

SVN库

2010-09-02 10:36:51

SQL删除
点赞
收藏

51CTO技术栈公众号