From 17eeea93a9d4a5468839605916c9fa7721562095 Mon Sep 17 00:00:00 2001 From: eatMoreApple <15055461510@163.com> Date: Fri, 30 Apr 2021 11:26:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=8F=91=E9=80=81=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.json | 1 + bot_test.go | 4 +- relations.go | 340 ++++++++++++++++++++++++++------------------------- user.go | 8 ++ 4 files changed, 186 insertions(+), 167 deletions(-) create mode 100755 2.json diff --git a/2.json b/2.json new file mode 100755 index 0000000..f35309f --- /dev/null +++ b/2.json @@ -0,0 +1 @@ +{"Cookie":{"https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?_=1619753139\u0026loginicon=true\u0026r=1025809\u0026tip=0\u0026uuid=gYZs5buMyQ%3D%3D":[],"https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?_=1619753149\u0026loginicon=true\u0026r=1025809\u0026tip=0\u0026uuid=gYZs5buMyQ%3D%3D":[],"https://login.wx.qq.com/jslogin?_=1619753139\u0026appid=wx782c26e4c19acffb\u0026fun=new\u0026lang=zh_CN\u0026redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage%3Fmod%3Ddesktop":[],"https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ARAycLZsFpdoTlhU3tN5XVLN@qrticket_0\u0026uuid=gYZs5buMyQ==\u0026lang=zh_CN\u0026scan=1619753075":[{"Name":"wxuin","Value":"1708795586","Path":"/","Domain":"wx.qq.com","Expires":"2021-04-30T15:24:37Z","RawExpires":"Fri, 30-Apr-2021 15:24:37 GMT","MaxAge":0,"Secure":true,"HttpOnly":false,"SameSite":0,"Raw":"wxuin=1708795586; Domain=wx.qq.com; Path=/; Expires=Fri, 30-Apr-2021 15:24:37 GMT; Secure","Unparsed":null},{"Name":"wxsid","Value":"VZXeFoWYP7GCaAIq","Path":"/","Domain":"wx.qq.com","Expires":"2021-04-30T15:24:37Z","RawExpires":"Fri, 30-Apr-2021 15:24:37 GMT","MaxAge":0,"Secure":true,"HttpOnly":false,"SameSite":0,"Raw":"wxsid=VZXeFoWYP7GCaAIq; Domain=wx.qq.com; Path=/; Expires=Fri, 30-Apr-2021 15:24:37 GMT; Secure","Unparsed":null},{"Name":"wxloadtime","Value":"1619753077","Path":"/","Domain":"wx.qq.com","Expires":"2021-04-30T15:24:37Z","RawExpires":"Fri, 30-Apr-2021 15:24:37 GMT","MaxAge":0,"Secure":true,"HttpOnly":false,"SameSite":0,"Raw":"wxloadtime=1619753077; Domain=wx.qq.com; Path=/; Expires=Fri, 30-Apr-2021 15:24:37 GMT; Secure","Unparsed":null},{"Name":"mm_lang","Value":"zh_CN","Path":"/","Domain":"wx.qq.com","Expires":"2021-04-30T15:24:37Z","RawExpires":"Fri, 30-Apr-2021 15:24:37 GMT","MaxAge":0,"Secure":true,"HttpOnly":false,"SameSite":0,"Raw":"mm_lang=zh_CN; Domain=wx.qq.com; Path=/; Expires=Fri, 30-Apr-2021 15:24:37 GMT; Secure","Unparsed":null},{"Name":"webwx_data_ticket","Value":"gSfhlzZhJxwsKqOCSn0LU+PF","Path":"/","Domain":".qq.com","Expires":"2021-04-30T15:24:37Z","RawExpires":"Fri, 30-Apr-2021 15:24:37 GMT","MaxAge":0,"Secure":true,"HttpOnly":false,"SameSite":0,"Raw":"webwx_data_ticket=gSfhlzZhJxwsKqOCSn0LU+PF; Domain=.qq.com; Path=/; Expires=Fri, 30-Apr-2021 15:24:37 GMT; Secure","Unparsed":null},{"Name":"webwxuvid","Value":"e17d2b8599a5bfaff2286973a25242e25f0eb06badd866a87869372f4d33f13b2615dae18ba2e5757d246fba3023f0b4","Path":"/","Domain":"wx.qq.com","Expires":"2031-04-28T03:24:37Z","RawExpires":"Mon, 28-Apr-2031 03:24:37 GMT","MaxAge":0,"Secure":true,"HttpOnly":false,"SameSite":0,"Raw":"webwxuvid=e17d2b8599a5bfaff2286973a25242e25f0eb06badd866a87869372f4d33f13b2615dae18ba2e5757d246fba3023f0b4; Domain=wx.qq.com; Path=/; Expires=Mon, 28-Apr-2031 03:24:37 GMT; Secure","Unparsed":null},{"Name":"webwx_auth_ticket","Value":"CIsBELDQxc8MGoABhFi8lbeoxYn56VO3NskD7ei0hTFQ7yVTBm1VuwCE5mTQF0cRl3LOrIe3S7E5N0z1l7TITU1DUnirItDTYKppbK7PlSGspP2384nK48mQOVw7HQuP+/fFq3scSXqxCs0bQtDmJrZXulySMAudgNvN11KWu589QaYKarR9KuwmEAk=","Path":"/","Domain":"wx.qq.com","Expires":"2031-04-28T03:24:37Z","RawExpires":"Mon, 28-Apr-2031 03:24:37 GMT","MaxAge":0,"Secure":true,"HttpOnly":false,"SameSite":0,"Raw":"webwx_auth_ticket=CIsBELDQxc8MGoABhFi8lbeoxYn56VO3NskD7ei0hTFQ7yVTBm1VuwCE5mTQF0cRl3LOrIe3S7E5N0z1l7TITU1DUnirItDTYKppbK7PlSGspP2384nK48mQOVw7HQuP+/fFq3scSXqxCs0bQtDmJrZXulySMAudgNvN11KWu589QaYKarR9KuwmEAk=; Domain=wx.qq.com; Path=/; Expires=Mon, 28-Apr-2031 03:24:37 GMT; Secure","Unparsed":null}]},"Req":{"Uin":1708795586,"Sid":"VZXeFoWYP7GCaAIq","Skey":"@crypt_b8947f4b_bca6295f7539ee2d5656703e1136ce2b","DeviceID":"e624831403780183"},"Info":{"Ret":0,"WxUin":1708795586,"IsGrayScale":1,"Message":"","SKey":"@crypt_b8947f4b_bca6295f7539ee2d5656703e1136ce2b","WxSid":"VZXeFoWYP7GCaAIq","PassTicket":"7oehPxVcZlQmxgWmYmVU0YTBh3uz97QtXc3Ia9rhx%2Bpa%2B5VV4%2BdWMrX8glP4m5qN"}} \ No newline at end of file diff --git a/bot_test.go b/bot_test.go index 623f0df..3cd92cd 100644 --- a/bot_test.go +++ b/bot_test.go @@ -308,9 +308,9 @@ func TestSendFile(t *testing.T) { t.Error(err) return } - f, _ := os.Open("Taylor+Swift+-+Red") + f, _ := os.Open("README.md") defer f.Close() - msg, err := self.SendFileToFriend(fh, f) + msg, err := fh.SendFile(f) if err != nil { t.Error(err) return diff --git a/relations.go b/relations.go index cf1140d..29ab06e 100644 --- a/relations.go +++ b/relations.go @@ -1,289 +1,299 @@ package openwechat import ( - "fmt" - "os" - "time" + "fmt" + "os" + "time" ) type Friend struct{ *User } // implement fmt.Stringer func (f Friend) String() string { - return fmt.Sprintf("", f.NickName) + return fmt.Sprintf("", f.NickName) } // 重命名当前好友 func (f *Friend) SetRemarkName(name string) error { - return f.Self.SetRemarkNameToFriend(f, name) + return f.Self.SetRemarkNameToFriend(f, name) } // 发送自定义消息 func (f *Friend) SendMsg(msg *SendMessage) (*SentMessage, error) { - return f.Self.SendMessageToFriend(f, msg) + return f.Self.SendMessageToFriend(f, msg) } // 发送文本消息 func (f *Friend) SendText(content string) (*SentMessage, error) { - return f.Self.SendTextToFriend(f, content) + return f.Self.SendTextToFriend(f, content) } // 发送图片消息 func (f *Friend) SendImage(file *os.File) (*SentMessage, error) { - return f.Self.SendImageToFriend(f, file) + return f.Self.SendImageToFriend(f, file) +} + +// 发送文件消息 +func (f *Friend) SendFile(file *os.File) (*SentMessage, error) { + return f.Self.SendFileToFriend(f, file) } // 拉该好友入群 func (f *Friend) AddIntoGroup(groups ...*Group) error { - return f.Self.AddFriendIntoManyGroups(f, groups...) + return f.Self.AddFriendIntoManyGroups(f, groups...) } type Friends []*Friend // 获取好友的数量 func (f Friends) Count() int { - return len(f) + return len(f) } // 获取第一个好友 func (f Friends) First() *Friend { - if f.Count() > 0 { - return f[0] - } - return nil + if f.Count() > 0 { + return f[0] + } + return nil } // 获取最后一个好友 func (f Friends) Last() *Friend { - if f.Count() > 0 { - return f[f.Count()-1] - } - return nil + if f.Count() > 0 { + return f[f.Count()-1] + } + return nil } // 根据用户名查找好友 func (f Friends) SearchByUserName(limit int, username string) (results Friends) { - return f.Search(limit, func(friend *Friend) bool { return friend.User.UserName == username }) + return f.Search(limit, func(friend *Friend) bool { return friend.User.UserName == username }) } // 根据昵称查找好友 func (f Friends) SearchByNickName(limit int, nickName string) (results Friends) { - return f.Search(limit, func(friend *Friend) bool { return friend.User.NickName == nickName }) + return f.Search(limit, func(friend *Friend) bool { return friend.User.NickName == nickName }) } // 根据备注查找好友 func (f Friends) SearchByRemarkName(limit int, remarkName string) (results Friends) { - return f.Search(limit, func(friend *Friend) bool { return friend.User.RemarkName == remarkName }) + return f.Search(limit, func(friend *Friend) bool { return friend.User.RemarkName == remarkName }) } // 根据自定义条件查找好友 func (f Friends) Search(limit int, condFuncList ...func(friend *Friend) bool) (results Friends) { - if condFuncList == nil { - return f - } - if limit <= 0 { - limit = f.Count() - } - for _, member := range f { - if results.Count() == limit { - break - } - var passCount int - for _, condFunc := range condFuncList { - if condFunc(member) { - passCount++ - } - } - if passCount == len(condFuncList) { - results = append(results, member) - } - } - return + if condFuncList == nil { + return f + } + if limit <= 0 { + limit = f.Count() + } + for _, member := range f { + if results.Count() == limit { + break + } + var passCount int + for _, condFunc := range condFuncList { + if condFunc(member) { + passCount++ + } + } + if passCount == len(condFuncList) { + results = append(results, member) + } + } + return } // 向slice的好友依次发送消息 func (f Friends) SendMsg(msg *SendMessage, delay ...time.Duration) error { - total := getTotalDuration(delay...) - for _, friend := range f { - time.Sleep(total) - if _, err := friend.SendMsg(msg); err != nil { - return err - } - } - return nil + total := getTotalDuration(delay...) + for _, friend := range f { + time.Sleep(total) + if _, err := friend.SendMsg(msg); err != nil { + return err + } + } + return nil } // 向slice的好友依次发送文本消息 func (f Friends) SendText(text string, delay ...time.Duration) error { - total := getTotalDuration(delay...) - for _, friend := range f { - time.Sleep(total) - if _, err := friend.SendText(text); err != nil { - return err - } - } - return nil + total := getTotalDuration(delay...) + for _, friend := range f { + time.Sleep(total) + if _, err := friend.SendText(text); err != nil { + return err + } + } + return nil } // 向slice的好友依次发送图片消息 func (f Friends) SendImage(file *os.File, delay ...time.Duration) error { - total := getTotalDuration(delay...) - for _, friend := range f { - time.Sleep(total) - if _, err := friend.SendImage(file); err != nil { - return err - } - } - return nil + total := getTotalDuration(delay...) + for _, friend := range f { + time.Sleep(total) + if _, err := friend.SendImage(file); err != nil { + return err + } + } + return nil } type Group struct{ *User } // implement fmt.Stringer func (g Group) String() string { - return fmt.Sprintf("", g.NickName) + return fmt.Sprintf("", g.NickName) } // 发行消息给当前的群组 func (g *Group) SendMsg(msg *SendMessage) (*SentMessage, error) { - return g.Self.SendMessageToGroup(g, msg) + return g.Self.SendMessageToGroup(g, msg) } // 发行文本消息给当前的群组 func (g *Group) SendText(content string) (*SentMessage, error) { - return g.Self.SendTextToGroup(g, content) + return g.Self.SendTextToGroup(g, content) } // 发行图片消息给当前的群组 func (g *Group) SendImage(file *os.File) (*SentMessage, error) { - return g.Self.SendImageToGroup(g, file) + return g.Self.SendImageToGroup(g, file) +} + +// 发送文件给当前的群组 +func (g *Group) SendFile(file *os.File) (*SentMessage, error) { + return g.Self.SendFileToGroup(g, file) } // 获取所有的群成员 func (g *Group) Members() (Members, error) { - group, err := g.Detail() - if err != nil { - return nil, err - } - return group.MemberList, nil + group, err := g.Detail() + if err != nil { + return nil, err + } + return group.MemberList, nil } // 拉好友入群 func (g *Group) AddFriendsIn(friends ...*Friend) error { - return g.Self.AddFriendsIntoGroup(g, friends...) + return g.Self.AddFriendsIntoGroup(g, friends...) } // 从群聊中移除用户 // Deprecated // 无论是网页版,还是程序上都不起作用 func (g *Group) RemoveMembers(members Members) error { - return g.Self.RemoveMemberFromGroup(g, members) + return g.Self.RemoveMemberFromGroup(g, members) } type Groups []*Group // 获取群组数量 func (g Groups) Count() int { - return len(g) + return len(g) } // 获取第一个群组 func (g Groups) First() *Group { - if g.Count() > 0 { - return g[0] - } - return nil + if g.Count() > 0 { + return g[0] + } + return nil } // 获取最后一个群组 func (g Groups) Last() *Group { - if g.Count() > 0 { - return g[g.Count()-1] - } - return nil + if g.Count() > 0 { + return g[g.Count()-1] + } + return nil } // 向群组依次发送消息, 支持发送延迟 func (g Groups) SendMsg(msg *SendMessage, delay ...time.Duration) error { - total := getTotalDuration(delay...) - for _, group := range g { - time.Sleep(total) - if _, err := group.SendMsg(msg); err != nil { - return err - } - } - return nil + total := getTotalDuration(delay...) + for _, group := range g { + time.Sleep(total) + if _, err := group.SendMsg(msg); err != nil { + return err + } + } + return nil } // 向群组依次发送文本消息, 支持发送延迟 func (g Groups) SendText(text string, delay ...time.Duration) error { - total := getTotalDuration(delay...) - for _, group := range g { - time.Sleep(total) - if _, err := group.SendText(text); err != nil { - return err - } - } - return nil + total := getTotalDuration(delay...) + for _, group := range g { + time.Sleep(total) + if _, err := group.SendText(text); err != nil { + return err + } + } + return nil } // 向群组依次发送图片消息, 支持发送延迟 func (g Groups) SendImage(file *os.File, delay ...time.Duration) error { - total := getTotalDuration(delay...) - for _, group := range g { - time.Sleep(total) - if _, err := group.SendImage(file); err != nil { - return err - } - } - return nil + total := getTotalDuration(delay...) + for _, group := range g { + time.Sleep(total) + if _, err := group.SendImage(file); err != nil { + return err + } + } + return nil } // 根据用户名查找群组 func (g Groups) SearchByUserName(limit int, username string) (results Groups) { - return g.Search(limit, func(group *Group) bool { return group.UserName == username }) + return g.Search(limit, func(group *Group) bool { return group.UserName == username }) } // 根据昵称查找群组 func (g Groups) SearchByNickName(limit int, nickName string) (results Groups) { - return g.Search(limit, func(group *Group) bool { return group.NickName == nickName }) + return g.Search(limit, func(group *Group) bool { return group.NickName == nickName }) } // 根据备注查找群组 func (g Groups) SearchByRemarkName(limit int, remarkName string) (results Groups) { - return g.Search(limit, func(group *Group) bool { return group.RemarkName == remarkName }) + return g.Search(limit, func(group *Group) bool { return group.RemarkName == remarkName }) } // 根据自定义条件查找群组 func (g Groups) Search(limit int, condFuncList ...func(group *Group) bool) (results Groups) { - if condFuncList == nil { - return g - } - if limit <= 0 { - limit = g.Count() - } - for _, member := range g { - if results.Count() == limit { - break - } - var passCount int - for _, condFunc := range condFuncList { - if condFunc(member) { - passCount++ - } - } - if passCount == len(condFuncList) { - results = append(results, member) - } - } - return + if condFuncList == nil { + return g + } + if limit <= 0 { + limit = g.Count() + } + for _, member := range g { + if results.Count() == limit { + break + } + var passCount int + for _, condFunc := range condFuncList { + if condFunc(member) { + passCount++ + } + } + if passCount == len(condFuncList) { + results = append(results, member) + } + } + return } // 公众号对象 type Mp struct{ *User } func (m Mp) String() string { - return fmt.Sprintf("", m.NickName) + return fmt.Sprintf("", m.NickName) } // 公众号组对象 @@ -291,46 +301,46 @@ type Mps []*Mp // 数量统计 func (m Mps) Count() int { - return len(m) + return len(m) } // 获取第一个 func (m Mps) First() *Mp { - if m.Count() > 0 { - return m[0] - } - return nil + if m.Count() > 0 { + return m[0] + } + return nil } // 获取最后一个 func (m Mps) Last() *Mp { - if m.Count() > 0 { - return m[m.Count()-1] - } - return nil + if m.Count() > 0 { + return m[m.Count()-1] + } + return nil } // 根据自定义条件查找 func (m Mps) Search(limit int, condFuncList ...func(group *Mp) bool) (results Mps) { - if condFuncList == nil { - return m - } - if limit <= 0 { - limit = m.Count() - } - for _, member := range m { - if results.Count() == limit { - break - } - var passCount int - for _, condFunc := range condFuncList { - if condFunc(member) { - passCount++ - } - } - if passCount == len(condFuncList) { - results = append(results, member) - } - } - return + if condFuncList == nil { + return m + } + if limit <= 0 { + limit = m.Count() + } + for _, member := range m { + if results.Count() == limit { + break + } + var passCount int + for _, condFunc := range condFuncList { + if condFunc(member) { + passCount++ + } + } + if passCount == len(condFuncList) { + results = append(results, member) + } + } + return } diff --git a/user.go b/user.go index a181f96..2a420ab 100644 --- a/user.go +++ b/user.go @@ -242,6 +242,7 @@ func (s *Self) SendImageToFriend(friend *Friend, file *os.File) (*SentMessage, e return s.Bot.Caller.WebWxSendImageMsg(file, req, info, s.UserName, friend.UserName) } +// 发送文件给好友 func (s *Self) SendFileToFriend(friend *Friend, file *os.File) (*SentMessage, error) { req := s.Bot.storage.Request info := s.Bot.storage.LoginInfo @@ -339,6 +340,13 @@ func (s *Self) SendImageToGroup(group *Group, file *os.File) (*SentMessage, erro return s.Bot.Caller.WebWxSendImageMsg(file, req, info, s.UserName, group.UserName) } +// 发送文件给群组 +func (s *Self) SendFileToGroup(group *Group, file *os.File) (*SentMessage, error) { + req := s.Bot.storage.Request + info := s.Bot.storage.LoginInfo + return s.Bot.Caller.WebWxSendFile(file, req, info, s.UserName, group.UserName) +} + // 撤回消息 // sentMessage, err := friend.SendText("message") // if err == nil {