添加转发支持,优化群发逻辑
This commit is contained in:
parent
17eeea93a9
commit
66acd48e3a
1
2.json
1
2.json
@ -1 +0,0 @@
|
||||
{"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"}}
|
26
bot_test.go
26
bot_test.go
@ -317,3 +317,29 @@ func TestSendFile(t *testing.T) {
|
||||
}
|
||||
t.Log(msg.MsgId)
|
||||
}
|
||||
|
||||
func TestForwardMessage(t *testing.T) {
|
||||
bot := defaultBot(Desktop)
|
||||
if err := bot.HotLogin(NewJsonFileHotReloadStorage("2.json"), true); err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
self, err := bot.GetCurrentUser()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
groups, err := self.Groups()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
f, _ := os.Open("README.md")
|
||||
defer f.Close()
|
||||
sentM, err := self.SendFileToGroup(groups.First(), f)
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
return
|
||||
}
|
||||
self.ForwardMessageToGroups(sentM, groups...)
|
||||
}
|
||||
|
72
relations.go
72
relations.go
@ -109,9 +109,19 @@ func (f Friends) Search(limit int, condFuncList ...func(friend *Friend) bool) (r
|
||||
// 向slice的好友依次发送消息
|
||||
func (f Friends) SendMsg(msg *SendMessage, delay ...time.Duration) error {
|
||||
total := getTotalDuration(delay...)
|
||||
var (
|
||||
sentMessage *SentMessage
|
||||
err error
|
||||
self *Self
|
||||
)
|
||||
for _, friend := range f {
|
||||
self = friend.Self
|
||||
time.Sleep(total)
|
||||
if _, err := friend.SendMsg(msg); err != nil {
|
||||
if sentMessage != nil {
|
||||
err = self.ForwardMessageToFriends(sentMessage, f...)
|
||||
return err
|
||||
}
|
||||
if sentMessage, err = friend.SendMsg(msg); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -121,9 +131,19 @@ func (f Friends) SendMsg(msg *SendMessage, delay ...time.Duration) error {
|
||||
// 向slice的好友依次发送文本消息
|
||||
func (f Friends) SendText(text string, delay ...time.Duration) error {
|
||||
total := getTotalDuration(delay...)
|
||||
var (
|
||||
sentMessage *SentMessage
|
||||
err error
|
||||
self *Self
|
||||
)
|
||||
for _, friend := range f {
|
||||
self = friend.Self
|
||||
time.Sleep(total)
|
||||
if _, err := friend.SendText(text); err != nil {
|
||||
if sentMessage != nil {
|
||||
err = self.ForwardMessageToFriends(sentMessage, f...)
|
||||
return err
|
||||
}
|
||||
if sentMessage, err = friend.SendText(text); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -133,9 +153,19 @@ func (f Friends) SendText(text string, delay ...time.Duration) error {
|
||||
// 向slice的好友依次发送图片消息
|
||||
func (f Friends) SendImage(file *os.File, delay ...time.Duration) error {
|
||||
total := getTotalDuration(delay...)
|
||||
var (
|
||||
sentMessage *SentMessage
|
||||
err error
|
||||
self *Self
|
||||
)
|
||||
for _, friend := range f {
|
||||
self = friend.Self
|
||||
time.Sleep(total)
|
||||
if _, err := friend.SendImage(file); err != nil {
|
||||
if sentMessage != nil {
|
||||
err = self.ForwardMessageToFriends(sentMessage, f...)
|
||||
return err
|
||||
}
|
||||
if sentMessage, err = friend.SendImage(file); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -216,9 +246,19 @@ func (g Groups) Last() *Group {
|
||||
// 向群组依次发送消息, 支持发送延迟
|
||||
func (g Groups) SendMsg(msg *SendMessage, delay ...time.Duration) error {
|
||||
total := getTotalDuration(delay...)
|
||||
var (
|
||||
sentMessage *SentMessage
|
||||
err error
|
||||
self *Self
|
||||
)
|
||||
for _, group := range g {
|
||||
self = group.Self
|
||||
time.Sleep(total)
|
||||
if _, err := group.SendMsg(msg); err != nil {
|
||||
if sentMessage != nil {
|
||||
err = self.ForwardMessageToGroups(sentMessage, g...)
|
||||
return err
|
||||
}
|
||||
if sentMessage, err = group.SendMsg(msg); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -228,9 +268,19 @@ func (g Groups) SendMsg(msg *SendMessage, delay ...time.Duration) error {
|
||||
// 向群组依次发送文本消息, 支持发送延迟
|
||||
func (g Groups) SendText(text string, delay ...time.Duration) error {
|
||||
total := getTotalDuration(delay...)
|
||||
var (
|
||||
sentMessage *SentMessage
|
||||
err error
|
||||
self *Self
|
||||
)
|
||||
for _, group := range g {
|
||||
self = group.Self
|
||||
time.Sleep(total)
|
||||
if _, err := group.SendText(text); err != nil {
|
||||
if sentMessage != nil {
|
||||
err = self.ForwardMessageToGroups(sentMessage, g...)
|
||||
return err
|
||||
}
|
||||
if sentMessage, err = group.SendText(text); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -240,9 +290,19 @@ func (g Groups) SendText(text string, delay ...time.Duration) error {
|
||||
// 向群组依次发送图片消息, 支持发送延迟
|
||||
func (g Groups) SendImage(file *os.File, delay ...time.Duration) error {
|
||||
total := getTotalDuration(delay...)
|
||||
var (
|
||||
sentMessage *SentMessage
|
||||
err error
|
||||
self *Self
|
||||
)
|
||||
for _, group := range g {
|
||||
self = group.Self
|
||||
time.Sleep(total)
|
||||
if _, err := group.SendImage(file); err != nil {
|
||||
if sentMessage != nil {
|
||||
err = self.ForwardMessageToGroups(sentMessage, g...)
|
||||
return err
|
||||
}
|
||||
if sentMessage, err = group.SendImage(file); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
51
user.go
51
user.go
@ -356,6 +356,57 @@ func (s *Self) RevokeMessage(msg *SentMessage) error {
|
||||
return s.Bot.Caller.WebWxRevokeMsg(msg, s.Bot.storage.Request)
|
||||
}
|
||||
|
||||
// 转发消息接口
|
||||
func (s *Self) forwardMessage(msg *SentMessage, users ...*User) error {
|
||||
info := s.Bot.storage.LoginInfo
|
||||
req := s.Bot.storage.Request
|
||||
switch msg.Type {
|
||||
case TextMessage:
|
||||
for _, user := range users {
|
||||
msg.FromUserName = s.UserName
|
||||
msg.ToUserName = user.UserName
|
||||
if _, err := s.Self.Bot.Caller.WebWxSendMsg(msg.SendMessage, info, req); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
case ImageMessage:
|
||||
for _, user := range users {
|
||||
msg.FromUserName = s.UserName
|
||||
msg.ToUserName = user.UserName
|
||||
if _, err := s.Self.Bot.Caller.Client.WebWxSendMsgImg(msg.SendMessage, req, info); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
case AppMessage:
|
||||
for _, user := range users {
|
||||
msg.FromUserName = s.UserName
|
||||
msg.ToUserName = user.UserName
|
||||
if _, err := s.Self.Bot.Caller.Client.WebWxSendAppMsg(msg.SendMessage, req); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return errors.New("unsupport message")
|
||||
}
|
||||
|
||||
// 转发给好友
|
||||
func (s *Self) ForwardMessageToFriends(msg *SentMessage, friends ...*Friend) error {
|
||||
var users []*User
|
||||
for _, friend := range friends {
|
||||
users = append(users, friend.User)
|
||||
}
|
||||
return s.forwardMessage(msg, users...)
|
||||
}
|
||||
|
||||
// 转发给群组
|
||||
func (s *Self) ForwardMessageToGroups(msg *SentMessage, groups ...*Group) error {
|
||||
var users []*User
|
||||
for _, group := range groups {
|
||||
users = append(users, group.User)
|
||||
}
|
||||
return s.forwardMessage(msg, users...)
|
||||
}
|
||||
|
||||
// 抽象的用户组
|
||||
type Members []*User
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user