add code notes

This commit is contained in:
Ivy1996-encode 2021-02-20 11:53:18 +08:00
parent 6475fe6bfc
commit a7a234c950
7 changed files with 44 additions and 5 deletions

View File

@ -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)
}

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -1,3 +1,4 @@
package openwechat
// WechatStorage

28
user.go
View File

@ -51,11 +51,12 @@ func (u *User) String() string {
return fmt.Sprintf("<User:%s>", 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)