首页 > 解决方案 > 关于 Websocket 的 Autohotkey | Winhttp和东西问题

问题描述

尝试通过 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,正确的发送信息,但不知道如何发送和.. 是的。

网址: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()
    }

标签: websocketautohotkey

解决方案


首先,在 AHK v1 中,您通过使用双引号来转义引号""
在这里"tradePrice"`":(.*?)\.",您得到的字符串中有一个双引号,这非常幸运。
实际上它应该是这样完成的:"tradePrice"":(.*?)\.".
在接下来要做的事情中,您需要正确地转义引号。
此外,由于您有一个 json 响应,您可能想要解析 json 并使用它应该如何使用它。(见 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 类的类,但如果您了解 OOP (AHK),它实际上非常方便。

所以这是它的工作原理:

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

(当我说在课堂内HelperClassWebSocket课堂内时,实际上是不正确的,因为它们是同一个类,你只是WebSocket用你的类扩展类HelperClass

就是这样。


其他注意事项:
从 G33kDude 的 GitHub 下载 WebSocket 类,并将 WebSocket.ahk 文件包含到您自己的脚本中#Include(文档)

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

另请注意引号如何在DataToSend变量中正确转义。


推荐阅读