From 93074ef4af0c484e8fd81b8b095a1c1f647240d6 Mon Sep 17 00:00:00 2001 From: Shigma Date: Sat, 13 Aug 2022 00:01:04 +0800 Subject: [PATCH 1/3] feat: support manually input ticket --- cmd/gocq/login.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/cmd/gocq/login.go b/cmd/gocq/login.go index 20c10e1..44f64eb 100644 --- a/cmd/gocq/login.go +++ b/cmd/gocq/login.go @@ -151,7 +151,7 @@ func loginResponseProcessor(res *client.LoginResponse) error { log.Warn("请输入(1 - 2) (将在10秒后自动选择1):") text = readLineTimeout(time.Second*10, "1") if strings.Contains(text, "1") { - ticket := sliderCaptchaProcessor(res.VerifyUrl) + ticket := getTicket(res.VerifyUrl) if ticket == "" { os.Exit(0) } @@ -218,9 +218,19 @@ func loginResponseProcessor(res *client.LoginResponse) error { } } -func sliderCaptchaProcessor(u string) string { +func getTicket(u string) (str string) { id := utils.RandomString(8) - log.Warnf("请前往该地址验证 -> %v", strings.ReplaceAll(u, "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?", fmt.Sprintf("https://captcha.go-cqhttp.org/captcha?id=%v&", id))) + log.Warnf("请前往该地址验证 -> %v <- 或输入手动抓取的 ticket:(Enter 提交)", strings.ReplaceAll(u, "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?", fmt.Sprintf("https://captcha.go-cqhttp.org/captcha?id=%v&", id))) + r := make(chan string) + select { + case r <- readLine(): + case r <- sliderCaptchaProcessor(id): + } + str = <-r + return +} + +func sliderCaptchaProcessor(id string) string { start := time.Now() for time.Since(start).Minutes() < 2 { time.Sleep(time.Second) From bf5562b6dd68eac2d1ed72c29c340595e415e435 Mon Sep 17 00:00:00 2001 From: Shigma Date: Sat, 13 Aug 2022 00:56:43 +0800 Subject: [PATCH 2/3] refa: use ticker for fetchCaptcha() --- cmd/gocq/login.go | 52 ++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/cmd/gocq/login.go b/cmd/gocq/login.go index 44f64eb..38770c7 100644 --- a/cmd/gocq/login.go +++ b/cmd/gocq/login.go @@ -221,29 +221,39 @@ func loginResponseProcessor(res *client.LoginResponse) error { func getTicket(u string) (str string) { id := utils.RandomString(8) log.Warnf("请前往该地址验证 -> %v <- 或输入手动抓取的 ticket:(Enter 提交)", strings.ReplaceAll(u, "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?", fmt.Sprintf("https://captcha.go-cqhttp.org/captcha?id=%v&", id))) - r := make(chan string) - select { - case r <- readLine(): - case r <- sliderCaptchaProcessor(id): - } - str = <-r - return -} - -func sliderCaptchaProcessor(id string) string { - start := time.Now() - for time.Since(start).Minutes() < 2 { - time.Sleep(time.Second) - data, err := global.GetBytes("https://captcha.go-cqhttp.org/captcha/ticket?id=" + id) - if err != nil { - log.Warnf("获取 Ticket 时出现错误: %v", err) - return "" - } - g := gjson.ParseBytes(data) - if g.Get("ticket").Exists() { - return g.Get("ticket").String() + manual := make(chan string) + go func() { + str = readLine() + manual <- str + }() + ticker := time.NewTicker(time.Second) + for count := 120; count > 0; count-- { + select { + case <-ticker.C: + str = fetchCaptcha(id) + if str != "" { + ticker.Stop() + return + } + case <-manual: + ticker.Stop() + return } } + ticker.Stop() log.Warnf("验证超时") return "" } + +func fetchCaptcha(id string) string { + data, err := global.GetBytes("https://captcha.go-cqhttp.org/captcha/ticket?id=" + id) + if err != nil { + log.Warnf("获取 Ticket 时出现错误: %v", err) + return "" + } + g := gjson.ParseBytes(data) + if g.Get("ticket").Exists() { + return g.Get("ticket").String() + } + return "" +} From 08b0837cab325dee51845fd271aeafcfb709a870 Mon Sep 17 00:00:00 2001 From: Shigma Date: Sat, 13 Aug 2022 01:04:29 +0800 Subject: [PATCH 3/3] fix: fix string racing --- cmd/gocq/login.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cmd/gocq/login.go b/cmd/gocq/login.go index 38770c7..d963d25 100644 --- a/cmd/gocq/login.go +++ b/cmd/gocq/login.go @@ -221,26 +221,23 @@ func loginResponseProcessor(res *client.LoginResponse) error { func getTicket(u string) (str string) { id := utils.RandomString(8) log.Warnf("请前往该地址验证 -> %v <- 或输入手动抓取的 ticket:(Enter 提交)", strings.ReplaceAll(u, "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?", fmt.Sprintf("https://captcha.go-cqhttp.org/captcha?id=%v&", id))) - manual := make(chan string) + manual := make(chan string, 1) go func() { - str = readLine() - manual <- str + manual <- readLine() }() ticker := time.NewTicker(time.Second) + defer ticker.Stop() for count := 120; count > 0; count-- { select { case <-ticker.C: str = fetchCaptcha(id) if str != "" { - ticker.Stop() return } - case <-manual: - ticker.Stop() + case str = <-manual: return } } - ticker.Stop() log.Warnf("验证超时") return "" }