关于Websocket 的Autohotkey | Winhttp 和东西问题

Autohotkey concerning Websocket | Winhttp and stuff question

正在尝试通过websocket方法获取交易信息。有很多其他语言的指南和手册,我想通过 Autohotkey 获得它最好。

下面是我在使用 Autohotkey 接收信息时使用的代码。

Get_Price(Target_Site, Target_Coin, Price_Type = "KRW") {
if (Target_Site = "UpBit") {
API_Url := "https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/10?code=CRIX.UPBIT."
}

Result_URL := API_Url "" Price_Type "-" Target_Coin
Result_Json := Get_WinHttp(Result_URL)
    RegExMatch(Result_Json, "tradePrice"`":(.*?)\.", Result)  ;If(Target_Coin="BTT") Or (Target_Coin="DOGE") If(Target_Coin="BTT") Or (Target_Coin="DOGE")RegExMatch(Result_Json, "tradePrice"`":(.*?)\,", Result)
Return Result1                   
}

与 Websocket 相比,上述方法似乎更加明确和简单。我唯一需要做的就是用我的信息形成正确的 url 并发送那个 url 并从网站上得到结果。

但是,当涉及到 websocket 时,我知道正确的 url,正确的信息可以发送,但不知道我该如何发送......是的如何发送。

Url : wss://api.upbit.com/websocket/v1
送什么:'[{"ticket":"test1243563456"},{"type":"trade",{"type":"trade","codes":["KRW-BTC", "KRW-ETH"]}]'

如何:我不知道。但我碰巧遇到了一些有趣的 AHK 示例,我希望我可以修改它。如果您能看一看并指导我,将不胜感激。

#Include, Websocket.Ahk

class Example extends WebSocket
{
    OnOpen(Event)
    {
        InputBox, Data, WebSocket, Enter some text to send through the websocket.
        If (ErrorLevel==1)
            this.Close()
        this.Send(Data)
    }
    
    OnMessage(Event)
    {
        MsgBox, % "Received Data: " Event.data
        new Example("wss://echo.websocket.org/")
    }
    
    OnClose(Event)
    {
        MsgBox, Websocket Closed
        this.Disconnect()
    }

首先,在 AHK v1 中,您可以通过双引号转义引号 ""
这里 "tradePrice"`":(.*?)\." 你的结果字符串中有一个双引号,非常幸运。
实际上应该这样做:"tradePrice"":(.*?)\.".
您需要在接下来要执行的操作中正确转义引号。
此外,由于您有 json 响应,您可能想要解析 json 并按照 应该使用的方式使用它 .(See AHK JSON/Jxon)

关于 websocket。
就个人而言,我会说 G33kDude 的示例(Github) 很好地解释了它,但也许您被他为此做出的面向对象的代码风格选择所抛弃。
如果你对 OOP/OOP AHK 没有经验,我想这并不容易理解。

下面是一个使用您要发送的数据调用 echo websocket 的示例。

#Include WebSocket.ahk

New HelperClass("wss://echo.websocket.org/")

class HelperClass extends WebSocket
{
    OnOpen(Event)
    {
        DataToSend := "[{""ticket"":""test1243563456""},{""type"":""trade"",{""type"":""trade"",""codes"":[""KRW-BTC"", ""KRW-ETH""]}]"
        this.Send(DataToSend)
    }
    
    OnMessage(event)
    {
        MsgBox, % "Received a message!:`n" Event.data
        this.Close()
    }
    
    OnClose(Event)
    {
        MsgBox, Websocket Closed
        this.Disconnect()
    }
    
    OnError(Event)
    {
        MsgBox, Websocket Error
    }
    
    __Delete()
    {
        MsgBox, Exiting
        ExitApp
    }
}

由于 WebSocket 的设计方式,您必须 class 扩展 WebSocket class,但如果您了解 OOP (AHK),它实际上非常方便。

这是它的工作原理:

  1. New HelperClass("wss://echo.websocket.org/")
    你准备幕后魔术打开一个websocket连接到指定的websocket
  2. OnOpen() 函数在您的 HelperClass 中运行,一旦魔法准备就绪
  3. this.Send(DataToSend)
    您调用 Send 函数(如果在 WebSocket class 中找到)并传入您想要的数据
  4. 您收到一条响应消息(OnMessage() 在您的 HelperClass 中运行),或者您可能收到一条错误消息(OnError() 在您的 HelperClass 中运行)
  5. 连接关闭,因此 OnClose() 在您的 HelperClass 中运行。
    你还想通过 this.Disconnect()
  6. WebSocket class 中调用 Disconnect() 函数来重置幕后魔法

(当我说 HelperClassWebSocket class 时,实际上是不正确的,因为它们有点相同 class,你只是用 HelperClass)

扩展 WebSocket class

就是这样。


杂项说明:
从 G33kDude 的 GitHub 下载 WebSocket class 并使用 #Include(docs) 将 WebSocket.ahk 文件包含到您自己的脚本中。

G33kDude示例脚本使用#Include ../WebSocket.ahk来包含它,因为他的示例脚本在子文件夹中,所以他用..返回一个文件夹,然后指定要包含的文件。

还要注意引号在 DataToSend 变量中是如何正确转义的。