MCPcopy Create free account
hub / github.com/LagrangeDev/LagrangeGo / FetchQRCode

Method FetchQRCode

client/client.go:68–113  ·  view source on GitHub ↗
(size, margin, ecLevel uint32)

Source from the content-addressed store, hash-verified

66}
67
68func (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
115func (c *QQClient) GetQRCodeResult() (qrcodestate.State, error) {
116 c.debugln("get qrcode result")

Callers 1

FetchQRCodeDefaultMethod · 0.95

Calls 15

connectMethod · 0.95
buildCode2dPacketMethod · 0.95
VersionMethod · 0.95
DeviceMethod · 0.95
sendUniPacketAndWaitMethod · 0.95
SkipBytesMethod · 0.95
ReadU8Method · 0.95
ReadBytesWithLengthMethod · 0.95
ReadTlvMethod · 0.95
NewBuilderFunction · 0.92
T16Function · 0.92
MustParseHexStrFunction · 0.92

Tested by

no test coverage detected