123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 |
- package hook
- import (
- "encoding/json"
- "fmt"
- "github.com/gorilla/websocket"
- "github.com/zeromicro/go-zero/core/logx"
- "strings"
- "wechat-api/workphone"
- )
- // 获取标签信息
- func (h *Hook) GetContactLabelList() (result GetContactLabelListReap, err error) {
- resp, err := h.Client.R().SetSuccessResult(&result).Post("http://" + h.ServerIp + ":" + h.WxPort + "/GetContactLabelList")
- if err != nil {
- return
- }
- if !resp.IsSuccessState() {
- err = fmt.Errorf("GetContactLabelList failed with status code %d", resp.StatusCode)
- return
- }
- return
- }
- // 获取好友和群信息
- func (h *Hook) GetFriendAndChatRoomList(typeStr string) (result GetFriendAndChatRoomListReap, err error) {
- resp, err := h.Client.R().SetBody(&GetFriendAndChatRoomListReq{
- Type: typeStr,
- }).SetSuccessResult(&result).Post("http://" + h.ServerIp + ":" + h.WxPort + "/GetFriendAndChatRoomList")
- if err != nil {
- return
- }
- if !resp.IsSuccessState() {
- err = fmt.Errorf("GetFriendAndChatRoomList failed with status code %d", resp.StatusCode)
- return
- }
- return
- }
- // 批量获取联系人简明信息(每次100个)
- func (h *Hook) BatchGetContactBriefInfo(wxids []string) (result BatchGetContactBriefInfoReap, err error) {
- wxidList := strings.Join(wxids, ",")
- resp, err := h.Client.R().SetBody(&BatchGetContactBriefInfoReq{
- WxidList: wxidList,
- }).SetSuccessResult(&result).Post("http://" + h.ServerIp + ":" + h.WxPort + "/BatchGetContactBriefInfo")
- if err != nil {
- return
- }
- if !resp.IsSuccessState() {
- err = fmt.Errorf("BatchGetChatRoomMemberWxid failed with status code %d", resp.StatusCode)
- return
- }
- return
- }
- // 添加新的好友
- func (h *Hook) AddNewFriend(v3_wxid string, v4 string, desc string, addType string, role string) (result AddNewFriendReap, err error) {
- resp, err := h.Client.R().SetBody(&AddNewFriendReq{
- V3Wxid: v3_wxid,
- V4: v4,
- Desc: desc,
- AddType: addType,
- Role: role,
- }).SetSuccessResult(&result).Post("http://" + h.ServerIp + ":" + h.WxPort + "/AddNewFriend")
- if err != nil {
- return
- }
- if !resp.IsSuccessState() {
- err = fmt.Errorf("AddNewFriend failed with status code %d", resp.StatusCode)
- return
- }
- return
- }
- func (h *Hook) RequestChatRoomInfo(ChatRoomId, wxWxid string) error {
- conn, err := h.connWorkPhone()
- if err != nil {
- err = fmt.Errorf("RequestChatRoomInfo failed")
- return err
- }
- defer func(conn *websocket.Conn) {
- err = conn.Close()
- if err != nil {
- err = fmt.Errorf("RequestChatRoomInfo failed")
- }
- }(conn)
- message := map[string]interface{}{
- "MsgType": "RequestChatRoomInfoTask",
- "Content": map[string]interface{}{
- "WeChatId": wxWxid,
- "Flag": 1,
- "ChatRoomId": ChatRoomId,
- },
- }
- transportMessageJSON, err := json.Marshal(message)
- if err != nil {
- return err
- }
- // 发送 JSON 消息
- err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
- if err != nil {
- return fmt.Errorf("failed to send message: %v", err)
- }
- return nil
- }
- func (h *Hook) TriggerChatroomPush(wxWxid string) error {
- conn, err := h.connWorkPhone()
- if err != nil {
- err = fmt.Errorf("TriggerChatroomPush failed")
- return err
- }
- defer func(conn *websocket.Conn) {
- err = conn.Close()
- if err != nil {
- err = fmt.Errorf("TriggerChatroomPush failed")
- }
- }(conn)
- message := map[string]interface{}{
- "MsgType": "TriggerChatroomPushTask",
- "Content": map[string]interface{}{
- "WeChatId": wxWxid,
- "Flag": 1,
- },
- }
- transportMessageJSON, err := json.Marshal(message)
- if err != nil {
- return err
- }
- // 发送 JSON 消息
- err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
- if err != nil {
- return fmt.Errorf("failed to send message: %v", err)
- }
- return nil
- }
- // TriggerCustomerPushTask 刷新企微联系人
- func (h *Hook) TriggerCustomerPushTask(wxWxid string) error {
- conn, err := h.connWorkPhone()
- if err != nil {
- err = fmt.Errorf("TriggerCustomerPushTask failed")
- return err
- }
- defer func(conn *websocket.Conn) {
- err = conn.Close()
- if err != nil {
- err = fmt.Errorf("TriggerCustomerPushTask failed")
- }
- }(conn)
- message := map[string]interface{}{
- "MsgType": "TriggerCustomerPushTask",
- "Content": map[string]interface{}{
- "WxId": wxWxid,
- },
- }
- transportMessageJSON, err := json.Marshal(message)
- if err != nil {
- return err
- }
- // 发送 JSON 消息
- err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
- if err != nil {
- return fmt.Errorf("failed to send message: %v", err)
- }
- return nil
- }
- // TriggerConversationPushTask 刷新企微群组
- func (h *Hook) TriggerConversationPushTask(wxWxid string) error {
- conn, err := h.connWorkPhone()
- if err != nil {
- err = fmt.Errorf("TriggerConversationPushTask failed")
- return err
- }
- defer func(conn *websocket.Conn) {
- err = conn.Close()
- if err != nil {
- err = fmt.Errorf("TriggerConversationPushTask failed")
- }
- }(conn)
- message := map[string]interface{}{
- "MsgType": "TriggerConversationPushTask",
- "Content": map[string]interface{}{
- "WxId": wxWxid,
- },
- }
- transportMessageJSON, err := json.Marshal(message)
- if err != nil {
- return err
- }
- // 发送 JSON 消息
- err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
- if err != nil {
- return fmt.Errorf("failed to send message: %v", err)
- }
- return nil
- }
- func (h *Hook) AddFriendInChatRoom(ChatRoomId, wxWxid, friendId, desc string) error {
- conn, err := h.connWorkPhone()
- if err != nil {
- err = fmt.Errorf("AddFriendInChatRoom failed")
- return err
- }
- defer func(conn *websocket.Conn) {
- err = conn.Close()
- if err != nil {
- err = fmt.Errorf("AddFriendInChatRoom failed")
- }
- }(conn)
- message := map[string]interface{}{
- "MsgType": "AddFriendInChatRoomTask",
- "Content": map[string]interface{}{
- "WeChatId": wxWxid,
- "ChatroomId": ChatRoomId,
- "FriendId": friendId,
- "Message": desc,
- },
- }
- transportMessageJSON, err := json.Marshal(message)
- if err != nil {
- return err
- }
- // 发送 JSON 消息
- err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
- if err != nil {
- return fmt.Errorf("failed to send message: %v", err)
- }
- return nil
- }
- // AddFriendsTask AddFriendTask 用于添加好友任务的消息结构
- type AddFriendsTask struct {
- WeChatId string `json:"WeChatId"`
- Phones []string `json:"Phones"`
- Message string `json:"message"`
- Remark string `json:"Remark"`
- TaskId int64 `json:"TaskId"`
- }
- // FindContactTask 用于查找联系人任务的消息结构
- type FindContactTask struct {
- WeChatId string `json:"WeChatId"`
- Content string `json:"Content"`
- }
- // MessagePayload 用于封装消息的负载结构
- type MessagePayload[T any] struct {
- Id workphone.EnumMsgType `json:"Id"`
- MsgType string `json:"MsgType"`
- Content T `json:"Content"`
- }
- // SendMessage 函数用于发送消息
- func SendMessage[T any](hook *Hook, msgType workphone.EnumMsgType, msgTypeStr string, content T) (map[string]interface{}, error) {
- conn, err := hook.connWorkPhone()
- if err != nil {
- logx.Errorf("WebSocket 连接失败: %v", err)
- return MessagePayload[T]{}.ToMap(), err
- }
- defer func() {
- if cerr := conn.Close(); cerr != nil {
- logx.Errorf("WebSocket 关闭失败: %v", cerr)
- }
- }()
- message := MessagePayload[T]{
- Id: msgType,
- MsgType: msgTypeStr,
- Content: content,
- }
- data, err := json.Marshal(message)
- if err != nil {
- return message.ToMap(), fmt.Errorf("JSON 序列化失败: %w", err)
- }
- if err := conn.WriteMessage(websocket.TextMessage, data); err != nil {
- return message.ToMap(), fmt.Errorf("发送消息失败: %w", err)
- }
- return message.ToMap(), nil
- }
- // AddFriendTask 函数用于创建并发送一个添加好友的任务
- // 参数:
- //
- // ownerWxId: 发起添加好友请求的微信ID
- // phone: 目标手机号
- // msg: 添加好友时附带的消息
- // taskId: 任务ID
- //
- // 返回值:
- //
- // 成功时返回包含添加好友任务信息的消息负载和nil错误
- // 失败时返回空的消息负载和相应的错误
- func (h *Hook) AddFriendTask(ownerWxId, phone, msg string, taskId int64) (map[string]interface{}, error) {
- if ownerWxId == "" || phone == "" || msg == "" {
- return MessagePayload[AddFriendsTask]{}.ToMap(), fmt.Errorf("invalid input parameters")
- }
- content := AddFriendsTask{
- WeChatId: ownerWxId,
- Phones: []string{phone},
- Message: msg,
- Remark: "",
- TaskId: taskId,
- }
- return SendMessage(h, workphone.EnumMsgType_AddFriendsTask, "AddFriendsTask", content)
- }
- // FindContactByContent 函数用于创建并发送一个查找联系人的任务
- // 参数:
- //
- // ownerWxId: 发起查找联系人请求的微信ID
- // contentMessage: 查找联系人的查询内容
- //
- // 返回值:
- //
- // 成功时返回包含查找联系人任务信息的消息负载和nil错误
- // 失败时返回空的消息负载和相应的错误
- func (h *Hook) FindContactByContent(ownerWxId, contentMessage string) (map[string]interface{}, error) {
- if ownerWxId == "" || contentMessage == "" {
- return MessagePayload[FindContactTask]{}.ToMap(), fmt.Errorf("invalid input parameters")
- }
- content := FindContactTask{
- WeChatId: ownerWxId,
- Content: contentMessage,
- }
- return SendMessage(h, workphone.EnumMsgType_FindContactTask, "FindContactTask", content)
- }
- func (m MessagePayload[T]) ToMap() map[string]interface{} {
- return map[string]interface{}{
- "Id": m.Id,
- "MsgType": m.MsgType,
- "Content": m.Content,
- }
- }
|