如何在Python中解压JavaScript

0 投票
2 回答
1250 浏览
提问于 2025-04-16 22:55

我想要获取一个javascript脚本的内容,而不是在请求时直接执行它。

补充说明:我明白Python并没有执行这个javascript代码。问题在于,当我请求这个在线的JS脚本时,它会被执行。我无法获取到脚本的内容。也许我想要的是像这样解码脚本 http://jsunpack.jeek.org/dec/go

这是我请求js文件的代码:

def request(self, uri):
    data = None
    req = urllib2.Request(uri, data, self.header)
    response = urllib2.urlopen(req)
    html_text = response.read()
    return html_text.decode()

我大概知道这个脚本内部的样子,但在我发出请求后,得到的只是一个“已加载”的消息。我猜测是JS代码被执行了。有没有办法只请求到代码呢?

2 个回答

1

我不太明白你的意思。如果我简化一下你的代码,然后在一个肯定有一些JavaScript的链接上运行它:

>>> import urllib2
>>> res = urllib2.urlopen("http://stackoverflow.com/questions/6946867/how-to-unpack-javascript-in-python")

然后你打印出res(或者res.decode()),JavaScript的内容是完整的。

使用urlopen应该能获取到源头提供的任何字符流。接下来你可以自己决定怎么处理这些内容(比如把它渲染成HTML,或者把它当作JavaScript来解释等等)。

2

urllib2中没有HTML或JavaScript的解释器。这个模块的作用就是获取资源并把它原封不动地返回给你;它绝对不会尝试执行任何收到的JavaScript代码。如果你没有收到预期的响应,可以用像wget这样的工具检查一下网址,或者用Wireshark或Fiddler监控网络连接,看看服务器实际上返回了什么。

(这里的decode()只是把HTTP响应体的字节转换成Unicode字符——使用默认的字符编码,这可能不是个好主意。)

补充说明:

我想要的是像这样解码JavaScript jsunpack.jeek.org/dec/go

哦,那就完全是另一回事了。你可以在这里获取这个工具的源代码,不过你还需要安装Mozilla的JavaScript引擎SpiderMonkey,才能运行下载的JavaScript。

没有办法在不运行的情况下自动“解包”混淆的JavaScript,因为打包代码可以做任何事情,而JavaScript是一种图灵完备的语言。这个工具的作用就是用一些包装代码运行它,像eval这样的函数通常是打包器/混淆器使用的。不幸的是,这种干扰很容易被检测到,所以如果你试图解包的是恶意软件,你会发现它成功的几率和失败的几率差不多。

撰写回答