当前位置: 代码网 > it编程>前端脚本>Golang > Go中调用JS代码(otto)的实现示例

Go中调用JS代码(otto)的实现示例

2024年11月26日 Golang 我要评论
otto是一个go语言实现的javascript 解释器,它的项目地址为:https://github.com/robertkrimen/ottootto实现了 ecmascript 5.1 的大部分

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

otto实现了 ecmascript 5.1 的大部分功能。你可以使用 otto 来执行 javascript 代码,甚至可以定义和调用函数,操作对象等。但请注意,otto 目前只支持 ecmascript 5.1,不支持 ecmascript 6 或更高版本的功能。

假如我现在有一个encrypt.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.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) 
	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()
}

其实otto还有很多有趣的功能,大家可以去otto的github项目里去看。

到此这篇关于go中调用js代码(otto)的实现示例的文章就介绍到这了,更多相关go调用js代码内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com