(verifyURL string)
| 270 | } |
| 271 | |
| 272 | func (c *QQClient) NewDeviceVerify(verifyURL string) error { |
| 273 | original := func() string { |
| 274 | params := strings.FieldsFunc(strings.Split(verifyURL, "?")[1], func(r rune) bool { |
| 275 | return r == '&' |
| 276 | }) |
| 277 | for _, param := range params { |
| 278 | if strings.HasPrefix(param, "str_url=") { |
| 279 | return strings.TrimPrefix(param, "str_url=") |
| 280 | } |
| 281 | } |
| 282 | return "" |
| 283 | }() |
| 284 | |
| 285 | query := func() []byte { |
| 286 | data, _ := json.Marshal(&NTNewDeviceQrCodeQuery{ |
| 287 | Uint32Flag: 0, |
| 288 | Token: base64.StdEncoding.EncodeToString(utils.S2B(original)), |
| 289 | }) |
| 290 | return data |
| 291 | }() |
| 292 | for errCount, timeSec := 0, 0; timeSec < 120 || errCount < 3; timeSec++ { |
| 293 | resp, err := func() (*NTNewDeviceQrCodeResponse, error) { |
| 294 | resp, err := http.Post(fmt.Sprintf("https://oidb.tim.qq.com/v3/oidbinterface/oidb_0xc9e_8?uid=%d&getqrcode=1&sdkappid=39998&actype=2", c.Uin), |
| 295 | "application/json", bytes.NewReader(query)) |
| 296 | if err != nil { |
| 297 | return nil, err |
| 298 | } |
| 299 | defer resp.Body.Close() |
| 300 | data, _ := io.ReadAll(resp.Body) |
| 301 | var response NTNewDeviceQrCodeResponse |
| 302 | err = json.Unmarshal(data, &response) |
| 303 | if err != nil { |
| 304 | return nil, err |
| 305 | } |
| 306 | return &response, nil |
| 307 | }() |
| 308 | if err != nil { |
| 309 | errCount++ |
| 310 | continue |
| 311 | } |
| 312 | if resp.StrNtSuccToken != "" { |
| 313 | c.transport.Sig.TempPwd = utils.S2B(resp.StrNtSuccToken) |
| 314 | data, err := buildNtloginRequest(c.Uin, c.Version(), c.Device(), &c.transport.Sig, c.transport.Sig.TempPwd) |
| 315 | if err != nil { |
| 316 | return err |
| 317 | } |
| 318 | |
| 319 | packet, err := c.sendUniPacketAndWait( |
| 320 | "trpc.login.ecdh.EcdhService.SsoNTLoginPasswordLoginNewDevice", |
| 321 | data, |
| 322 | ) |
| 323 | if err != nil { |
| 324 | return err |
| 325 | } |
| 326 | ret, err := parseNewDeviceLoginResponse(packet, &c.transport.Sig) |
| 327 | if err != nil { |
| 328 | return err |
| 329 | } |
no test coverage detected