VC++ 写的酷 Q UDP Socket API。
- 下载 me.cqp.ishisashi.cqsocketapi.cpk,放入酷 Q 的 app 目录。
- 启用插件「CoolQ Socket API (Node.js)」。
- 重启酷 Q。
插件目录的 config.ini 是设定档案。
已附带 Node.js 之实现 QQBot.js,可以直接导入使用。
Docker 用户请参见附录。
服务端和客户端用 UDP 包通信。
默认监听端口 11235,可以修改设定。
客户端应每隔 5 分钟发送 ClientHello 以保持连接。
数据包内部各信息以空格分隔,基本格式如下:
Frame = Prefix (max 256) + Payload (max 32768)
布尔值 True、False 用 1、0 表示。
'ServerHello' + Timeout + PrefixSize + PayloadSize + FrameSize
'PrivateMessage' + QQNum + EncodedText (Message) + SubType + MsgID + EncodedText (UserInfo)
'GroupMessage' + GroupID + QQNum + EncodedText (Message) + SubType + MsgID + EncodedText (UserInfo) + EncodedText (Anonymous)
'DiscussMessage' + DiscussID + QQNum + EncodedText (Message) + SubType + MsgID + EncodedText (UserInfo)
'GroupAdmin' + GroupId + SubType + QQNum + SendTime + EncodedText (UserInfo)
'GroupMemberDecrease' + GroupID + AdminQQNum + OperatedQQNum + SubType + SendTime + EncodedText (AdminInfo) + EncodedText (UserInfo)
'GroupMemberIncrease' + GroupID + AdminQQNum + OperatedQQNum + SubType + SendTime + EncodedText (UserInfo)
'GroupMemberInfo' + EncodedText (UserInfo)
'StrangerInfo' + EncodedText (UserInfo)
'LoginNick' + EncodedText (UserName)
'FriendAdded' + QQNum + SubType + SendTime + EncodedText (UserInfo)
'RequestAddFriend' + QQNum + EncodedText (Message) + EncodedText (Flag) + SubType + SendTime + EncodedText (UserInfo)
'RequestAddGroup' + GroupID + QQNum + EncodedText (Message) + EncodedText (Flag) + SubType + SendTime + EncodedText (UserInfo)
'GroupUpload' + GroupID + QQNum + EncodedText (FileInfo) + SubType + SendTime + EncodedText (UserInfo)
'GroupMemberList' + EncodedText (File) + EncodedText (AppDir)
'Cookies' + EncodedText (Cookies) + EncodedText (Domain)
'CsrfToken' + EncodedText (CsrfToken)
'LoginQQ' + QQNum
'AppDirectory' + EncodedText (AppDirectory)
'PrivateMessageID' + MsgID + Key
'GroupMessageID' + MsgID + Key
'DiscussMessageID' + MsgID + Key
'GroupList' + EncodedText (File) + EncodedText (AppDir)
'Record' + EncodedText (File) + EncodedText (Source) + EncodedText (Format) + EncodedText (AppDir)
'Image' + EncodedText (File) + EncodedText (Source) + EncodedText (AppDir)
'CanSendImage' + CanSendImage
'CanSendRecord' + CanSendRecord
'GroupBan' + GroupID + AdminQQNum + OperatedQQNum + Duration + SubType + SendTime + EncodedText (AdminInfo) + EncodedText (UserInfo)
'GroupInfo' + EncodedText (GroupInfo)
'FriendList' + EncodedText (File) + EncodedText (AppDir)
其中:
EncodedText = base64_encode(GB18030_encode(text))
CanSendImage、CanSendRecord 为布尔值。
UserInfo 的格式可参考附带的 QQBot.js。
GroupMessage 123456 10000 dGVzdCCy4srUIG5hgTCKN3ZlW0NROmVtb2ppLGlkPTEyODE2Ml0= 1 123456 (null)
应理解为:
{
"Type": "GroupMessage",
"GroupID": 123456,
"QQNum": 10000,
"EncodedMsg": "dGVzdCCy4srUIG5hgTCKN3ZlW0NROmVtb2ppLGlkPTEyODE2Ml0=",
"SubType": 1,
"MsgID": 123456,
"EncodedAnonymous": null
}
由于输入来自服务器,GroupID 解读为「来源群」。QQ 中的很多 ID,如 QQ 号、群号,都为正整数。 编码的 EncodedText 最终应解码至「test 测试 naïve💢」,其中「💢」(U+1F4A2)以 CQ 码「[CQ:emoji,id=128162]」呈现。
'ClientHello' + Port
'PrivateMessage' + QQNum + EncodedText (Message) + Key
'GroupMessage' + GroupID + EncodedText (Message) + Key
'DiscussMessage' + DiscussID + EncodedText (Message) + Key
'GroupMemberInfo' + GroupID + QQNum + IsNotCached
'StrangerInfo' + QQNum + IsNotCached
'LoginNick'
'GroupBan' + GroupID + QQNum + Duration
'Like' + QQNum + Times
'GroupKick' + GroupID + QQNum + RejectAddRequest
'GroupAdmin' + GroupID + QQNum + SetAdmin
'GroupWholeBan' + GroupID + EnableBan
'GroupAnonymousBan' + GroupID + EncodedText (Anonymous)
'GroupAnonymous' + GroupID + EnableAnonymous
'GroupCard' + GroupID + QQNum + EncodedText (NewCard)
'GroupLeave' + GroupID + IsDismiss
'GroupSpecialTitle' + GroupID + QQNum + EncodedText (NewSpecialTitle) + Duration
'DiscussLeave' + DiscussID
'FriendAddRequest' + EncodedText (ResponseFlag) + ResponseOperation + EncodedText (Remark)
'GroupAddRequest' + EncodedText (ResponseFlag) + RequestType + ResponseOperation + EncodedText (Reason)
'GroupMemberList' + GroupID
'Cookies' + EncodedText (Domain)
'CsrfToken'
'LoginQQ'
'AppDirectory'
'DeleteMessage' + MsgID
'GroupList'
'Record' + EncodedText (File) + EncodedText (Format)
'Image' + EncodedText (File)
'CanSendImage'
'CanSendRecord'
'GroupInfo' + GroupID + IsNotCached
'FriendList' + Reserved
其中 IsNotCached、RejectAddRequest、SetAdmin、EnableBan、EnableAnonymous、IsDismiss 为布尔值,Duration 以秒为单位。
GroupMessage 123456 ZWZmaWNpZW5jeQ== 123456
应理解为:
{
"Type": "GroupMessage",
"GroupID": 123456,
"EncodedMsg": "ZWZmaWNpZW5jeQ==",
"Number": 123456
}
此为传送到群号 123456 的群的一条信息,内容为「efficiency」。