关于Websocket的自动热键| Winhttp等问题



尝试通过websocket方法获取交易信息。有很多其他语言的指南和手册,我希望通过自动热键得到它。

下面是我使用自动热键接收信息时使用的代码。

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,并使用它应该如何使用(参见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中运行。
    你还想通过执行this.Disconnect()
  6. WebSocket类中调用Disconnect()函数来重置幕后魔法。

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

就是这样。


其他注意事项:
从G33kDude的GitHub下载WebSocket类并包含WebSocket。使用#Include(docs).

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

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

最新更新