将JavaScript序列解码为Python

0 投票
2 回答
2178 浏览
提问于 2025-04-17 07:03

我刚开始学习Python,想要解码这个JavaScript的代码序列。其实我不仅在Python上是个新手,对JavaScript的理解也更少 :) 我知道我可以把它放到一个在线解码器里,比如这个:http://coderstoolbox.net/string/,但我想自己动手做一下,主要是为了练习... 我正在使用Beautiful Soup来获取数据,所以我可以用它的功能来解码。

如果有人能告诉我Python中对应的函数,我会非常感激。

function encode(str){
 var t=''; var s=unescape(str);
 var x=Math.round(Math.sqrt(49));
 for(var i=0;i<s.length;i++) t+=
  String.fromCharCode(s.charCodeAt(i)^(i%2?x:0));
 print(t);
}

这是我目前的理解:

  1. 我觉得我可以用Beautiful Soup中的“HTML实体”来解码..?
  2. 第二个看起来只是一个常数?49的平方根取整...
  3. 设置循环
  4. 这个我不太明白。1 我不知道fromCharCode函数是干什么的。2 不太确定最后那部分是什么。看起来是从i的某个幂次中获取字符代码。我知道i是用2取余,但那个'?x:0'部分是什么? - 你会怎么在Python中实现这个?

谢谢你的阅读!

补充:有没有Python库可以直接运行这段代码?我之前在bash中做过这个,使用过rhino,但Python中的替代方案对我这个初学者来说有点吓人,比如spidermonkey等等...

2 个回答

0

我不懂Python,但我可以解释这里发生了什么,这样你就可以用Python重写它。

1) 这里定义了一个叫做encode的函数,但没有给它赋值,所以在JavaScript中,它会被提升到它父函数的顶部(如果有的话)。

2) 在encode函数内部,有4个变量会被提升到函数的顶部:

  • t,赋值为空字符串,这意味着它的长度是0,但类型是字符串
  • s,赋值为传递给unencode函数的参数"str"的值。unencode只是把URI中保留的字符编码反转。
  • x,类型是数字,值为7
  • i,赋值为0,用作循环的计数器

3) 循环的起始索引是0,循环会在索引等于变量s的字符长度时结束。

4) 这个循环写得很随意,没有使用大括号,所以它只会执行第一行,这意味着变量t在根据变量s进行字符串拼接。

5) 接下来以字符串对象开头的那一行,看起来应该在循环中,但实际上并没有,因为这段代码写得很随意。反正变量s后面也没有被真正用到。

6) 使用了一个打印函数,变量t作为参数传入。变量t应该和变量s一模一样,这可能不是原作者的本意。

7) 我不知道print是什么。也许原作者是想用alert或console.log,而不是print。

0

1) 在Python中,和unescape功能相似的东西是 urllib.unquote(),在Python 2.x版本中使用,而在Python 3.x版本中则是 urllib.parse.unquote()

2) 如果你想做最简单的赋值,可以直接写 x = 7

3) 如果你想遍历字符串中的每个字符,最简单的方法是用 for c in string:,但如果你还想知道每个字符的位置,就可以用 for i,c in enumerate(string):

4) 字符串的 charChodeAt(c) 和 chr(c) 是一样的。

最后,我会把循环的部分重复写成这样:

result = []
for i,c in enumerate(string):
    result.append(chr(ord(c)^(x if i%2 else 0)))
print("".join(result))

其实,使用一个临时数组来添加元素比直接操作字符串更有效,因为字符串是不可变的。

撰写回答