在破解豆瓣的window.__DATA__时,使用python的execjs执行js,会有这个错误:
Exception in thread Thread-1:
Traceback (most recent call last):File "E:\codes\python\lib\threading.py", line 917, in _bootstrap_innerself.run()File "E:\codes\python\lib\threading.py", line 865, in runself._target(*self._args, **self._kwargs)File "E:\codes\python\lib\subprocess.py", line 1238, in _readerthreadbuffer.append(fh.read())
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 41: illegal multibyte sequenceTraceback (most recent call last):File "E:/Python/python_project/decrypt_js/douban.py", line 13, in <module>data = ctx.call('decrypt', r)File "E:\codes\python\lib\site-packages\execjs\_abstract_runtime_context.py", line 37, in callreturn self._call(name, *args)File "E:\codes\python\lib\site-packages\execjs\_external_runtime.py", line 92, in _callreturn self._eval("{identifier}.apply(this, {args})".format(identifier=identifier, args=args))File "E:\codes\python\lib\site-packages\execjs\_external_runtime.py", line 78, in _evalreturn self.exec_(code)File "E:\codes\python\lib\site-packages\execjs\_abstract_runtime_context.py", line 18, in exec_return self._exec_(source)File "E:\codes\python\lib\site-packages\execjs\_external_runtime.py", line 87, in _exec_output = self._exec_with_pipe(source)File "E:\codes\python\lib\site-packages\execjs\_external_runtime.py", line 103, in _exec_with_pipestdoutdata, stderrdata = p.communicate(input=input)File "E:\codes\python\lib\subprocess.py", line 939, in communicatestdout, stderr = self._communicate(input, endtime, timeout)File "E:\codes\python\lib\subprocess.py", line 1288, in _communicatestdout = stdout[0]
IndexError: list index out of range
原因是有一个程序在使用TextIOWrapper 类创建对象时默认使用了cp936的编码,也就是gbk编码,读取不了utf-8的字符,
所以我们可以修改下 subprocess.py 文件的默认编码方式为utf-8即可
在代码行656有个初始化,直接修改默认即可,如下
修改完再运行代码,结果就出来了,没有报错