package main import ( "encoding/json" "fmt" "golang.org/x/sys/windows" "os" "os/exec" "github.com/r3labs/sse/v2" ) func main() { println("Hello, World!") deviceId := os.Getenv("DEVICE_ID") if deviceId == "" { println("DEVICE_ID env is not set") os.Exit(1) } for { fmt.Println("开始连接。") client := sse.NewClient("https://ivampiresp.com/wp-content/rCMD/sse.php?device=" + deviceId) err := client.Subscribe("message", func(msg *sse.Event) { //fmt.Println(msg.Data) // byte to json var data map[string]interface{} err := json.Unmarshal(msg.Data, &data) //fmt.Println(data) if err != nil { fmt.Println(err) return } cmd := data["cmd"] param := data["param"] if cmd == nil { fmt.Println("cmd or params is nil") return } // interface to string cmdStr := fmt.Sprintf("%v", cmd) paramStr := fmt.Sprintf("%v", param) fmt.Println(cmdStr) fmt.Println(paramStr) fmt.Println("参数是: " + paramStr) // 获取当前用户目录 home, err := os.UserHomeDir() if err != nil { fmt.Println(err) return } // 切换到用户目录 err = os.Chdir(home) if err != nil { fmt.Println(err) return } // 快捷命令,比如 lock canExec := quickCommand(cmdStr) if canExec { return } fmt.Println("命令: " + cmdStr + " " + paramStr) cmdExec := exec.Command(cmdStr, paramStr) err = cmdExec.Run() if err != nil { fmt.Println(err) return } fmt.Println(cmdExec.Output()) //fmt.Println(cmdExec.Stdout) //fmt.Println(cmdExec.Stderr) //fmt.Println(cmdExec.ProcessState) fmt.Println("执行完成。") }) if err != nil { fmt.Println(err) // 下个循环重新连接 continue } } } func lockWorkStation() error { user32 := windows.NewLazySystemDLL("user32.dll") lockWorkStation := user32.NewProc("LockWorkStation") ret, _, err := lockWorkStation.Call() if ret == 0 { return err } return nil } func quickCommand(command string) bool { if command == "lock" { err := lockWorkStation() if err != nil { fmt.Println(err) return false } return true } return false }