如何解决关于 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),它实际上非常方便。
所以这是它的工作原理:
-
New HelperClass("wss://echo.websocket.org/")
你准备在幕后魔术打开一个 websocket 连接到指定的 websocket - 一旦准备好魔法,
OnOpen()
函数就会在您的HelperClass
中运行 -
this.Send(DataToSend)
您调用Send
函数(如果在WebSocket
类中找到)并传入您想要的数据 - 您收到一条响应消息(
OnMessage()
在您的HelperClass
中运行),或者您可能收到一个错误(OnError()
在您的HelperClass
中运行) - 连接关闭,因此
OnClose()
在您的HelperClass
中运行。
您还想通过执行Disconnect()
调用
WebSocket
类中的 this.Disconnect()
函数来重置幕后魔法
(当我说在 HelperClass
或 WebSocket
类内部时,实际上是不正确的,因为它们是同一个类,您只是将 WebSocket
类扩展为你的 HelperClass
)
就是这样。
杂记:
从 G33kDude 的 GitHub 下载 WebSocket 类,并使用 #Include
(docs) 将 WebSocket.ahk 文件包含到您自己的脚本中。
G33kDude 示例脚本使用 #Include ../WebSocket.ahk
来包含它,因为他的示例脚本在一个子文件夹中,所以他用 ..
返回一个文件夹,然后指定要包含的文件。
另请注意 DataToSend
变量中引号是如何正确转义的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。