在Golang中运行JavaScript(爬虫必备技术)
标签搜索

在Golang中运行JavaScript(爬虫必备技术)

远航
2022-04-26 / 0 评论 / 46 阅读 / 正在检测是否收录...
使用场景,爬取网站内容调用js代码进行解密
用go重新写一套别人的自定义解密多累啊
万物的起源main方法
package main

import (
    "github.com/dop251/goja"
)

func main() {

}
先定义两个用于获取js代码返回值的方法
// MyObject 定义一个js内部可调用的对象
func MyObject(call goja.ConstructorCall) *goja.Object {
    // 设置一个改对象的方法
    err := call.This.Set("get_data", getDataFunc)
    if err != nil {
        return nil
    }
    return nil
}

// getDataFunc js内部对象get_data方法实现执行的逻辑,用于获取js方法返回值
func getDataFunc(name, age string) string {
    return "我叫:" + name + "\r\n年龄:" + age
}
开始执行JavaScript方法
package main

import (
    "github.com/dop251/goja"
)

func main() {
    vm := goja.New()
    vm.Set("MyObject", MyObject) // 把方法以对象的形式映射到js中
    v, err := vm.RunString(      // 运行的js代码 并获取返回值
        `
    function myMsg() {
        return ['Golang','10']
    }
    var msg = myMsg();
    // 调用go映射进来的方法获取js返回值
    var o = new MyObject();
    o.get_data(msg[0],msg[1]);
  `) //默认输出最后一个
    if err != nil {
        panic(err)
    }
    // 打印返回值
    println(v.Export().(string))
}
控制台输出结果
我叫:Golang
年龄:10
完整代码
package main

import (
    "github.com/dop251/goja"
)

func main() {
    vm := goja.New()
    vm.Set("MyObject", MyObject) // 把方法以对象的形式映射到js中
    v, err := vm.RunString(      // 运行的js代码 并获取返回值
        `
    function myMsg() {
        return ['Golang','10']
    }
    var msg = myMsg();
    // 调用go映射进来的方法获取js返回值
    var o = new MyObject();
    o.get_data(msg[0],msg[1]);
  `) //默认输出最后一个
    if err != nil {
        panic(err)
    }
    // 打印返回值
    println(v.Export().(string))
}

// MyObject 定义一个js内部可调用的对象
func MyObject(call goja.ConstructorCall) *goja.Object {
    // 设置一个改对象的方法
    err := call.This.Set("get_data", getDataFunc)
    if err != nil {
        return nil
    }
    return nil
}

// getDataFunc js内部对象get_data方法实现执行的逻辑,用于获取js方法返回值
func getDataFunc(name, age string) string {
    return "我叫:" + name + "\r\n年龄:" + age
}
1

评论 (0)

取消