From 200c5be4fffec690d867c7b3bbeae8d901c4ceb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9A=E5=90=83=E7=82=B9=E8=8B=B9=E6=9E=9C?= <73388495+eatmoreapple@users.noreply.github.com> Date: Tue, 10 Jan 2023 10:57:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8C=E6=AD=A5=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E9=94=99=E8=AF=AF=E9=BB=98=E8=AE=A4=E8=A1=8C=E4=B8=BA?= =?UTF-8?q?=20(#190)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.go | 81 ++++++++++++++++++++++++++++----------------------- caller.go | 2 +- items.go | 25 ---------------- sync_check.go | 40 +++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 62 deletions(-) create mode 100644 sync_check.go diff --git a/bot.go b/bot.go index 46e5a17..5adfec6 100644 --- a/bot.go +++ b/bot.go @@ -107,7 +107,7 @@ func (b *Bot) Logout() error { if err := b.Caller.Logout(info); err != nil { return err } - b.stopSyncCheck(errors.New("logout")) + b.Exit() return nil } return errors.New("user not login") @@ -173,7 +173,7 @@ func (b *Bot) WebInit() error { // FIX: 当bot在线的情况下执行热登录,会开启多次事件监听 go b.once.Do(func() { if b.MessageErrorHandler == nil { - b.MessageErrorHandler = b.stopSyncCheck + b.MessageErrorHandler = defaultSyncCheckErrHandler(b) } for { err := b.syncCheck() @@ -182,6 +182,7 @@ func (b *Bot) WebInit() error { } // 判断是否继续, 如果不继续则退出 if goon := b.MessageErrorHandler(err); !goon { + b.err = err break } } @@ -231,13 +232,6 @@ func (b *Bot) syncCheck() error { return err } -// 当获取消息发生错误时, 默认的错误处理行为 -func (b *Bot) stopSyncCheck(err error) bool { - b.err = err - b.Exit() - return false -} - // 获取新的消息 func (b *Bot) syncMessage() ([]*Message, error) { resp, err := b.Caller.WebWxSync(b.Storage.Request, b.Storage.Response, b.Storage.LoginInfo) @@ -294,6 +288,33 @@ func (b *Bot) DumpTo(writer io.Writer) error { return json.NewEncoder(writer).Encode(item) } +// IsHot returns true if is hot login otherwise false +func (b *Bot) IsHot() bool { + return b.hotReloadStorage != nil +} + +// UUID returns current uuid of bot +func (b *Bot) UUID() string { + return b.uuid +} + +func (b *Bot) reload() error { + if b.hotReloadStorage == nil { + return errors.New("hotReloadStorage is nil") + } + var item HotReloadStorageItem + err := json.NewDecoder(b.hotReloadStorage).Decode(&item) + if err != nil { + return err + } + b.Caller.Client.Jar = item.Jar.AsCookieJar() + b.Storage.LoginInfo = item.LoginInfo + b.Storage.Request = item.BaseRequest + b.Caller.Client.Domain = item.WechatDomain + b.uuid = item.UUID + return nil +} + // NewBot Bot的构造方法 // 接收外部的 context.Context,用于控制Bot的存活 func NewBot(c context.Context) *Bot { @@ -331,6 +352,21 @@ func DefaultBot(opts ...BotOptionFunc) *Bot { return bot } +// defaultSyncCheckErrHandler 默认的SyncCheck错误处理函数 +func defaultSyncCheckErrHandler(bot *Bot) func(error) bool { + return func(err error) bool { + var ret Ret + if errors.As(err, &ret) { + switch ret { + case failedLoginCheck, cookieInvalid, failedLoginWarn: + _ = bot.Logout() + return false + } + } + return true + } +} + // GetQrcodeUrl 通过uuid获取登录二维码的url func GetQrcodeUrl(uuid string) string { return qrcode + uuid @@ -365,30 +401,3 @@ func open(url string) error { args = append(args, url) return exec.Command(cmd, args...).Start() } - -// IsHot returns true if is hot login otherwise false -func (b *Bot) IsHot() bool { - return b.hotReloadStorage != nil -} - -// UUID returns current uuid of bot -func (b *Bot) UUID() string { - return b.uuid -} - -func (b *Bot) reload() error { - if b.hotReloadStorage == nil { - return errors.New("hotReloadStorage is nil") - } - var item HotReloadStorageItem - err := json.NewDecoder(b.hotReloadStorage).Decode(&item) - if err != nil { - return err - } - b.Caller.Client.Jar = item.Jar.AsCookieJar() - b.Storage.LoginInfo = item.LoginInfo - b.Storage.Request = item.BaseRequest - b.Caller.Client.Domain = item.WechatDomain - b.uuid = item.UUID - return nil -} diff --git a/caller.go b/caller.go index 3399d72..422feee 100644 --- a/caller.go +++ b/caller.go @@ -147,7 +147,7 @@ func (c *Caller) SyncCheck(request *BaseRequest, info *LoginInfo, response *WebI if len(results) != 3 { return nil, errors.New("parse sync key failed") } - retCode, selector := string(results[1]), string(results[2]) + retCode, selector := string(results[1]), Selector(results[2]) syncCheckResponse := &SyncCheckResponse{RetCode: retCode, Selector: selector} return syncCheckResponse, nil } diff --git a/items.go b/items.go index 6fa19e1..485c464 100644 --- a/items.go +++ b/items.go @@ -2,7 +2,6 @@ package openwechat import ( "errors" - "strconv" ) /* @@ -91,30 +90,6 @@ func NewUserDetailItemList(members Members) UserDetailItemList { return list } -type SyncCheckResponse struct { - RetCode string - Selector string -} - -func (s SyncCheckResponse) Success() bool { - return s.RetCode == "0" -} - -func (s SyncCheckResponse) NorMal() bool { - return s.Success() && s.Selector == "0" -} - -func (s SyncCheckResponse) Err() error { - if s.Success() { - return nil - } - i, err := strconv.ParseInt(s.RetCode, 16, 10) - if err != nil { - return errors.New("sync check unknown error") - } - return errors.New(Ret(i).String()) -} - type WebWxSyncResponse struct { AddMsgCount int ContinueFlag int diff --git a/sync_check.go b/sync_check.go new file mode 100644 index 0000000..3dd069b --- /dev/null +++ b/sync_check.go @@ -0,0 +1,40 @@ +package openwechat + +import ( + "errors" + "strconv" +) + +type Selector string + +const ( + SelectorNormal Selector = "0" // 正常 + SelectorNewMsg Selector = "2" // 有新消息 + SelectorModContact Selector = "4" // 联系人信息变更 + SelectorAddOrDelContact Selector = "6" // 添加或删除联系人 + SelectorModChatRoom Selector = "7" // 进入或退出聊天室 +) + +type SyncCheckResponse struct { + RetCode string + Selector Selector +} + +func (s SyncCheckResponse) Success() bool { + return s.RetCode == "0" +} + +func (s SyncCheckResponse) NorMal() bool { + return s.Success() && s.Selector == "0" +} + +func (s SyncCheckResponse) Err() error { + if s.Success() { + return nil + } + i, err := strconv.Atoi(s.RetCode) + if err != nil { + return errors.New("sync check unknown error") + } + return Ret(i) +}