项目场景:
python的execjs执行接js报编码错误
UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position 163: illegal multibyte sequence
问题描述
提示:这里描述项目中遇到的问题:
例如:python的execjs执行接js报编码错误
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\ProgramData\Anaconda3\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "C:\ProgramData\Anaconda3\lib\subprocess.py", line 1370, in _readerthread
buffer.append(fh.read())
UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 163: illegal multibyte sequence
Traceback (most recent call last):
File "E:/BaiduSyncdisk/code/qiyezizhi_shigongzheng/qiyezizhi/demo.py", line 89, in <module>
decrypted_data = execjs.compile(jzsc_mohurd_js).call('getData', str(a))#.encode('gb18030','ignore')
File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_abstract_runtime_context.py", line 37, in call
return self._call(name, *args)
File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_external_runtime.py", line 92, in _call
return self._eval("{identifier}.apply(this, {args})".format(identifier=identifier, args=args))
File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_external_runtime.py", line 78, in _eval
return self.exec_(code)
File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_abstract_runtime_context.py", line 18, in exec_
return self._exec_(source)
File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_external_runtime.py", line 87, in _exec_
output = self._exec_with_pipe(source)
File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_external_runtime.py", line 103, in _exec_with_pipe
stdoutdata, stderrdata = p.communicate(input=input)
File "C:\ProgramData\Anaconda3\lib\subprocess.py", line 1028, in communicate
stdout, stderr = self._communicate(input, endtime, timeout)
File "C:\ProgramData\Anaconda3\lib\subprocess.py", line 1420, in _communicate
stdout = stdout[0]
IndexError: list index out of range
UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position 163: illegal multibyte sequence
执行以下代码
var CryptoJS = require('crypto-js')
function getData(t) {
var m = CryptoJS.enc.Utf8.parse("0123456789ABCDEF"),
f = CryptoJS.enc.Utf8.parse("jo8j9wGw%6HbxfFn"),
e = CryptoJS.enc.Hex.parse(t),
n = CryptoJS.enc.Base64.stringify(e),
a = CryptoJS.AES.decrypt(n, f, {
iv: m,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}),
r = a.toString(CryptoJS.enc.Utf8);
return r.toString()
}
原因分析:
js中有汉字无法编码
解决方案:
三个点
1 js中有汉字无法编码导致异常
subprocess.py文件的原因
subprocess一定要放在 导入import execjs之前
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
# 一定要放在 导入import execjs之前
import execjs
2 写javascript的测试代码文件命名不要有test,更不要完全为test会导致pycharm到单元测试页面,没法正常显示,文件名称改为demo之类
3 环境变量没配置好,需要加 execjs.compile(js中的函数,cwd=r"D:/software2/node/node_global/node_modules"),或者把node.js的全局变量配置好
完整代码
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
# 一定要放在 导入import execjs之前
import execjs
with open('test.js', 'r', encoding='utf-8') as f:
jzsc_mohurd_js = f.read()
a='95780ba0943730051dccb5fe3918f9fea6117a6e2137e8c0c167df14ee9731cf332d8d6aec002dbcf3abc19ca03aa0e502095345d9c7bbdbac5158e14a909fbe26b351f95e6c5274d04aab9610cf457f6d2ec5d16458266928175054c9a9e935e2a9b625249f0aefaf1f9f086342b8e0c0f162195b30570b2cac0821feae2ec6f0da770a7365a4ecaeaf8764109f5436aa9d0fd3fd5495fe7d7f4b0462b8cb9397121e32869c414ca240c88cbad11fe5a827b5d69a26db420dfeaedbff7116580518d70837dbd57568718361e5b59e63a04b21942e67428bf2693a6b6d6b39804a1677922b4d98ae5a1f15a03920489eca9cbcac8338af0d51b55770445d0e9a571b9726282681cb0256fb9d7257a299645b207e4c35fec89677ff0e052bbe41de87a6576e4906e7f9406858c0a022a3522f82710a6ec8cfe46fe03dde81c2a33f7b7070ba4bc83cf67b00a4fd950fa8c2a4aed78da3d3e3741f01cace58227f45128af9d3ee4644b71d6729a16cabca8d57afa7059ff79094c3ba2e425a6881bdc5621526cb7c8ce14fd06e67aa4b11f591d39fcd56e7912b4994889e18cb0c532583d396d4b9f3190645c7069b45d56b1dc88dd4b7a0ae75a4e68246e2754a04abf01e9e38fda69c24075fad975a2c8265e59b94193b1430be425c53e34ecd81137b5b3302c5333ee7fea1526a4c58ea44e266af129434201afa071c4a2002574b9e4b0b679db59cea8da8dce4370c0e6747e95c47fef6ecb9bbe14b46c5996409ce309df3ac3528a6328c9cbb7030172d4a0319db182c84a86dc7bffe861bc287b0e53696b015724239d8c8de03718993bf1b968e15296444151abf8a305e2505f62a594d618397a9c56ee84de247b635dfa20ecd45884f609834bc7cb482530e229a88badb0abc524aac8f24481daa0f4a57bcb84ed42814952155a7599ee36443b4fce48e72983415700f30f9d6179c14397522daf80ca975717e8d87b6a8ffcadf27c73fb01137c0c3252b75fde995a7fa9efd86dbf7cf1982daeb3ddd1b562b8eea4fae97b40962c9890f09187c8457559ff3f70178a3531bd71e02d3d2cf868e401d61cf4245795dd2dbb8b49530e89325aef0045553d686c571ee9067f54e03956f8491174afce86e4723a190fa089318e75fa40dd503d8699f1843c6d0982de64cc2e9484eb78afb4dffb1f6fdfd14b06f4f3e3b7e1f1930cab25f66a21a744aa98e57198215aaced270d37cdc15d6c52e7d4b8244c05f01f9d8717305c9625f0cadc33f7b1225de747d5a5617cb816f19cd06aa3ad8298c4ebe35c50e340d7a56903a115d24193e23db2e717b75ec60b4f04594a1523973d811009ffbeb993c0bcdf4ca5077e6a7f3702020189ca868991b2b65c5e0a6cd019fe65d86e4b2b6d0b7cb824ceeac0d3cd98fb2ad368e5dbc26d6a4a52d79d9c2a34c700d544488321902389049b0dae2320f4a8fa2db09ecd1b04c9bd6ef6db4fcc70a9bf80fefaea1cc78ac61ab69b4d8b6ecefe38c2da3fc1fadde90871bd019a534e9def9778d7ec6e8c6507d2d98e0f675f46038a9d9015b5eb72d737723277303e820542314434cbf2dfb6a15c4c8ff2fe4e417c7068fdeb9e30efdda9f1412709de5a9fd16cb5d1f9d3541dbf43f0f4c19f7f8f035423ca0dd920bd8257f3cfde8394c69b537494d8d9fa930d78f245df94875d67413fb7ad7bfe00662b75eacbc10d5a6c21a3cd6d7f7c0e5c2076edfc247c36bd7519da5ab5910f204a4547f6d6ba574f6395407dae7b678b5be11c84055465df75cd42332270a0b822e2c8608b83f31483cb6c04f19b11062fd62842da018fe4ea963d78b2c84b15e412a464f7aeb856f2b9743a4b5a0c7d2bbb9a6166853b54a5a2258346bee4a78331311b42fd8116dcfab682bbc5d3347950693d80a411364239be0cf8b6d850eb91ae6034375861df5b69447ab75f05843b3e7e634a6e32830a05ec0efa544c486d41bd4f073624ddeff7481456061d6b8c40bd4b408f16b1d72d0649bcf18cf4482f807e5929142609719a83fe74ab8c90d23758536beb2c9234c2170b7bdfc286b403a07d83da88b5b4e884d3b15fbcb51'
decrypted_data = execjs.compile(jzsc_mohurd_js).call('getData', str(a))#.encode('gb18030','ignore')
# ,cwd=r"D:/software2/node/node_global/node_modules"
print(decrypted_data)#