(摘) AutoHotkey接收网络指令

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

想通过网络来控制主机,通常我的办法应该是使用Golang。不过即使学了AutoHotkey,就应该多实践一下。
服务端还是需要通过外网挂接一个服务程序的。比如我使用了ZeroTier,把服务挂到内网的Pi3上也没问题。

服务端很简单,既然自己用,随便搞个变量存储指令就行了。

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

var cmd string

func main() {
	cmd = ""
	r := gin.Default()
	r.GET("/lk", func(c *gin.Context) { // 获取指令
		c.String(http.StatusOK, cmd)
	})
	r.GET("/slk/:cmd", func(c *gin.Context) {  // 设置指令
		cmd = c.Param("cmd")
		c.String(http.StatusOK, cmd)
	})
	r.GET("/clk", func(c *gin.Context) {  // 清空指令
		cmd = ""
		c.String(http.StatusOK, "clear")
	})
	r.Run(":80")
}

AutoHotkey就主代码片段了

SetTimer RemoteControl, 5000					    ;远程控制

; 远程控制
RemoteControl:
    cmd := Trim(UrlDownloadToVar("http://192.168.8.2/lk"))
    if StrLen(cmd)!=0
    {
        MsgBox, , "远程命令" , %cmd%, 5
        if cmd=="poff"			; 关机
        {
			Shutdown, 1
        }
        UrlDownloadToVar("http://192.168.8.2/clk")
    }
Return; 远程控制
RemoteControl:
    cmd := Trim(UrlDownloadToVar("http://192.168.8.2/lk"))
    if StrLen(cmd)!=0
    {
        MsgBox, , "远程命令" , %cmd%, 5
        if cmd=="poff"			; 关机
        {
			Shutdown, 1
        }
        UrlDownloadToVar("http://192.168.8.2/clk")
    }
Return

/*
*****************参数*****************
URL 网址,必须包含类似“http://www.”的开头。
Charset 网页字符集,不能是“936”之类的数字,必须是“gb2312”这样的字符。
URLCodePage URL的编码,是“936”之类的数字,默认是“65001”。有些网站需要UTF-8,有些网站又需要gb2312
Proxy 代理服务器,是形如“http://www.tuzi.com:80”的字符。
ProxyBypassList 代理服务器绕行名单,是形如“*.microsoft.com”的域名。符合域名的网址,将不通过代理服务器访问。
Cookie ,常用于登录验证。
Referer 引用网址,常用于防盗链。
UserAgent 用户信息,常用于防盗链。
EnableRedirects 重定向,默认获取跳转后的页面信息,0为不跳转。
Timeout 超时,单位为秒,默认不使用超时(Timeout=-1)。

*/
UrlDownloadToVar(URL,Charset="",URLCodePage="",Proxy="",ProxyBypassList="",Cookie="",Referer="",UserAgent="",EnableRedirects="",Timeout=-1)
{
	ComObjError(0)  ;禁用 COM 错误通告。禁用后,检查 A_LastError 的值,脚本可以实现自己的错误处理
	WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
	if (URLCodePage<>"")    ;设置URL的编码
		WebRequest.Option(2):=URLCodePage
	if (EnableRedirects<>"")
		WebRequest.Option(6):=EnableRedirects
	if (Proxy<>"")  ;设置代理服务器。微软的代码 SetProxy() 是放在 Open() 之前的,所以我也放前面设置,以免无效
		WebRequest.SetProxy(2,Proxy,ProxyBypassList)
	WebRequest.Open("GET", URL, true)   ;true为异步获取,默认是false。龟速的根源!!!卡顿的根源!!!
	if (Cookie<>"") ;设置Cookie。SetRequestHeader() 必须 Open() 之后才有效
	{
		WebRequest.SetRequestHeader("Cookie","tuzi")    ;先设置一个cookie,防止出错,见官方文档
		WebRequest.SetRequestHeader("Cookie",Cookie)
	}
	if (Referer<>"")    ;设置Referer
		WebRequest.SetRequestHeader("Referer",Referer)
	if (UserAgent<>"")  ;设置User-Agent
		WebRequest.SetRequestHeader("User-Agent",UserAgent)
	WebRequest.Send()
	WebRequest.WaitForResponse(Timeout) ;WaitForResponse方法确保获取的是完整的响应
	if (Charset="") ;设置字符集
		return,WebRequest.ResponseText()
	else
	{
		ADO:=ComObjCreate("adodb.stream")   ;使用 adodb.stream 编码返回值。参考 http://bbs.howtoadmin.com/ThRead-814-1-1.html
		ADO.Type:=1 ;以二进制方式操作
		ADO.Mode:=3 ;可同时进行读写
		ADO.Open()  ;开启物件
		ADO.Write(WebRequest.ResponseBody())    ;写入物件。注意 WebRequest.ResponseBody() 获取到的是无符号的bytes,通过 adodb.stream 转换成字符串string
		ADO.Position:=0 ;从头开始
		ADO.Type:=2 ;以文字模式操作
		ADO.Charset:=Charset    ;设定编码方式
		return,ADO.ReadText()   ;将物件内的文字读出
	}
}

题外,结合内网的语音服务器,也可以实现主机唤醒(WOL)。

相关文章