简介:

otto是一个Go语言实现的JavaScript 解释器,它的项目地址为:https://github.com/robertkrimen/otto

举例:

假如我现在有一个 encrypt.js 的文件,里面的内容为:

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

//js函数名为 encodeInp 
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.com/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) //将 data 作为 形参,即: encodeInp(data)
    if err != nil {
        panic(err)
    }
    fmt.Println(value.String())
}

然后假如你以后会经常性的使用这段代码的话,你也可以给它进行一个小封装。

func JsParser(filePath string, functionName string, args... 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, args...)
    if err != nil {
        panic(err)
    }

    return value.String()
}

来源:
作者:B丶atty
链接:https://blog.csdn.net/qq_42527676/article/details/86481835