(size, margin, ecLevel uint32)
| 66 | } |
| 67 | |
| 68 | func (c *QQClient) FetchQRCode(size, margin, ecLevel uint32) ([]byte, string, error) { |
| 69 | if c.Online.Load() { |
| 70 | return nil, "", ErrAlreadyOnline |
| 71 | } |
| 72 | err := c.connect() |
| 73 | if err != nil { |
| 74 | return nil, "", err |
| 75 | } |
| 76 | |
| 77 | packet := c.buildCode2dPacket(c.Uin, 0x31, binary.NewBuilder(). |
| 78 | WriteU16(0). |
| 79 | WriteU64(0). |
| 80 | WriteU8(0). |
| 81 | WriteTLV( |
| 82 | tlv.T16(c.Version().AppID, c.Version().AppIDQrcode, |
| 83 | utils.MustParseHexStr(c.Device().GUID), c.Version().PTVersion, c.Version().PackageName), |
| 84 | tlv.T1b(0, 0, size, margin, 72, ecLevel, 2), |
| 85 | tlv.T1d(c.Version().MiscBitmap), |
| 86 | tlv.T33(utils.MustParseHexStr(c.Device().GUID)), |
| 87 | tlv.T35(c.Version().PTOSVersion), |
| 88 | tlv.T66(c.Version().PTOSVersion), |
| 89 | tlv.Td1(c.Version().OS, c.Device().DeviceName), |
| 90 | ).WriteU8(3).ToBytes()) |
| 91 | |
| 92 | response, err := c.sendUniPacketAndWait("wtlogin.trans_emp", packet) |
| 93 | if err != nil { |
| 94 | return nil, "", err |
| 95 | } |
| 96 | |
| 97 | decrypted := binary.NewReader(response) |
| 98 | decrypted.SkipBytes(54) |
| 99 | retCode := decrypted.ReadU8() |
| 100 | qrsig := decrypted.ReadBytesWithLength("u16", false) |
| 101 | tlvs := decrypted.ReadTlv() |
| 102 | |
| 103 | if retCode == 0 && tlvs[0x17] != nil { |
| 104 | c.transport.Sig.Qrsig = qrsig |
| 105 | urlreader := binary.NewReader(tlvs[209]) |
| 106 | // 这样是不对的,调试后发现应该丢一个字节,然后读下一个字节才是数据的大小 |
| 107 | // string(binary.NewReader(tlvs[209]).ReadBytesWithLength("u16", true)) |
| 108 | urlreader.ReadU8() |
| 109 | return tlvs[0x17], utils.B2S(urlreader.ReadBytesWithLength("u8", false)), nil |
| 110 | } |
| 111 | |
| 112 | return nil, "", fmt.Errorf("err qr retcode %d", retCode) |
| 113 | } |
| 114 | |
| 115 | func (c *QQClient) GetQRCodeResult() (qrcodestate.State, error) { |
| 116 | c.debugln("get qrcode result") |
no test coverage detected