自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用Python模擬網(wǎng)站中對JavaScript加密需要的兩種方法

開發(fā) 后端
如果你很喜歡用python來做網(wǎng)絡爬蟲的話,那么就需要在Python模擬網(wǎng)站的JavaScript加密過程中需要兩種方法對其進行操作。

如果你在做網(wǎng)絡爬蟲時,你是否覺得自己的“蟲”不如別人的?如果你想了解別人的網(wǎng)絡爬蟲到底是怎樣運行以及如何對其進行加密,下面的文章就是介紹如何在python中模擬相關網(wǎng)站的JavaScript加密的實際步驟等相關內(nèi)容的介紹。

在做網(wǎng)絡爬蟲中很多人都會遇到,做得比較好的一些企業(yè)級網(wǎng)站,對于登陸或者其他操作都會對用戶的輸入做一些加密處理后再post到服務器上去,而加密這部分幾乎都是通過JavaScript來完成的,所以要做爬蟲,需要模擬 這些加密的處理。

我比較喜歡Python來做爬蟲,urllib/urllib2庫用起來真的是很方便,所以很多時候遇到需要在python中來模擬網(wǎng)站的JavaScript加密過程。暫時總結(jié)起來有兩種方法:

***種是改寫JavaScript的代碼

這沒什么好說的,不過只適用于比較小而且不復雜的JavaScript代碼片段。比如人人網(wǎng)上發(fā)站內(nèi)信的頁面有這樣的一個隱藏post數(shù)據(jù):

 

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

在頁面上biz的值為0,但是post的時候就會變成類似于941_683291223928232的字串,仔細看一下頁面的源代碼,就會發(fā)現(xiàn)這段驗證的加密字串是通過一段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>  

 

這其實類似一段小型的驗證加密,它先隨機生產(chǎn)一段字串,復制給隨機產(chǎn)生的一個變量名,再隨機生成一段運算符,復制給另一個隨機生成的變量名,然后對這兩個變量進行一系列操作和運算,生成一個類似于941_683291223928232的字串。每次刷新頁面這段代碼中產(chǎn)生的字串和變量名都是不一樣的,但是仔細研究這段代碼,算法都是相同的,只要得到字串和運算符串,就可以生成這串驗證密鑰了。

所以將這段代碼簡單的改寫成python代碼,問題得到解決,在python模擬網(wǎng)站的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的密碼都進行了加密,搜索了一下,發(fā)現(xiàn)很多人都研究過這個東東。騰訊將用戶的密碼和驗證碼一起,通過一些js代碼進行加密,生成一個32為的密鑰最終post到服務器上。

對于這個加密算法,網(wǎng)上大部分流傳的說法是,先將用戶密碼進行3次md5的加密,轉(zhuǎn)成大寫的32位字符串,再將驗證轉(zhuǎn)換成大寫,與前面的32位md5大寫字符串相加,得到一個36位的字符串,***對這個36位的字串進行md5加密并轉(zhuǎn)換成大寫字串,得到最終post的密鑰。

網(wǎng)上很多人說用標準的md5加密,但是我用python的hashlib里的md5進行上述的加密,得到的結(jié)果卻與標準結(jié)果不同,于是只能尋求其他辦法。后來在Google的時候搜到了在python中利用windows的插件Windows ScriptControl運行其他腳本語言的方法,不僅適用js,還可以運行vbs等。

首先需要安裝Windows ScriptControl插件,可以去微軟的官網(wǎng)上下載。其次還需要安裝python的win32庫,然后就可以簡單的如下執(zhí)行:

 

  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   

 

這種方法通用性強,而且即使服務器改變算法,依然可以得到正確的加密驗證碼。以上的相關內(nèi)容就是對Python模擬網(wǎng)頁的javascript加密驗證處理的相關內(nèi)容的介紹。

【編輯推薦】

  1. Python語言中常用的四種工具的介紹
  2. Python語言功能中的宏編程語言的實際操作方案介紹
  3. Python unicode ascii編碼在windows中的實際應用
  4. mod_python在性能上要優(yōu)于傳統(tǒng)CGI的緣由
  5. Python中文轉(zhuǎn)換url編碼的實際操作步驟介紹
責任編輯:佚名 來源: 互聯(lián)網(wǎng)
相關推薦

2010-03-23 12:58:13

Python模擬網(wǎng)頁

2020-07-01 17:05:05

Python方差分析代碼

2010-08-04 17:41:52

掛載NFS

2009-09-25 14:04:09

Hibernate eHibernate h

2010-04-13 09:50:44

Oracle跟蹤

2010-11-24 14:36:25

修復mysql表

2011-03-30 17:04:24

MySQL添加用戶

2009-04-21 11:23:56

Oraclespool比較

2010-02-06 14:35:36

ibmdwRUP迭代

2009-06-18 11:09:42

2009-08-05 13:34:18

C#日期相減

2010-09-07 11:18:10

2020-09-16 18:27:36

Linux方法IP地址

2010-11-12 11:44:37

SQL Server刪

2010-09-09 19:53:50

2019-09-15 17:35:28

Wireshark解密HTTPS

2010-09-13 13:05:03

sql server分

2010-11-09 13:09:58

SQL Server分

2010-11-10 13:22:41

SQL Server備

2021-09-02 00:13:41

Windows 11Windows微軟
點贊
收藏

51CTO技術棧公眾號