websocket - 关于 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()
}
解决方案
首先,在 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),它实际上非常方便。
所以这是它的工作原理:
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 类,并将 WebSocket.ahk 文件包含到您自己的脚本中#Include
(文档)。
G33kDude 示例脚本用来#Include ../WebSocket.ahk
包含它,因为他的示例脚本在一个子文件夹中,所以他返回一个文件夹,..
然后指定要包含的文件。
另请注意引号如何在DataToSend
变量中正确转义。
推荐阅读
- python - 创建 Tensorflow 模型,该模型接受张量图像作为模型的输入
- php - 如何对具有对象外键值的数组进行排序必须是第一个(Laravel)
- javascript - 如何在动态创建的单选按钮上触发功能
- pandas - 跨两个轴的小计和总计
- r - R DataTable 选择行
- git - 如何在不使用交互式 git rebase 的情况下将两个 git 提交合并为一个提交?
- linux - tar(子):test.zip:无法打开:压缩 node_modules 时是一个目录
- bash - 如何在 bash 中不使用“日期”来计算昨天的日期?(苹果系统)
- angular - 调试信息量不足的 Angular 应用程序错误
- reporting - COGNOS 10.2:自动提交只能通过在报告工作室之外运行报告来工作