如何使用 Python 執行 js 代碼?

爲什麼要引出 Python 執行 js 這個問題?

都說術業有專攻,每個語言也都有自己的長處和短處。在爬蟲方向,Python 絕對是扛把子,近幾年隨着 AI 的火爆,需要各種各樣的數據,所以,爬蟲需求也跟着水漲船高起來。

 我們做爬蟲的當然是爬的爽,但是估計人家後臺在罵街,畢竟誰都不希望自己的數據被弄走,所以後臺反爬技術也在快速提升,一攻一防就這麼在拉鋸着。

現在爲了防止反爬,前端使用的反爬技術比較多的是 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

Execjs 用法超級簡單的,幾行代碼。

執行 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 打開遊覽器執行再返回也行,當然,速度更慢。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/PV75AMPTE9GTYgfAWXvpzQ