微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决关于 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","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"",""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()
  6. 调用 WebSocket 类中的 this.Disconnect() 函数来重置幕后魔法

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

就是这样。


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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。