diff --git a/client/builders.go b/client/builders.go index 22b06042..1732e368 100644 --- a/client/builders.go +++ b/client/builders.go @@ -170,6 +170,22 @@ func (c *QQClient) buildSMSCodeSubmitPacket(code string) (uint16, []byte) { return seq, packet } +func (c *QQClient) buildTicketSubmitPacket(ticket string) (uint16, []byte) { + seq := c.nextSeq() + req := packets.BuildOicqRequestPacket(c.Uin, 0x810, crypto.ECDH, c.RandomKey, func(w *binary.Writer) { + w.WriteUInt16(2) + w.WriteUInt16(4) + + w.Write(tlv.T193(ticket)) + w.Write(tlv.T8(2052)) + w.Write(tlv.T104(c.t104)) + w.Write(tlv.T116(c.version.MiscBitmap, c.version.SubSigmap)) + }) + sso := packets.BuildSsoPacket(seq, c.version.AppId, "wtlogin.login", SystemDeviceInfo.IMEI, []byte{}, c.OutGoingPacketSessionId, req, c.ksid) + packet := packets.BuildLoginPacket(c.Uin, 2, make([]byte, 16), sso, []byte{}) + return seq, packet +} + func (c *QQClient) buildRequestTgtgtNopicsigPacket() (uint16, []byte) { seq := c.nextSeq() req := packets.BuildOicqRequestPacket(c.Uin, 0x0810, crypto.NewEncryptSession(c.sigInfo.t133), c.sigInfo.wtSessionTicketKey, func(w *binary.Writer) { diff --git a/client/client.go b/client/client.go index 8328cba4..31df631d 100644 --- a/client/client.go +++ b/client/client.go @@ -260,6 +260,20 @@ func (c *QQClient) SubmitCaptcha(result string, sign []byte) (*LoginResponse, er return &l, nil } +func (c *QQClient) SubmitTicket(ticket string) (*LoginResponse, error) { + seq, packet := c.buildTicketSubmitPacket(ticket) + rsp, err := c.sendAndWait(seq, packet) + if err != nil { + c.Disconnect() + return nil, err + } + l := rsp.(LoginResponse) + if l.Success { + c.init() + } + return &l, nil +} + func (c *QQClient) SubmitSMS(code string) (*LoginResponse, error) { rsp, err := c.sendAndWait(c.buildSMSCodeSubmitPacket(code)) if err != nil { diff --git a/protocol/tlv/t193.go b/protocol/tlv/t193.go new file mode 100644 index 00000000..13ff5d5c --- /dev/null +++ b/protocol/tlv/t193.go @@ -0,0 +1,12 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T193(ticket string) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x193) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.Write([]byte(ticket)) + })) + }) +}