在Go中调⽤JS代码(otto)
假如我现在有⼀个encrypt.js的⽂件,⾥⾯的内容为:
js代码加密软件
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function encodeInp(input) {
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
do {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64
} else if (isNaN(chr3)) {
enc4 = 64
}
output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
chr1 = chr2 = chr3 = "";
enc1 = enc2 = enc3 = enc4 = ""
} while (i < input.length);
return output
}
这个⽂件⾥有⼀个函数是⽤来加密的(其实就是⼀个base64),然后当我们写爬⾍或者其他的东西时我们需要将这段代码运⾏⼀遍,并获取其返回的值。
那么我们在Go中就可以这样写:
package main
import (
"fmt"
"github/robertkrimen/otto"
"io/ioutil"
)
func main() {
filePath := "你的JS⽂件的路径"
//先读⼊⽂件内容
bytes, err := ioutil.ReadFile(filePath)
if err != nil {
panic(err)
}
vm := otto.New()
_, err = vm.Run(string(bytes))
if err!=nil {
panic(err)
}
data := "你需要传给JS函数的参数"
//encodeInp是JS函数的函数名
value, err := vm.Call("encodeInp", nil, data)
if err != nil {
panic(err)
}
fmt.Println(value.String())
}
然后假如你以后会经常性的使⽤这段代码的话,你也可以给它进⾏⼀个⼩封装。
func JsParser(filePath string, functionName string, interface{}) (result string) { //读⼊⽂件
bytes, err := ioutil.ReadFile(filePath)
if err!=nil {
panic(err)
}
vm := otto.New()
_, err = vm.Run(string(bytes))
if err!=nil {
panic(err)
}
value, err := vm.Call(functionName, nil, )
if err != nil {
panic(err)
}
return value.String()
}
其实otto还有很多有趣的功能,⼤家可以去otto的github项⽬⾥去看。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。