来源说明:本文参考 G33kDude 的 WebSocket.ahk 项目和对应论坛主题整理。该项目定位很明确:让 AutoHotkey 连接 WebSocket 服务器。本站已有 Socket、网络请求、浏览器自动化相关内容,这篇主要补上 WebSocket 这一块。
很多人第一次听到 WebSocket,会把它和普通 HTTP 请求混在一起。简单说:HTTP 更像“问一次,答一次”;WebSocket 更像“先建立一条连接,然后双方随时发消息”。如果你要做实时推送、网页控制脚本、OBS/调试面板联动、本机服务通知、浏览器 DevTools 协议这类场景,WebSocket 往往比轮询 HTTP 更合适。
一、WebSocket 适合什么
WebSocket 适合需要持续连接、实时消息、双向通信的场景。例如:
- AHK 和网页前端互相通信。
- AHK 连接本地调试服务或实时数据服务。
- AHK 控制支持 WebSocket API 的软件,例如部分直播、调试、自动化工具。
- 需要服务端主动推送消息,而不是 AHK 每隔几秒请求一次。
如果只是下载文件、请求接口、提交表单,优先用 WinHttpRequest、HTTP 请求库或站内网络请求示例即可。WebSocket 的价值在于连接建立后可以持续收发。
二、和 TCP Socket 的区别
WebSocket 底层也是基于 TCP,但它不是裸 TCP。它有自己的握手过程、帧格式、文本/二进制消息规则。浏览器原生支持 WebSocket,所以它特别适合“AHK 和网页/浏览器服务通信”。
裸 TCP 更自由,但你要自己设计协议;WebSocket 已经有通用协议,很多现成服务直接支持。选型可以这样理解:
- 对接浏览器、网页、Node、OBS、在线实时接口:优先 WebSocket。
- 自己写局域网小工具、设备通信、自定义协议:TCP/UDP 更直接。
- 只做普通接口请求:HTTP 更简单。
三、最小使用思路
不同版本的 WebSocket.ahk 示例写法可能略有差异,但基本结构通常离不开三步:连接服务器、处理消息、发送消息。
#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
#Include %A_ScriptDir%\WebSocket.ahk
; 下面是入门结构示意,具体回调名以项目 Examples 里的示例为准。
ws := new MyWebSocket("wss://echo.websocket.events")
return
class MyWebSocket extends WebSocket
{
OnOpen()
{
this.Send("Hello from AutoHotkey")
}
OnMessage(Message)
{
MsgBox, % "收到消息:`n" Message
}
OnClose()
{
MsgBox, WebSocket 连接已关闭
}
}
写实际脚本时,不要只盯着“能不能连接上”。更重要的是明确:服务端发来的消息是什么格式,是纯文本、JSON,还是二进制。大多数接口会使用 JSON,这时 WebSocket 只负责收发,解析还需要配合 JSON 库。
四、消息格式建议用 JSON
如果你自己设计 AHK 和网页之间的通信协议,建议从一开始就用 JSON。不要用逗号分隔、竖线分隔这类临时格式,后面一旦消息内容里也出现逗号、换行、引号,维护会很痛苦。
; 推荐消息结构示意
; {
; "type": "hotkey",
; "name": "copy_title",
; "time": 1780000000
; }
SendMessage(type, name) {
global ws
json := "{""type"":""" type """,""name"":""" name """}"
ws.Send(json)
}
如果消息复杂,建议配合站内 JSON 相关内容,不要靠字符串拼接硬写完整 JSON。简单测试可以拼接,正式脚本最好用 JSON 库生成和解析。
五、WebSocket 最常见的坑
第一,连接地址分 ws:// 和 wss://。前者是不加密 WebSocket,后者是 TLS 加密 WebSocket。网页如果是 HTTPS,通常不能随便连不安全的 ws:// 地址。
第二,连接成功不等于业务成功。很多服务连接后还要先发送认证消息、订阅消息或初始化参数,否则服务端不会推送你想要的数据。
第三,WebSocket 是长连接,要考虑断线重连。网络抖动、服务端重启、电脑休眠都会导致连接断开。
Reconnect:
try
{
ws := new MyWebSocket("ws://127.0.0.1:9000")
}
catch e
{
SetTimer, Reconnect, -3000
}
return
第四,回调里不要做太重的事情。收到消息后如果要执行耗时任务,可以用 SetTimer 转出去,避免阻塞消息处理。
六、调试方法
调 WebSocket 时,建议先用现成工具验证服务端,再写 AHK。浏览器控制台、Postman、Apifox、在线 WebSocket 测试工具都可以先确认地址、协议和消息格式。
AHK 侧至少要记录这些信息:
- 连接地址。
- 连接成功/失败时间。
- 收到的原始消息。
- 发送的原始消息。
- 关闭原因或错误信息。
Log(text) {
FormatTime, now,, yyyy-MM-dd HH:mm:ss
FileAppend, % "[" now "] " text "`r`n", %A_ScriptDir%\websocket.log, UTF-8
}
七、什么时候不要用 WebSocket
如果接口本身只是普通 HTTP,就不要为了“高级”强行套 WebSocket。如果目标程序没有 WebSocket API,也不要幻想 WebSocket 能自动控制它。WebSocket 只是通信通道,不负责理解业务。
对 AHK 新手来说,建议路线是:先会 HTTP 请求,再理解 TCP/UDP,最后学 WebSocket。这样你会更清楚每种通信方式解决的是哪类问题。

评论(0)