diff --git a/bot_test.go b/bot_test.go index c894b6a..8149a81 100644 --- a/bot_test.go +++ b/bot_test.go @@ -1,6 +1,7 @@ package openwechat import ( + "fmt" "testing" ) @@ -46,6 +47,29 @@ func TestFriend(t *testing.T) { t.Log(friends) } +func TestGroup(t *testing.T) { + self, err := getSelf() + if err != nil { + t.Error(err) + return + } + group, err := self.Groups() + if err != nil { + t.Error(err) + return + } + t.Log(group) + g := group.SearchByNickName(1, "GoFrame实战1群") + if g.First() != nil { + members, err := g.First().Members() + if err != nil { + t.Error(err) + return + } + fmt.Println(members.Count()) + } +} + func TestMps(t *testing.T) { self, err := getSelf() if err != nil { @@ -77,11 +101,37 @@ func TestAddFriendIntoChatRoom(t *testing.T) { return } searchGroups := groups.SearchByNickName(1, "厉害了") - if searchGroups != nil { - g := searchGroups.First() + if g := searchGroups.First(); g != nil { addFriends := friends.SearchByRemarkName(1, "1") if err := g.AddFriendsIn(addFriends...); err != nil { t.Error(err) } } } + +func TestRemoveFriendIntoChatRoom(t *testing.T) { + self, err := getSelf() + if err != nil { + t.Error(err) + return + } + groups, err := self.Groups() + if err != nil { + t.Error(err) + return + } + friends, err := self.Friends() + if err != nil { + t.Error(err) + return + } + searchGroups := groups.SearchByNickName(1, "厉害了") + if g := searchGroups.First(); g != nil { + addFriends := friends.SearchByRemarkName(1, "大爷") + if f := addFriends.First(); f != nil { + if err := g.RemoveMembers(Members{f.User}); err != nil { + t.Error(err) + } + } + } +} diff --git a/caller.go b/caller.go index a696df8..ae2d6a1 100644 --- a/caller.go +++ b/caller.go @@ -228,11 +228,20 @@ func (c *Caller) Logout(info *LoginInfo) error { } // 拉好友入群 -func (c *Caller) AddFriendIntoChatRoom(req *BaseRequest, group *Group, friends ...*Friend) error { +func (c *Caller) AddFriendIntoChatRoom(req *BaseRequest, info *LoginInfo, group *Group, friends ...*Friend) error { if len(friends) == 0 { return errors.New("no friends found") } - resp := NewReturnResponse(c.Client.AddMemberIntoChatRoom(req, group, friends...)) + resp := NewReturnResponse(c.Client.AddMemberIntoChatRoom(req, info, group, friends...)) + return parseBaseResponseError(resp) +} + +// 从群聊中移除用户 +func (c *Caller) RemoveFriendFromChatRoom(req *BaseRequest, info *LoginInfo, group *Group, users ...*User) error { + if len(users) == 0 { + return errors.New("no users found") + } + resp := NewReturnResponse(c.Client.RemoveMemberFromChatRoom(req, info, group, users...)) return parseBaseResponseError(resp) } diff --git a/client.go b/client.go index 0f8b6b6..25a55cf 100644 --- a/client.go +++ b/client.go @@ -413,10 +413,12 @@ func (c *Client) Logout(info *LoginInfo) (*http.Response, error) { } // 添加用户进群聊 -func (c *Client) AddMemberIntoChatRoom(req *BaseRequest, group *Group, friends ...*Friend) (*http.Response, error) { +func (c *Client) AddMemberIntoChatRoom(req *BaseRequest, info *LoginInfo, group *Group, friends ...*Friend) (*http.Response, error) { path, _ := url.Parse(c.webWxUpdateChatRoomUrl) params := url.Values{} params.Add("fun", "addmember") + params.Add("pass_ticket", info.PassTicket) + params.Add("lang", "zh_CN") path.RawQuery = params.Encode() addMemberList := make([]string, 0) for _, friend := range friends { @@ -430,3 +432,23 @@ func (c *Client) AddMemberIntoChatRoom(req *BaseRequest, group *Group, friends . buffer, _ := ToBuffer(content) return c.Post(path.String(), jsonContentType, buffer) } + +// 从群聊中移除用户 +func (c *Client) RemoveMemberFromChatRoom(req *BaseRequest, info *LoginInfo, group *Group, friends ...*User) (*http.Response, error) { + path, _ := url.Parse(c.webWxUpdateChatRoomUrl) + params := url.Values{} + params.Add("fun", "delmember") + params.Add("lang", "zh_CN") + params.Add("pass_ticket", info.PassTicket) + delMemberList := make([]string, 0) + for _, friend := range friends { + delMemberList = append(delMemberList, friend.UserName) + } + content := map[string]interface{}{ + "ChatRoomName": group.UserName, + "BaseRequest": req, + "DelMemberList": strings.Join(delMemberList, ","), + } + buffer, _ := ToBuffer(content) + return c.Post(path.String(), jsonContentType, buffer) +} diff --git a/relations.go b/relations.go index f528a14..d9194a3 100644 --- a/relations.go +++ b/relations.go @@ -1,6 +1,7 @@ package openwechat import ( + "errors" "fmt" "os" "strings" @@ -146,7 +147,54 @@ func (g *Group) Members() (Members, error) { // 拉好友入群 func (g *Group) AddFriendsIn(friends ...*Friend) error { - return g.Self.Bot.Caller.AddFriendIntoChatRoom(g.Self.Bot.storage.Request, g, friends...) + if len(friends) == 0 { + return nil + } + groupMembers, err := g.Members() + if err != nil { + return err + } + for _, friend := range friends { + for _, member := range groupMembers { + if member.UserName == friend.UserName { + return fmt.Errorf("user %s has alreay in this group", friend.String()) + } + } + } + req := g.Self.Bot.storage.Request + info := g.Self.Bot.storage.LoginInfo + return g.Self.Bot.Caller.AddFriendIntoChatRoom(req, info, g, friends...) +} + +// 从群聊中移除用户 +// Deprecated +// 无论是网页版,还是程序上都不起作用 +func (g *Group) RemoveMembers(members Members) error { + if len(members) == 0 { + return nil + } + if g.IsOwner == 0 { + return errors.New("group owner required") + } + groupMembers, err := g.Members() + if err != nil { + return err + } + // 判断用户是否在群聊中 + var count int + for _, member := range members { + for _, gm := range groupMembers { + if gm.UserName == member.UserName { + count++ + } + } + } + if count != len(members) { + return errors.New("invalid members") + } + req := g.Self.Bot.storage.Request + info := g.Self.Bot.storage.LoginInfo + return g.Self.Bot.Caller.RemoveFriendFromChatRoom(req, info, g, members...) } type Groups []*Group