From a7a234c950fce226bd6bb623a21dc4b68a22cb2b Mon Sep 17 00:00:00 2001 From: Ivy1996-encode <15055461510@163.com> Date: Sat, 20 Feb 2021 11:53:18 +0800 Subject: [PATCH] add code notes --- client.go | 2 +- items.go | 10 ++++++++++ message.go | 7 ++++++- relations.go | 1 + http.go => response.go | 0 stroage.go | 1 + user.go | 28 +++++++++++++++++++++++++--- 7 files changed, 44 insertions(+), 5 deletions(-) rename http.go => response.go (100%) diff --git a/client.go b/client.go index 5decddd..e62132b 100644 --- a/client.go +++ b/client.go @@ -122,6 +122,7 @@ func (c *Client) SyncCheck(info LoginInfo, response WebInitResponse) (*http.Resp params.Add("deviceid", GetRandomDeviceId()) params.Add("_", strconv.FormatInt(time.Now().Unix(), 10)) syncKeyStringSlice := make([]string, 0) + // 将SyncKey里面的元素按照特定的格式拼接起来 for _, item := range response.SyncKey.List { i := fmt.Sprintf("%d_%d", item.Key, item.Val) syncKeyStringSlice = append(syncKeyStringSlice, i) @@ -130,7 +131,6 @@ func (c *Client) SyncCheck(info LoginInfo, response WebInitResponse) (*http.Resp params.Add("synckey", syncKey) path.RawQuery = params.Encode() req, _ := http.NewRequest(http.MethodGet, path.String(), nil) - req.Header.Add("User-Agent", "Mozilla/5.0") return c.Do(req) } diff --git a/items.go b/items.go index 0e80981..628647a 100644 --- a/items.go +++ b/items.go @@ -2,6 +2,11 @@ package openwechat import "fmt" +/* +一些网络返回信息的封装 +*/ + +// 登录信息 type LoginInfo struct { Ret int `xml:"ret"` Message string `xml:"message"` @@ -12,11 +17,14 @@ type LoginInfo struct { IsGrayScale int `xml:"isgrayscale"` } +// 初始的请求信息 +// 几乎所有的请求都要携带该参数 type BaseRequest struct { Uin int Sid, Skey, DeviceID string } +// 大部分返回对象都携带该信息 type BaseResponse struct { ErrMsg string Ret int @@ -58,6 +66,7 @@ type SyncKey struct { List []struct{ Key, Val int64 } } +// 初始化的相应信息 type WebInitResponse struct { BaseResponse BaseResponse Count int @@ -75,6 +84,7 @@ type WebInitResponse struct { ContactList []User } +// 公众号的订阅信息 type MPSubscribeMsg struct { UserName string Time int64 diff --git a/message.go b/message.go index bff49aa..5ff1a52 100644 --- a/message.go +++ b/message.go @@ -156,13 +156,14 @@ func (m *Message) IsSystem() bool { return m.MsgType == 10000 } -//func (m Message) Agree() error { +//func (m *Message) Agree() error { // if !m.IsFriendAdd() { // return fmt.Errorf("the excepted message type is 37, but got %d", m.MsgType) // } // m.ClientManager.Client.WebWxVerifyUser(m.ClientManager.storage, m.RecommendInfo, "") //} +// 发送消息的结构体 type SendMessage struct { Type int Content string @@ -173,6 +174,7 @@ type SendMessage struct { MediaId string } +// SendMessage的构造方法 func NewSendMessage(msgType int, content, fromUserName, toUserName, mediaId string) *SendMessage { return &SendMessage{ Type: msgType, @@ -185,14 +187,17 @@ func NewSendMessage(msgType int, content, fromUserName, toUserName, mediaId stri } } +// 文本消息的构造方法 func NewTextSendMessage(content, fromUserName, toUserName string) *SendMessage { return NewSendMessage(TextMessage, content, fromUserName, toUserName, "") } +// 媒体消息的构造方法 func NewMediaSendMessage(msgType int, fromUserName, toUserName, mediaId string) *SendMessage { return NewSendMessage(msgType, "", fromUserName, toUserName, mediaId) } +// 一些特殊类型的消息会携带该结构体信息 type RecommendInfo struct { Alias string AttrStatus int64 diff --git a/relations.go b/relations.go index e05eb9e..3051422 100644 --- a/relations.go +++ b/relations.go @@ -54,6 +54,7 @@ func (g *Group) SendImage(file *os.File) error { return g.sendImage(file) } +// 获取所有的群成员 func (g *Group) Members() (Members, error) { group, err := g.Detail() if err != nil { diff --git a/http.go b/response.go similarity index 100% rename from http.go rename to response.go diff --git a/stroage.go b/stroage.go index 3a9d8e0..859a304 100644 --- a/stroage.go +++ b/stroage.go @@ -1,3 +1,4 @@ + package openwechat // WechatStorage diff --git a/user.go b/user.go index b523c0f..fe0bb32 100644 --- a/user.go +++ b/user.go @@ -51,11 +51,12 @@ func (u *User) String() string { return fmt.Sprintf("", u.NickName) } -// +// 获取用户头像 func (u *User) GetAvatarResponse() (*http.Response, error) { return u.Self.Bot.Caller.Client.WebWxGetHeadImg(u.HeadImgUrl) } +// 下载用户头像 func (u *User) SaveAvatar(filename string) error { resp, err := u.GetAvatarResponse() if err != nil { @@ -93,6 +94,7 @@ func (u *User) remakeName(remarkName string) error { return u.Self.Bot.Caller.WebWxOplog(request, remarkName, u.UserName) } +// 获取用户的详情 func (u *User) Detail() (*User, error) { members := Members{u} request := u.Self.Bot.storage.GetBaseRequest() @@ -114,18 +116,21 @@ type Self struct { groups Groups } +// 获取所有的好友、群组、公众号信息 func (s *Self) Members(update ...bool) (Members, error) { + // 首先判断缓存里有没有,如果没有则去更新缓存 if s.members == nil { if err := s.updateMembers(); err != nil { return nil, err - } else { - return s.members, nil } + return s.members, nil } + // 判断是否需要更新,如果传入的参数不为nil,则取最后一个 var isUpdate bool if len(update) > 0 { isUpdate = update[len(update)-1] } + // 如果需要更新,则直接更新缓存 if isUpdate { if err := s.updateMembers(); err != nil { return nil, err @@ -134,6 +139,7 @@ func (s *Self) Members(update ...bool) (Members, error) { return s.members, nil } +// 更新联系人处理 func (s *Self) updateMembers() error { info := s.Bot.storage.GetLoginInfo() members, err := s.Bot.Caller.WebWxGetContact(info) @@ -145,7 +151,9 @@ func (s *Self) updateMembers() error { return nil } +// 获取文件传输助手对象,封装成Friend返回 func (s *Self) FileHelper() (*Friend, error) { + // 如果缓存里有,直接返回,否则去联系人里面找 if s.fileHelper != nil { return s.fileHelper, nil } @@ -156,6 +164,7 @@ func (s *Self) FileHelper() (*Friend, error) { for _, member := range members { if member.UserName == "filehelper" { fileHelper := &Friend{member} + // 将找到的缓存起来,方便下次调用 s.fileHelper = fileHelper return s.fileHelper, nil } @@ -163,6 +172,7 @@ func (s *Self) FileHelper() (*Friend, error) { return nil, errors.New("filehelper does not exist") } +// 获取所有的好友 func (s *Self) Friends(update ...bool) (Friends, error) { if s.friends == nil { if err := s.updateFriends(update...); err != nil { @@ -172,6 +182,7 @@ func (s *Self) Friends(update ...bool) (Friends, error) { return s.friends, nil } +// 获取所有的群组 func (s *Self) Groups(update ...bool) (Groups, error) { if s.groups == nil { if err := s.updateGroups(update...); err != nil { @@ -181,6 +192,7 @@ func (s *Self) Groups(update ...bool) (Groups, error) { return s.groups, nil } +// 更新好友处理 func (s *Self) updateFriends(update ...bool) error { var isUpdate bool if len(update) > 0 { @@ -202,6 +214,7 @@ func (s *Self) updateFriends(update ...bool) error { return nil } +// 更新群组处理 func (s *Self) updateGroups(update ...bool) error { var isUpdate bool if len(update) > 0 { @@ -223,12 +236,18 @@ func (s *Self) updateGroups(update ...bool) error { return nil } +// 更新所有的联系人信息 func (s *Self) UpdateMembersDetail() error { + // 先获取所有的联系人 members, err := s.Members() if err != nil { return err } + // 获取他们的数量 count := members.Count() + // 一次更新50个,分情况讨论 + + // 获取总的需要更新的次数 var times int if count < 50 { times = 1 @@ -238,6 +257,7 @@ func (s *Self) UpdateMembersDetail() error { newMembers := make(Members, 0) request := s.Self.Bot.storage.GetBaseRequest() var pMembers Members + // 分情况依次更新 for i := 0; i < times; i++ { if times == 1 { pMembers = members @@ -250,8 +270,10 @@ func (s *Self) UpdateMembersDetail() error { } newMembers = append(newMembers, nMembers...) } + // 最后判断是否全部更新完毕 total := times * 50 if total < count { + // 将全部剩余的更新完毕 left := total - count pMembers = members[total : total+left] nMembers, err := s.Self.Bot.Caller.WebWxBatchGetContact(pMembers, request)