From 6f0f66132afbf4f190adcd89c6a87fdce006c4ca Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Sat, 27 Mar 2021 21:30:21 +0800 Subject: [PATCH] feat: session resume. --- global/config.go | 1 + go.mod | 3 ++- go.sum | 6 ++++-- main.go | 43 ++++++++++++++++++++++++++++++++----------- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/global/config.go b/global/config.go index e6108ff..853c5bd 100644 --- a/global/config.go +++ b/global/config.go @@ -15,6 +15,7 @@ var json = jsoniter.ConfigCompatibleWithStandardLibrary var currentPath = getCurrentPath() var DefaultConfFile = path.Join(currentPath, "config.hjson") +var AccountToken []byte // DefaultConfigWithComments 为go-cqhttp的默认配置文件 var DefaultConfigWithComments = ` diff --git a/go.mod b/go.mod index 0db82f6..8bcd3b5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f - github.com/Mrs4s/MiraiGo v0.0.0-20210323143736-d233c90d5083 + github.com/Mrs4s/MiraiGo v0.0.0-20210327114026-05f0087b4f79 github.com/dustin/go-humanize v1.0.0 github.com/gin-gonic/gin v1.6.3 github.com/gorilla/websocket v1.4.2 @@ -26,6 +26,7 @@ require ( github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60 github.com/willf/bitset v1.1.11 // indirect golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b + golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb // indirect golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba ) diff --git a/go.sum b/go.sum index e75fc3b..0eaec93 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII= github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Mrs4s/MiraiGo v0.0.0-20210323143736-d233c90d5083 h1:ELaNvv80OTwHTYhKwoQpgV4dneKPM1qE5Geu3A1kM/8= -github.com/Mrs4s/MiraiGo v0.0.0-20210323143736-d233c90d5083/go.mod h1:NjiWhlvGxwv1ftOWIoiFa/OzklnAYI4YqNexFOKSZKw= +github.com/Mrs4s/MiraiGo v0.0.0-20210327114026-05f0087b4f79 h1:eiTXqIOigPaS+Ls8rZotUV2TVC4pQ4t3CHIre18k/NY= +github.com/Mrs4s/MiraiGo v0.0.0-20210327114026-05f0087b4f79/go.mod h1:NjiWhlvGxwv1ftOWIoiFa/OzklnAYI4YqNexFOKSZKw= 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= @@ -136,6 +136,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b h1:wSOdpTq0/eI46Ez/LkDwIsAKA71YP2SRKBODiRWM0as= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb h1:fqpd0EBDzlHRCjiphRR5Zo/RSWWQlWv34418dnEixWk= +golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= diff --git a/main.go b/main.go index 1d92f6b..b22339f 100644 --- a/main.go +++ b/main.go @@ -165,7 +165,7 @@ func main() { log.Warning("将等待10s后启动") time.Sleep(time.Second * 10) } - if conf.Uin == 0 || (conf.Password == "" && conf.PasswordEncrypted == "") { + if (conf.Uin == 0 || (conf.Password == "" && conf.PasswordEncrypted == "")) && !global.PathExists("session.token") { log.Warn("账号密码未配置, 将使用二维码登录.") if !isFastStart { log.Warn("将在 5秒 后继续.") @@ -313,15 +313,33 @@ func main() { // b := server.WebServer.Run(fmt.Sprintf("%s:%d", conf.WebUI.Host, conf.WebUI.WebUIPort), cli) // c := server.Console isQRCodeLogin := (conf.Uin == 0 || len(conf.Password) == 0) && len(conf.PasswordEncrypted) == 0 - if !isQRCodeLogin { - if err := commonLogin(); err != nil { - log.Fatalf("登录时发生致命错误: %v", err) - } - } else { - if err := qrcodeLogin(); err != nil { - log.Fatalf("登录时发生致命错误: %v", err) + isTokenLogin := false + if global.PathExists("session.token") { + token, err := ioutil.ReadFile("session.token") + if err == nil { + if err = cli.TokenLogin(token); err != nil { + log.Warnf("恢复会话失败: %v , 尝试使用正常流程登录.", err) + } else { + isTokenLogin = true + } } } + if !isTokenLogin { + if !isQRCodeLogin { + if err := commonLogin(); err != nil { + log.Fatalf("登录时发生致命错误: %v", err) + } + } else { + if err := qrcodeLogin(); err != nil { + log.Fatalf("登录时发生致命错误: %v", err) + } + } + } + saveToken := func() { + global.AccountToken = cli.GenToken() + _ = ioutil.WriteFile("session.token", global.AccountToken, 0677) + } + saveToken() var times uint = 1 // 重试次数 var reLoginLock sync.Mutex cli.OnDisconnected(func(q *client.QQClient, e *client.ClientDisconnectedEvent) { @@ -331,9 +349,6 @@ func main() { if !conf.ReLogin.Enabled { os.Exit(1) } - if isQRCodeLogin { - log.Fatalf("二维码登录暂不支持重连.") - } if times > conf.ReLogin.MaxReloginTimes && conf.ReLogin.MaxReloginTimes != 0 { log.Fatalf("Bot重连次数超过限制, 停止") } @@ -344,6 +359,12 @@ func main() { if cli.Online { return } + if err := cli.TokenLogin(global.AccountToken); err == nil { + saveToken() + } + if isQRCodeLogin { + log.Fatalf("二维码登录暂不支持重连.") + } if err := commonLogin(); err != nil { log.Fatalf("登录时发生致命错误: %v", err) }