python執行js代碼的方法

什麼是js代碼混淆?

正常代碼

我們現在看一段js代碼,代碼邏輯很簡單,就是拼接時間返回。

function formatDate(now) {
    var now = new Date(1230999938);
    var year=now.getFullYear();
    var month=now.getMonth()+1;
    var date=now.getDate();
    var hour=now.getHours();
    var minute=now.getMinutes();
    var second=now.getSeconds();
    return year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
}

    運行一下這段代碼,如下圖所示。

混淆代碼

我隨便找瞭個在線的js代碼混淆網站。

js代碼

function formatDate(mz1){var KkkGDiH2=new window["\x44\x61\x74\x65"](1230999938);var tsk3=KkkGDiH2['\x67\x65\x74\x46\x75\x6c\x6c\x59\x65\x61\x72']();var YMreyP4=KkkGDiH2['\x67\x65\x74\x4d\x6f\x6e\x74\x68']()+1;var Ozo5=KkkGDiH2['\x67\x65\x74\x44\x61\x74\x65']();var QMYEc$eD6=KkkGDiH2['\x67\x65\x74\x48\x6f\x75\x72\x73']();var JfXVV_Akq7=KkkGDiH2['\x67\x65\x74\x4d\x69\x6e\x75\x74\x65\x73']();var $mP8=KkkGDiH2['\x67\x65\x74\x53\x65\x63\x6f\x6e\x64\x73']();return tsk3+"\x2d"+YMreyP4+"\x2d"+Ozo5+" "+QMYEc$eD6+"\x3a"+JfXVV_Akq7+"\x3a"+$mP8

    上面這個真的不是我瞎寫的,混淆之後就是這樣子的,不信看圖片。

可能我們會有個疑問,js代碼都成這玩意瞭,還能執行嗎? 答案是肯定的。即使js代碼非常亂,但還是可以執行的,結果跟上面的是一樣的。

這就造成瞭一個問題,我們在做爬蟲時,如果需要,多多少少可能都要研究一下js代碼,然後進行js解密一下,但是,但是,要是代碼都混淆成瞭這瞭,還怎麼解?

一點邏輯都看不通瞭,基本上不可用Python按照js邏輯重寫出來瞭…

很巧,小編也是卡在這裡…後來我就想,要是Python能執行js代碼就好瞭,不用管函數裡面的邏輯瞭,隻拿函數返回值就好瞭。

Python第三方包Execjs

可能是吧,不止我一個人遇到瞭這種情況,所以大佬們就開發出來這種工具包,用於執行js代碼。

安裝

在安裝之前,需要有node環境,這裡就不舉栗子瞭,下一步下一步就好瞭。

pip3 install PyExecJS

執行js

註:由於上述js代碼會生成window對象,並不能直接執行成功,需要額外的其他輔助,這裡簡單的舉一下其他例子。

正常js代碼

function add(x, y) {
   return x + y;
}

Python執行js代碼

import execjs

ctx = execjs.compile("""
function add(x, y) {
  return x + y;
}
""")
print(ctx.call("add", 1, 2))

執行結果如下圖所示:

混淆js代碼

function add(bi1,Pl$2){return bi1+Pl$2}

Python執行混淆js代碼

import execjs

ctx = execjs.compile("""
function add(bi1,Pl$2){return bi1+Pl$2}
""")
print(ctx.call("add", 1, 2))

執行結果如下圖所示:

可以看到,即使再混淆,隻要執行的是js代碼,都是沒啥問題的。

上述拼接時間返回的js混淆代碼也是可以執行的,但是它多瞭一個window對象,需要node安裝jsdom才行,由於網絡設置有問題,實在是下載不瞭舉例子,實在是抱歉。

或者使用selenium打開遊覽器執行再返回也行,當然,速度更慢。

以上就是python執行js代碼的方法的詳細內容,更多關於python執行js代碼的資料請關註WalkonNet其它相關文章!

推薦閱讀: