mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
174 lines
4.9 KiB
Go
174 lines
4.9 KiB
Go
package wecom
|
|
|
|
import "encoding/json"
|
|
|
|
const (
|
|
wecomDefaultWebSocketURL = "wss://openws.work.weixin.qq.com"
|
|
wecomCmdSubscribe = "aibot_subscribe"
|
|
wecomCmdPing = "ping"
|
|
wecomCmdMsgCallback = "aibot_msg_callback"
|
|
wecomCmdEventCallback = "aibot_event_callback"
|
|
wecomCmdRespondMsg = "aibot_respond_msg"
|
|
wecomCmdSendMsg = "aibot_send_msg"
|
|
wecomCmdUploadMediaInit = "aibot_upload_media_init"
|
|
wecomCmdUploadMediaChunk = "aibot_upload_media_chunk"
|
|
wecomCmdUploadMediaEnd = "aibot_upload_media_finish"
|
|
)
|
|
|
|
type wecomEnvelope struct {
|
|
Cmd string `json:"cmd,omitempty"`
|
|
Headers wecomHeaders `json:"headers"`
|
|
Body json.RawMessage `json:"body,omitempty"`
|
|
ErrCode int `json:"errcode,omitempty"`
|
|
ErrMsg string `json:"errmsg,omitempty"`
|
|
}
|
|
|
|
type wecomHeaders struct {
|
|
ReqID string `json:"req_id,omitempty"`
|
|
}
|
|
|
|
type wecomCommand struct {
|
|
Cmd string `json:"cmd"`
|
|
Headers wecomHeaders `json:"headers"`
|
|
Body any `json:"body,omitempty"`
|
|
}
|
|
|
|
type wecomSendMsgBody struct {
|
|
ChatID string `json:"chatid"`
|
|
ChatType uint32 `json:"chat_type,omitempty"`
|
|
MsgType string `json:"msgtype"`
|
|
Markdown *wecomMarkdownContent `json:"markdown,omitempty"`
|
|
File *wecomMediaRefContent `json:"file,omitempty"`
|
|
Image *wecomMediaRefContent `json:"image,omitempty"`
|
|
Voice *wecomMediaRefContent `json:"voice,omitempty"`
|
|
Video *wecomVideoContent `json:"video,omitempty"`
|
|
TemplateCard map[string]any `json:"template_card,omitempty"`
|
|
}
|
|
|
|
type wecomRespondMsgBody struct {
|
|
MsgType string `json:"msgtype"`
|
|
Stream *wecomStreamContent `json:"stream,omitempty"`
|
|
Markdown *wecomMarkdownContent `json:"markdown,omitempty"`
|
|
File *wecomMediaRefContent `json:"file,omitempty"`
|
|
Image *wecomMediaRefContent `json:"image,omitempty"`
|
|
Voice *wecomMediaRefContent `json:"voice,omitempty"`
|
|
Video *wecomVideoContent `json:"video,omitempty"`
|
|
TemplateCard map[string]any `json:"template_card,omitempty"`
|
|
}
|
|
|
|
type wecomStreamContent struct {
|
|
ID string `json:"id"`
|
|
Finish bool `json:"finish"`
|
|
Content string `json:"content,omitempty"`
|
|
}
|
|
|
|
type wecomMarkdownContent struct {
|
|
Content string `json:"content"`
|
|
}
|
|
|
|
type wecomMediaRefContent struct {
|
|
MediaID string `json:"media_id"`
|
|
}
|
|
|
|
type wecomVideoContent struct {
|
|
MediaID string `json:"media_id"`
|
|
Title string `json:"title,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
}
|
|
|
|
type wecomUploadMediaInitBody struct {
|
|
Type string `json:"type"`
|
|
Filename string `json:"filename"`
|
|
TotalSize int64 `json:"total_size"`
|
|
TotalChunks int `json:"total_chunks"`
|
|
MD5 string `json:"md5,omitempty"`
|
|
}
|
|
|
|
type wecomUploadMediaInitResponse struct {
|
|
UploadID string `json:"upload_id"`
|
|
}
|
|
|
|
type wecomUploadMediaChunkBody struct {
|
|
UploadID string `json:"upload_id"`
|
|
ChunkIndex int `json:"chunk_index"`
|
|
Base64Data string `json:"base64_data"`
|
|
}
|
|
|
|
type wecomUploadMediaFinishBody struct {
|
|
UploadID string `json:"upload_id"`
|
|
}
|
|
|
|
type wecomUploadMediaFinishResponse struct {
|
|
Type string `json:"type"`
|
|
MediaID string `json:"media_id"`
|
|
CreatedAt json.RawMessage `json:"created_at"`
|
|
}
|
|
|
|
type wecomIncomingMessage struct {
|
|
MsgID string `json:"msgid"`
|
|
AIBotID string `json:"aibotid"`
|
|
ChatID string `json:"chatid,omitempty"`
|
|
ChatType string `json:"chattype,omitempty"`
|
|
From struct {
|
|
UserID string `json:"userid"`
|
|
} `json:"from"`
|
|
MsgType string `json:"msgtype"`
|
|
Text *struct {
|
|
Content string `json:"content"`
|
|
} `json:"text,omitempty"`
|
|
Image *struct {
|
|
URL string `json:"url"`
|
|
AESKey string `json:"aeskey,omitempty"`
|
|
} `json:"image,omitempty"`
|
|
File *struct {
|
|
URL string `json:"url"`
|
|
AESKey string `json:"aeskey,omitempty"`
|
|
} `json:"file,omitempty"`
|
|
Video *struct {
|
|
URL string `json:"url"`
|
|
AESKey string `json:"aeskey,omitempty"`
|
|
} `json:"video,omitempty"`
|
|
Voice *struct {
|
|
Content string `json:"content"`
|
|
} `json:"voice,omitempty"`
|
|
Mixed *struct {
|
|
MsgItem []struct {
|
|
MsgType string `json:"msgtype"`
|
|
Text *struct {
|
|
Content string `json:"content"`
|
|
} `json:"text,omitempty"`
|
|
Image *struct {
|
|
URL string `json:"url"`
|
|
AESKey string `json:"aeskey,omitempty"`
|
|
} `json:"image,omitempty"`
|
|
File *struct {
|
|
URL string `json:"url"`
|
|
AESKey string `json:"aeskey,omitempty"`
|
|
} `json:"file,omitempty"`
|
|
} `json:"msg_item"`
|
|
} `json:"mixed,omitempty"`
|
|
Quote *struct {
|
|
MsgType string `json:"msgtype"`
|
|
Text *struct {
|
|
Content string `json:"content"`
|
|
} `json:"text,omitempty"`
|
|
} `json:"quote,omitempty"`
|
|
Event *struct {
|
|
EventType string `json:"eventtype"`
|
|
} `json:"event,omitempty"`
|
|
}
|
|
|
|
func incomingChatID(msg wecomIncomingMessage) string {
|
|
if msg.ChatID != "" {
|
|
return msg.ChatID
|
|
}
|
|
return msg.From.UserID
|
|
}
|
|
|
|
func incomingChatTypeCode(kind string) uint32 {
|
|
if kind == "group" {
|
|
return 2
|
|
}
|
|
return 1
|
|
}
|