From 6e8ef3ef0fade78d4368c79cf170bb47547dabfa Mon Sep 17 00:00:00 2001 From: nnnewb Date: Sat, 13 Feb 2021 17:05:29 +0800 Subject: [PATCH 01/12] =?UTF-8?q?fix:=20=E5=85=BC=E5=AE=B9=20onebot=20v11?= =?UTF-8?q?=20=E8=A7=84=E5=AE=9A=E7=9A=84=20GetVersionInfo=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coolq/api.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/coolq/api.go b/coolq/api.go index 3bf1927..b40e4a3 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -1216,6 +1216,10 @@ func (bot *CQBot) CQCheckURLSafely(url string) MSG { func (bot *CQBot) CQGetVersionInfo() MSG { wd, _ := os.Getwd() return OK(MSG{ + "app_name": "go-cqhttp", + "app_version": Version, + "app_full_name": fmt.Sprintf("go-cqhttp-%s_%s_%s-%s", Version, runtime.GOOS, runtime.GOARCH, runtime.Version()), + "protocol_version": "v11", "coolq_directory": wd, "coolq_edition": "pro", "go-cqhttp": true, From e30e21e296dc027d8a8c82749fadcc9baf8b80ee Mon Sep 17 00:00:00 2001 From: nnnewb Date: Sat, 13 Feb 2021 17:05:57 +0800 Subject: [PATCH 02/12] fix: import fmt --- coolq/api.go | 1 + 1 file changed, 1 insertion(+) diff --git a/coolq/api.go b/coolq/api.go index b40e4a3..5808cc1 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -3,6 +3,7 @@ package coolq import ( "crypto/md5" "encoding/hex" + "fmt" "io/ioutil" "math" "os" From 71ce6f362f926beb35942cbfe9b1e994887f9c6d Mon Sep 17 00:00:00 2001 From: ishkong Date: Mon, 15 Feb 2021 12:43:45 +0800 Subject: [PATCH 03/12] :beers: Make admin/do_web_write support more input Make admin/do_web_write support more input from web pages when logging in --- server/apiAdmin.go | 53 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/server/apiAdmin.go b/server/apiAdmin.go index 864a79a..93556d2 100644 --- a/server/apiAdmin.go +++ b/server/apiAdmin.go @@ -140,12 +140,22 @@ func (s *webServer) Dologin() { log.Warnf("2. 使用Cef自动处理.") log.Warnf("3. 不提交滑块并继续.(可能会导致上网环境异常错误)") log.Warnf("详细信息请参考文档 -> https://github.com/Mrs4s/go-cqhttp/blob/master/docs/slider.md <-") - log.Warn("请输入(1 - 3): ") - text = readLine() + if conf.WebUI != nil && conf.WebUI.WebInput { + log.Warnf("请输入(1 - 3): (http://%s:%d/admin/do_web_write 输入)", conf.WebUI.Host, conf.WebUI.WebUIPort) + text = <-WebInput + } else { + log.Warn("请输入(1 - 3):") + text = readLine() + } if strings.Contains(text, "1") { log.Warnf("请用浏览器打开 -> %v <- 并获取Ticket.", rsp.VerifyUrl) - log.Warn("请输入Ticket: (Enter 提交)") - text = readLine() + if conf.WebUI != nil && conf.WebUI.WebInput { + log.Warnf("请输入Ticket: (http://%s:%d/admin/do_web_write 输入)", conf.WebUI.Host, conf.WebUI.WebUIPort) + text = <-WebInput + } else { + log.Warn("请输入Ticket: (Enter 提交)") + text = readLine() + } rsp, err = cli.SubmitTicket(strings.TrimSpace(text)) continue } @@ -183,31 +193,50 @@ func (s *webServer) Dologin() { global.DelFile("captcha.jpg") continue case client.SMSNeededError: - log.Warnf("账号已开启设备锁, 按下 Enter 向手机 %v 发送短信验证码.", rsp.SMSPhone) - readLine() + if conf.WebUI != nil && conf.WebUI.WebInput { + log.Warnf("账号已开启设备锁, 已向手机 %v 发送短信验证码.", rsp.SMSPhone) + } else { + log.Warnf("账号已开启设备锁, 按下 Enter 向手机 %v 发送短信验证码.", rsp.SMSPhone) + readLine() + } if !cli.RequestSMS() { log.Warnf("发送验证码失败,可能是请求过于频繁.") time.Sleep(time.Second * 5) os.Exit(0) } - log.Warn("请输入短信验证码: (Enter 提交)") - text = readLine() + if conf.WebUI != nil && conf.WebUI.WebInput { + log.Warnf("请输入短信验证码: (http://%s:%d/admin/do_web_write 输入)", conf.WebUI.Host, conf.WebUI.WebUIPort) + text = <-WebInput + } else { + log.Warn("请输入短信验证码: (Enter 提交)") + text = readLine() + } rsp, err = cli.SubmitSMS(strings.ReplaceAll(strings.ReplaceAll(text, "\n", ""), "\r", "")) continue case client.SMSOrVerifyNeededError: log.Warnf("账号已开启设备锁,请选择验证方式:") log.Warnf("1. 向手机 %v 发送短信验证码", rsp.SMSPhone) log.Warnf("2. 使用手机QQ扫码验证.") - log.Warn("请输入(1 - 2): ") - text = readLine() + if conf.WebUI != nil && conf.WebUI.WebInput { + log.Warnf("请输入(1 - 2): (http://%s:%d/admin/do_web_write 输入)", conf.WebUI.Host, conf.WebUI.WebUIPort) + text = <-WebInput + } else { + log.Warn("请输入(1 - 2):") + text = readLine() + } if strings.Contains(text, "1") { if !cli.RequestSMS() { log.Warnf("发送验证码失败,可能是请求过于频繁.") time.Sleep(time.Second * 5) os.Exit(0) } - log.Warn("请输入短信验证码: (Enter 提交)") - text = readLine() + if conf.WebUI != nil && conf.WebUI.WebInput { + log.Warnf("请输入短信验证码: (http://%s:%d/admin/do_web_write 输入)....", conf.WebUI.Host, conf.WebUI.WebUIPort) + text = <-WebInput + } else { + log.Warn("请输入短信验证码: (Enter 提交)") + text = readLine() + } rsp, err = cli.SubmitSMS(strings.ReplaceAll(strings.ReplaceAll(text, "\n", ""), "\r", "")) continue } From 569a718dc666e3377abb2250097a5eefe284c7d3 Mon Sep 17 00:00:00 2001 From: Akiba <36563862+Akegarasu@users.noreply.github.com> Date: Tue, 16 Feb 2021 18:20:18 +0800 Subject: [PATCH 04/12] fix #638 --- coolq/bot.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/coolq/bot.go b/coolq/bot.go index bad338f..a853a24 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -409,6 +409,9 @@ func (bot *CQBot) formatGroupMessage(m *message.GroupMessage) MSG { gm["sub_type"] = "anonymous" } else { mem := bot.Client.FindGroup(m.GroupCode).FindMember(m.Sender.Uin) + if mem == nil{ + return Failed(100,"MEMBER_NOT_FOUND","群员不存在") + } ms := gm["sender"].(MSG) ms["role"] = func() string { switch mem.Permission { From a1fb629798705951c54b7b330b35796bf733963c Mon Sep 17 00:00:00 2001 From: Akiba <36563862+Akegarasu@users.noreply.github.com> Date: Wed, 17 Feb 2021 17:34:57 +0800 Subject: [PATCH 05/12] refresh group mem --- coolq/bot.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/coolq/bot.go b/coolq/bot.go index a853a24..94ef00c 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -408,9 +408,20 @@ func (bot *CQBot) formatGroupMessage(m *message.GroupMessage) MSG { gm["sender"].(MSG)["nickname"] = "匿名消息" gm["sub_type"] = "anonymous" } else { - mem := bot.Client.FindGroup(m.GroupCode).FindMember(m.Sender.Uin) + group := bot.Client.FindGroup(m.GroupCode) + mem := group.FindMember(m.Sender.Uin) if mem == nil{ - return Failed(100,"MEMBER_NOT_FOUND","群员不存在") + log.Warnf("获取 %v 成员信息失败,尝试刷新成员列表", m.Sender.Uin) + t, err := bot.Client.GetGroupMembers(group) + if err != nil { + log.Warnf("刷新群 %v 成员列表失败: %v", group.Uin, err) + return Failed(100, "GET_MEMBERS_API_ERROR", err.Error()) + } + group.Members = t + mem = group.FindMember(m.Sender.Uin) + if mem != nil{ + return Failed(100,"MEMBER_NOT_FOUND","群员不存在") + } } ms := gm["sender"].(MSG) ms["role"] = func() string { From 185f11f6a033e4c882aa5c92be6f4b7d4f230d1b Mon Sep 17 00:00:00 2001 From: ishkong Date: Wed, 17 Feb 2021 21:04:29 +0800 Subject: [PATCH 06/12] Update apiAdmin.go --- server/apiAdmin.go | 384 ++++++++++++++++++++++----------------------- 1 file changed, 191 insertions(+), 193 deletions(-) diff --git a/server/apiAdmin.go b/server/apiAdmin.go index 93556d2..37c99f3 100644 --- a/server/apiAdmin.go +++ b/server/apiAdmin.go @@ -117,238 +117,236 @@ func (s *webServer) Run(addr string, cli *client.QQClient) *coolq.CQBot { return b } -func (s *webServer) Dologin() { +// logincore 登录核心实现 +func (s *webServer) logincore(relogin bool) { + s.Console = bufio.NewReader(os.Stdin) readLine := func() (str string) { str, _ = s.Console.ReadString('\n') str = strings.TrimSpace(str) return } - conf := GetConf() - cli := s.Cli - cli.AllowSlider = true - rsp, err := cli.Login() - count := 0 - for { - global.Check(err) + + if s.Cli.Online { + log.Warn("Bot已登录") + return + } + + var times uint = 1 // 重试次数 + for res, err := s.Cli.Login(); ; res, err = s.Cli.Login() { + var text string - if !rsp.Success { - switch rsp.Error { - case client.SliderNeededError: - log.Warnf("登录需要滑条验证码, 请选择解决方案: ") - log.Warnf("1. 自行抓包. (推荐)") - log.Warnf("2. 使用Cef自动处理.") - log.Warnf("3. 不提交滑块并继续.(可能会导致上网环境异常错误)") - log.Warnf("详细信息请参考文档 -> https://github.com/Mrs4s/go-cqhttp/blob/master/docs/slider.md <-") - if conf.WebUI != nil && conf.WebUI.WebInput { - log.Warnf("请输入(1 - 3): (http://%s:%d/admin/do_web_write 输入)", conf.WebUI.Host, conf.WebUI.WebUIPort) + count := 0 + + if res == nil { + goto Relogin + } + + Again: // 不执行 s.Cli.Login() 的循环,适用输入验证码等更新 res 的操作 + if err == nil && res.Success { // 登录成功 + break + } else if err == client.ErrAlreadyOnline { + break + } + log.Error("登录遇到错误: " + err.Error()) + + switch res.Error { + case client.SliderNeededError: + log.Warnf("登录需要滑条验证码, 请选择解决方案: ") + log.Warnf("1. 自行抓包. (推荐)") + log.Warnf("2. 使用Cef自动处理.") + log.Warnf("3. 不提交滑块并继续.(可能会导致上网环境异常错误)") + log.Warnf("详细信息请参考文档 -> https://github.com/Mrs4s/go-cqhttp/blob/master/docs/slider.md <-") + if s.Conf.WebUI != nil && s.Conf.WebUI.WebInput { + log.Warnf("请输入(1 - 3): (http://%s:%d/admin/do_web_write 输入)", s.Conf.WebUI.Host, s.Conf.WebUI.WebUIPort) + text = <-WebInput + } else { + log.Warn("请输入(1 - 3):") + text = readLine() + } + if strings.Contains(text, "1") { + log.Warnf("请用浏览器打开 -> %v <- 并获取Ticket.", res.VerifyUrl) + if s.Conf.WebUI != nil && s.Conf.WebUI.WebInput { + log.Warnf("请输入Ticket: (http://%s:%d/admin/do_web_write 输入)", s.Conf.WebUI.Host, s.Conf.WebUI.WebUIPort) text = <-WebInput } else { - log.Warn("请输入(1 - 3):") + log.Warn("请输入Ticket: (Enter 提交)") text = readLine() } - if strings.Contains(text, "1") { - log.Warnf("请用浏览器打开 -> %v <- 并获取Ticket.", rsp.VerifyUrl) - if conf.WebUI != nil && conf.WebUI.WebInput { - log.Warnf("请输入Ticket: (http://%s:%d/admin/do_web_write 输入)", conf.WebUI.Host, conf.WebUI.WebUIPort) - text = <-WebInput - } else { - log.Warn("请输入Ticket: (Enter 提交)") - text = readLine() - } - rsp, err = cli.SubmitTicket(strings.TrimSpace(text)) - continue - } - if strings.Contains(text, "3") { - cli.AllowSlider = false - cli.Disconnect() - rsp, err = cli.Login() - continue - } - id := utils.RandomStringRange(6, "0123456789") - log.Warnf("滑块ID为 %v 请在30S内处理.", id) - ticket, err := global.GetSliderTicket(rsp.VerifyUrl, id) - if err != nil { - log.Warnf("错误: " + err.Error()) - os.Exit(0) - } - rsp, err = cli.SubmitTicket(ticket) - if err != nil { - log.Warnf("错误: " + err.Error()) - os.Exit(0) - } + res, err = s.Cli.SubmitTicket(strings.TrimSpace(text)) + goto Again + } + if strings.Contains(text, "3") { + s.Cli.AllowSlider = false + s.Cli.Disconnect() continue - case client.NeedCaptcha: - _ = ioutil.WriteFile("captcha.jpg", rsp.CaptchaImage, 0644) - img, _, _ := image.Decode(bytes.NewReader(rsp.CaptchaImage)) - fmt.Println(asciiart.New("image", img).Art) - if conf.WebUI != nil && conf.WebUI.WebInput { - log.Warnf("请输入验证码 (captcha.jpg): (http://%s:%d/admin/do_web_write 输入)", conf.WebUI.Host, conf.WebUI.WebUIPort) - text = <-WebInput - } else { - log.Warn("请输入验证码 (captcha.jpg): (Enter 提交)") - text = readLine() - } - rsp, err = cli.SubmitCaptcha(strings.ReplaceAll(text, "\n", ""), rsp.CaptchaSign) - global.DelFile("captcha.jpg") + } + id := utils.RandomStringRange(6, "0123456789") + log.Warnf("滑块ID为 %v 请在30S内处理.", id) + ticket, err := global.GetSliderTicket(res.VerifyUrl, id) + if err != nil { + log.Warnf("错误: " + err.Error()) + os.Exit(0) + } + res, err = s.Cli.SubmitTicket(ticket) + if err != nil { + log.Warnf("错误: " + err.Error()) + continue // 尝试重新登录 + } + goto Again + case client.NeedCaptcha: + _ = ioutil.WriteFile("captcha.jpg", res.CaptchaImage, 0644) + img, _, _ := image.Decode(bytes.NewReader(res.CaptchaImage)) + fmt.Println(asciiart.New("image", img).Art) + if s.Conf.WebUI != nil && s.Conf.WebUI.WebInput { + log.Warnf("请输入验证码 (captcha.jpg): (http://%s:%d/admin/do_web_write 输入)", s.Conf.WebUI.Host, s.Conf.WebUI.WebUIPort) + text = <-WebInput + } else { + log.Warn("请输入验证码 (captcha.jpg): (Enter 提交)") + text = readLine() + } + global.DelFile("captcha.jpg") + res, err = s.Cli.SubmitCaptcha(strings.ReplaceAll(text, "\n", ""), res.CaptchaSign) + goto Again + case client.SMSNeededError: + if s.Conf.WebUI != nil && s.Conf.WebUI.WebInput { + log.Warnf("账号已开启设备锁, 已向手机 %v 发送短信验证码.", res.SMSPhone) + } else { + log.Warnf("账号已开启设备锁, 按下 Enter 向手机 %v 发送短信验证码.", res.SMSPhone) + readLine() + } + if !s.Cli.RequestSMS() { + log.Warnf("发送验证码失败,可能是请求过于频繁.") + time.Sleep(time.Second * 5) continue - case client.SMSNeededError: - if conf.WebUI != nil && conf.WebUI.WebInput { - log.Warnf("账号已开启设备锁, 已向手机 %v 发送短信验证码.", rsp.SMSPhone) - } else { - log.Warnf("账号已开启设备锁, 按下 Enter 向手机 %v 发送短信验证码.", rsp.SMSPhone) - readLine() - } - if !cli.RequestSMS() { + } + if s.Conf.WebUI != nil && s.Conf.WebUI.WebInput { + log.Warnf("请输入短信验证码: (http://%s:%d/admin/do_web_write 输入)", s.Conf.WebUI.Host, s.Conf.WebUI.WebUIPort) + text = <-WebInput + } else { + log.Warn("请输入短信验证码: (Enter 提交)") + text = readLine() + } + res, err = s.Cli.SubmitSMS(strings.ReplaceAll(strings.ReplaceAll(text, "\n", ""), "\r", "")) + goto Again + case client.SMSOrVerifyNeededError: + log.Warnf("账号已开启设备锁,请选择验证方式:") + log.Warnf("1. 向手机 %v 发送短信验证码", res.SMSPhone) + log.Warnf("2. 使用手机QQ扫码验证.") + if s.Conf.WebUI != nil && s.Conf.WebUI.WebInput { + log.Warnf("请输入(1 - 2): (http://%s:%d/admin/do_web_write 输入)", s.Conf.WebUI.Host, s.Conf.WebUI.WebUIPort) + text = <-WebInput + } else { + log.Warn("请输入(1 - 2):") + text = readLine() + } + if strings.Contains(text, "1") { + if !s.Cli.RequestSMS() { log.Warnf("发送验证码失败,可能是请求过于频繁.") time.Sleep(time.Second * 5) os.Exit(0) } - if conf.WebUI != nil && conf.WebUI.WebInput { - log.Warnf("请输入短信验证码: (http://%s:%d/admin/do_web_write 输入)", conf.WebUI.Host, conf.WebUI.WebUIPort) + if s.Conf.WebUI != nil && s.Conf.WebUI.WebInput { + log.Warnf("请输入短信验证码: (http://%s:%d/admin/do_web_write 输入)....", s.Conf.WebUI.Host, s.Conf.WebUI.WebUIPort) text = <-WebInput } else { log.Warn("请输入短信验证码: (Enter 提交)") text = readLine() } - rsp, err = cli.SubmitSMS(strings.ReplaceAll(strings.ReplaceAll(text, "\n", ""), "\r", "")) + res, err = s.Cli.SubmitSMS(strings.ReplaceAll(strings.ReplaceAll(text, "\n", ""), "\r", "")) + goto Again + } + log.Warnf("请前往 -> %v <- 验证.", res.VerifyUrl) + log.Infof("按 Enter 继续....") + readLine() + continue + case client.UnsafeDeviceError: + log.Warnf("账号已开启设备锁,请前往 -> %v <- 验证.", res.VerifyUrl) + if s.Conf.WebUI != nil && s.Conf.WebUI.WebInput { + log.Infof(" (http://%s:%d/admin/do_web_write 确认后继续)....", s.Conf.WebUI.Host, s.Conf.WebUI.WebUIPort) + text = <-WebInput + } else { + log.Infof("按 Enter 继续....") + readLine() + } + log.Info(text) + continue + case client.OtherLoginError, client.UnknownLoginError: + msg := res.ErrorMessage + if strings.Contains(msg, "版本") { + msg = "密码错误或账号被冻结" + } + if strings.Contains(msg, "上网环境") && count < 5 { + s.Cli.Disconnect() + log.Warnf("错误: 当前上网环境异常. 将更换服务器并重试.") + count++ + time.Sleep(time.Second) continue - case client.SMSOrVerifyNeededError: - log.Warnf("账号已开启设备锁,请选择验证方式:") - log.Warnf("1. 向手机 %v 发送短信验证码", rsp.SMSPhone) - log.Warnf("2. 使用手机QQ扫码验证.") - if conf.WebUI != nil && conf.WebUI.WebInput { - log.Warnf("请输入(1 - 2): (http://%s:%d/admin/do_web_write 输入)", conf.WebUI.Host, conf.WebUI.WebUIPort) - text = <-WebInput - } else { - log.Warn("请输入(1 - 2):") - text = readLine() - } - if strings.Contains(text, "1") { - if !cli.RequestSMS() { - log.Warnf("发送验证码失败,可能是请求过于频繁.") - time.Sleep(time.Second * 5) - os.Exit(0) - } - if conf.WebUI != nil && conf.WebUI.WebInput { - log.Warnf("请输入短信验证码: (http://%s:%d/admin/do_web_write 输入)....", conf.WebUI.Host, conf.WebUI.WebUIPort) - text = <-WebInput - } else { - log.Warn("请输入短信验证码: (Enter 提交)") - text = readLine() - } - rsp, err = cli.SubmitSMS(strings.ReplaceAll(strings.ReplaceAll(text, "\n", ""), "\r", "")) - continue - } - log.Warnf("请前往 -> %v <- 验证并重启Bot.", rsp.VerifyUrl) - log.Infof("按 Enter 继续....") - readLine() - os.Exit(0) - return - case client.UnsafeDeviceError: - log.Warnf("账号已开启设备锁,请前往 -> %v <- 验证并重启Bot.", rsp.VerifyUrl) - if conf.WebUI != nil && conf.WebUI.WebInput { - log.Infof(" (http://%s:%d/admin/do_web_write 确认后继续)....", conf.WebUI.Host, conf.WebUI.WebUIPort) - text = <-WebInput - } else { - log.Infof("按 Enter 继续....") - readLine() - } - log.Info(text) - os.Exit(0) - return - case client.OtherLoginError, client.UnknownLoginError: - msg := rsp.ErrorMessage - if strings.Contains(msg, "版本") { - msg = "密码错误或账号被冻结" - } - if strings.Contains(msg, "上网环境") && count < 5 { - cli.Disconnect() - rsp, err = cli.Login() - count++ - log.Warnf("错误: 当前上网环境异常. 将更换服务器并重试.") - time.Sleep(time.Second) - continue - } - log.Warnf("登录失败: %v", msg) - log.Infof("按 Enter 继续....") - readLine() - os.Exit(0) + } + if strings.Contains(msg, "冻结") { + log.Fatalf("账号被冻结, 放弃重连") + } + log.Warnf("登录失败: %v", msg) + log.Infof("按 Enter 继续....") + readLine() + os.Exit(0) + } + + Relogin: + if relogin { + if times > s.Conf.ReLogin.MaxReloginTimes && s.Conf.ReLogin.MaxReloginTimes != 0 { + log.Fatal("重连失败: 重连次数达到设置的上限值") + s.bot.Release() return } + log.Warnf("将在 %v 秒后尝试重连. 重连次数:%v", s.Conf.ReLogin.ReLoginDelay, times) + times++ + time.Sleep(time.Second * time.Duration(s.Conf.ReLogin.ReLoginDelay)) + s.Cli.Disconnect() + continue } - break } - log.Infof("登录成功 欢迎使用: %v", cli.Nickname) - time.Sleep(time.Second) + if relogin { + log.Info("重连成功") + } +} + +// Dologin 主程序登录 +func (s *webServer) Dologin() { + + s.Cli.AllowSlider = true + s.logincore(false) + log.Infof("登录成功 欢迎使用: %v", s.Cli.Nickname) log.Info("开始加载好友列表...") - global.Check(cli.ReloadFriendList()) - log.Infof("共加载 %v 个好友.", len(cli.FriendList)) + global.Check(s.Cli.ReloadFriendList()) + log.Infof("共加载 %v 个好友.", len(s.Cli.FriendList)) log.Infof("开始加载群列表...") - global.Check(cli.ReloadGroupList()) - log.Infof("共加载 %v 个群.", len(cli.GroupList)) - s.bot = coolq.NewQQBot(cli, conf) - if conf.PostMessageFormat != "string" && conf.PostMessageFormat != "array" { + global.Check(s.Cli.ReloadGroupList()) + log.Infof("共加载 %v 个群.", len(s.Cli.GroupList)) + s.bot = coolq.NewQQBot(s.Cli, s.Conf) + if s.Conf.PostMessageFormat != "string" && s.Conf.PostMessageFormat != "array" { log.Warnf("post_message_format 配置错误, 将自动使用 string") coolq.SetMessageFormat("string") } else { - coolq.SetMessageFormat(conf.PostMessageFormat) + coolq.SetMessageFormat(s.Conf.PostMessageFormat) } - if conf.RateLimit.Enabled { - global.InitLimiter(conf.RateLimit.Frequency, conf.RateLimit.BucketSize) + if s.Conf.RateLimit.Enabled { + global.InitLimiter(s.Conf.RateLimit.Frequency, s.Conf.RateLimit.BucketSize) } log.Info("正在加载事件过滤器.") global.BootFilter() - coolq.IgnoreInvalidCQCode = conf.IgnoreInvalidCQCode - coolq.SplitURL = conf.FixURL - coolq.ForceFragmented = conf.ForceFragmented + coolq.IgnoreInvalidCQCode = s.Conf.IgnoreInvalidCQCode + coolq.SplitURL = s.Conf.FixURL + coolq.ForceFragmented = s.Conf.ForceFragmented log.Info("资源初始化完成, 开始处理信息.") log.Info("アトリは、高性能ですから!") - cli.OnDisconnected(func(bot *client.QQClient, e *client.ClientDisconnectedEvent) { - if conf.ReLogin.Enabled { - conf.ReLogin.Enabled = false - defer func() { conf.ReLogin.Enabled = true }() - var times uint = 1 - for { - if cli.Online { - log.Warn("Bot已登录") - return - } - if times > conf.ReLogin.MaxReloginTimes && conf.ReLogin.MaxReloginTimes != 0 { - break - } - log.Warnf("Bot已离线 (%v),将在 %v 秒后尝试重连. 重连次数:%v", - e.Message, conf.ReLogin.ReLoginDelay, times) - times++ - time.Sleep(time.Second * time.Duration(conf.ReLogin.ReLoginDelay)) - rsp, err := cli.Login() - if err != nil { - log.Errorf("重连失败: %v", err) - cli.Disconnect() - continue - } - if !rsp.Success { - switch rsp.Error { - case client.NeedCaptcha: - log.Fatalf("重连失败: 需要验证码. (验证码处理正在开发中)") - case client.UnsafeDeviceError: - log.Fatalf("重连失败: 设备锁") - default: - log.Errorf("重连失败: %v", rsp.ErrorMessage) - if strings.Contains(rsp.ErrorMessage, "冻结") { - log.Fatalf("账号被冻结, 放弃重连") - } - cli.Disconnect() - continue - } - } - log.Info("重连成功") - return - } - log.Fatal("重连失败: 重连次数达到设置的上限值") + + s.Cli.OnDisconnected(func(q *client.QQClient, e *client.ClientDisconnectedEvent) { + if !s.Conf.ReLogin.Enabled { + return } - s.bot.Release() - log.Fatalf("Bot已离线:%v", e.Message) + log.Warnf("Bot已离线 (%v),尝试重连", e.Message) + s.logincore(true) }) } From d2be362f84013dce27c3e661ee4c3768040f6483 Mon Sep 17 00:00:00 2001 From: YumeMichi Date: Fri, 19 Feb 2021 12:18:39 +0800 Subject: [PATCH 07/12] Remove unnecessary logs --- server/apiAdmin.go | 1 - 1 file changed, 1 deletion(-) diff --git a/server/apiAdmin.go b/server/apiAdmin.go index 37c99f3..be62817 100644 --- a/server/apiAdmin.go +++ b/server/apiAdmin.go @@ -148,7 +148,6 @@ func (s *webServer) logincore(relogin bool) { } else if err == client.ErrAlreadyOnline { break } - log.Error("登录遇到错误: " + err.Error()) switch res.Error { case client.SliderNeededError: From 916c79d2cf9131d8404fd355dd36ad4873775a96 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Fri, 19 Feb 2021 17:15:22 +0800 Subject: [PATCH 08/12] update MiraiGo. fix 582. --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 45acf79..190d374 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/Mrs4s/go-cqhttp go 1.15 require ( - github.com/Mrs4s/MiraiGo v0.0.0-20210206134348-800bf525ed0e + github.com/Mrs4s/MiraiGo v0.0.0-20210219090120-c4288bd213f3 github.com/dustin/go-humanize v1.0.0 github.com/gin-contrib/pprof v1.3.0 github.com/gin-gonic/gin v1.6.3 diff --git a/go.sum b/go.sum index cea2100..e310669 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Mrs4s/MiraiGo v0.0.0-20210206134348-800bf525ed0e h1:SnN+nyRdqN7sULnHUWCofP+Jxs3VJN/y8AlMpcz0nbk= github.com/Mrs4s/MiraiGo v0.0.0-20210206134348-800bf525ed0e/go.mod h1:yhqA0NyKxUf7I/0HR/1OMchveFggX8wde04gqdGrNfU= +github.com/Mrs4s/MiraiGo v0.0.0-20210219090120-c4288bd213f3 h1:hsO/cT00Nxyi5FrnXImimBlcHKrdFh8yWEwp0OR88z8= +github.com/Mrs4s/MiraiGo v0.0.0-20210219090120-c4288bd213f3/go.mod h1:yhqA0NyKxUf7I/0HR/1OMchveFggX8wde04gqdGrNfU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From f9d1cf93a293bca62833e0b365fe278c7f23e14a Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Fri, 19 Feb 2021 17:28:51 +0800 Subject: [PATCH 09/12] update to go 1.16. --- .github/workflows/ci.yml | 2 +- .github/workflows/release.yml | 2 +- go.mod | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 984a8f6..258ada0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: - name: Setup Go environment uses: actions/setup-go@v2.1.3 with: - go-version: 1.15 + go-version: 1.16 - name: Build binary file env: GOOS: ${{ matrix.goos }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 589d51a..cc528b0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,6 +32,6 @@ jobs: github_token: ${{ secrets.GITHUB_TOKEN }} goos: ${{ matrix.goos }} goarch: ${{ matrix.goarch }} - goversion: "https://golang.org/dl/go1.15.3.linux-amd64.tar.gz" + goversion: "https://golang.org/dl/go1.16.linux-amd64.tar.gz" ldflags: -w -s -X "github.com/Mrs4s/go-cqhttp/coolq.Version=${{ env.RELEASE_VERSION }}" diff --git a/go.mod b/go.mod index 190d374..c170291 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/Mrs4s/go-cqhttp -go 1.15 +go 1.16 require ( github.com/Mrs4s/MiraiGo v0.0.0-20210219090120-c4288bd213f3 From e56a297437e2f5347beaff1f134b64f93343fe45 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Fri, 19 Feb 2021 18:02:50 +0800 Subject: [PATCH 10/12] fix darwin_arm64 build. --- global/codec/codec.go | 2 +- global/codec/codec_darwin_arm64.go | 8 ++++++++ .../codec/{codec__windows_arm.go => codec_windows_arm.go} | 0 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 global/codec/codec_darwin_arm64.go rename global/codec/{codec__windows_arm.go => codec_windows_arm.go} (100%) diff --git a/global/codec/codec.go b/global/codec/codec.go index d37b683..8b3c4fc 100644 --- a/global/codec/codec.go +++ b/global/codec/codec.go @@ -1,4 +1,4 @@ -// +build linux windows,!arm darwin +// +build linux windows,!arm darwin,!arm64 // +build 386 amd64 arm arm64 // Package codec Slik编码核心模块 diff --git a/global/codec/codec_darwin_arm64.go b/global/codec/codec_darwin_arm64.go new file mode 100644 index 0000000..0712cf6 --- /dev/null +++ b/global/codec/codec_darwin_arm64.go @@ -0,0 +1,8 @@ +package codec + +import "github.com/pkg/errors" + +//EncodeToSilk 将音频编码为Silk +func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error) { + return nil, errors.New("not supported now") +} diff --git a/global/codec/codec__windows_arm.go b/global/codec/codec_windows_arm.go similarity index 100% rename from global/codec/codec__windows_arm.go rename to global/codec/codec_windows_arm.go From 5db56b99c6553c50e88978d2464874c8cb392db4 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Fri, 19 Feb 2021 18:09:03 +0800 Subject: [PATCH 11/12] add darwin_arm64 ci build. --- .github/workflows/ci.yml | 2 -- .github/workflows/release.yml | 2 -- 2 files changed, 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 258ada0..97bcc1d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,8 +20,6 @@ jobs: exclude: - goos: darwin goarch: arm - - goos: darwin - goarch: arm64 - goos: darwin goarch: "386" - goos: windows diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cc528b0..cdc5aca 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,8 +14,6 @@ jobs: exclude: - goos: darwin goarch: arm - - goos: darwin - goarch: arm64 - goos: darwin goarch: "386" - goos: windows From 580a5feabfd3c80ad401792d6e194379332e5616 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Fri, 19 Feb 2021 18:14:51 +0800 Subject: [PATCH 12/12] fix comment. --- .github/workflows/ci.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 97bcc1d..1718858 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - # build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/amd64 + # build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/amd64, darwin/arm64 goos: [linux, windows, darwin] goarch: ["386", amd64, arm, arm64] exclude: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cdc5aca..e59aa90 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - # build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/386, darwin/amd64 + # build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/386, darwin/amd64, darwin/arm64 goos: [linux, windows, darwin] goarch: ["386", amd64, arm, arm64] exclude: