diff --git a/client/client.go b/client/client.go index 6a8c9587..5636d320 100644 --- a/client/client.go +++ b/client/client.go @@ -6,6 +6,7 @@ import ( "math/rand" "net" "sort" + "strconv" "sync" "time" @@ -208,6 +209,7 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient { servers: []*net.TCPAddr{}, alive: true, ecdh: crypto.NewEcdh(), + highwaySession: new(highway.Session), } { // init atomic values cli.SequenceId.Store(0x3635) @@ -216,6 +218,7 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient { cli.friendSeq.Store(22911) cli.highwayApplyUpSeq.Store(77918) } + cli.highwaySession.Uin = strconv.FormatInt(cli.Uin, 10) cli.GuildService = &GuildService{c: cli} cli.ecdh.FetchPubKey(uin) cli.UseDevice(SystemDeviceInfo) @@ -273,7 +276,7 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient { func (c *QQClient) UseDevice(info *DeviceInfo) { c.version = genVersionInfo(info.Protocol) - c.highwaySession = highway.NewSession(int32(c.version.AppId), c.Uin) + c.highwaySession.AppID = int32(c.version.AppId) c.ksid = []byte(fmt.Sprintf("|%s|A8.2.7.27f6ea96", info.IMEI)) c.deviceInfo = info } @@ -425,6 +428,7 @@ func (c *QQClient) init(tokenLogin bool) error { if len(c.g) == 0 { c.Warning("device lock is disable. http api may fail.") } + c.highwaySession.Uin = strconv.FormatInt(c.Uin, 10) if err := c.registerClient(); err != nil { return errors.Wrap(err, "register error") } diff --git a/client/decoders.go b/client/decoders.go index dd2d8d19..f679b21b 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -10,7 +10,6 @@ import ( "sync" "time" - "github.com/Mrs4s/MiraiGo/internal/packets" "github.com/pkg/errors" "github.com/Mrs4s/MiraiGo/binary" @@ -22,6 +21,7 @@ import ( "github.com/Mrs4s/MiraiGo/client/pb/oidb" "github.com/Mrs4s/MiraiGo/client/pb/profilecard" "github.com/Mrs4s/MiraiGo/client/pb/structmsg" + "github.com/Mrs4s/MiraiGo/internal/packets" "github.com/Mrs4s/MiraiGo/internal/proto" "github.com/Mrs4s/MiraiGo/utils" ) @@ -282,6 +282,7 @@ func decodeTransEmpResponse(c *QQClient, _ *incomingPacketInfo, payload []byte) return nil, errors.Errorf("wtlogin.trans_emp sub cmd 0x12 error: %v", code) } c.Uin = body.ReadInt64() + c.highwaySession.Uin = strconv.FormatInt(c.Uin, 10) body.ReadInt32() // sig create time body.ReadUInt16() m := body.ReadTlvMap(2) diff --git a/client/internal/highway/bdh.go b/client/internal/highway/bdh.go index e3537b58..79a99f82 100644 --- a/client/internal/highway/bdh.go +++ b/client/internal/highway/bdh.go @@ -53,14 +53,15 @@ func (s *Session) UploadBDH(input BdhInput) ([]byte, error) { return nil, errors.Wrap(err, "connect error") } defer conn.Close() - offset := 0 + reader := binary.NewNetworkReader(conn) if err = s.sendEcho(conn); err != nil { return nil, err } - var rspExt []byte const chunkSize = 256 * 1024 + var rspExt []byte + offset := 0 chunk := make([]byte, chunkSize) w := binary.SelectWriter() defer binary.PutWriter(w) @@ -77,10 +78,10 @@ func (s *Session) UploadBDH(input BdhInput) ([]byte, error) { head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ MsgBasehead: &pb.DataHighwayHead{ Version: 1, - Uin: s.uin, + Uin: s.Uin, Command: "PicUp.DataUp", Seq: s.nextSeq(), - Appid: s.appID, + Appid: s.AppID, Dataflag: 4096, CommandId: input.CommandID, LocaleId: 2052, @@ -227,10 +228,10 @@ func (s *Session) UploadBDHMultiThread(input BdhInput, threadCount int) ([]byte, head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ MsgBasehead: &pb.DataHighwayHead{ Version: 1, - Uin: s.uin, + Uin: s.Uin, Command: "PicUp.DataUp", Seq: s.nextSeq(), - Appid: s.appID, + Appid: s.AppID, Dataflag: 4096, CommandId: input.CommandID, LocaleId: 2052, diff --git a/client/internal/highway/highway.go b/client/internal/highway/highway.go index 7a34f10d..638d5a79 100644 --- a/client/internal/highway/highway.go +++ b/client/internal/highway/highway.go @@ -7,7 +7,6 @@ import ( "io" "net" "net/http" - "strconv" "sync/atomic" "github.com/pkg/errors" @@ -19,20 +18,13 @@ import ( ) type Session struct { + Uin string + AppID int32 SigSession []byte SessionKey []byte SsoAddr []Addr - seq int32 - appID int32 - uin string -} - -func NewSession(appID int32, uin int64) *Session { - return &Session{ - appID: appID, - uin: strconv.FormatInt(uin, 10), - } + seq int32 } func (s *Session) AddrLength() int { @@ -81,10 +73,10 @@ func (s *Session) Upload(addr Addr, input Input) error { head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ MsgBasehead: &pb.DataHighwayHead{ Version: 1, - Uin: s.uin, + Uin: s.Uin, Command: "PicUp.DataUp", Seq: s.nextSeq(), - Appid: s.appID, + Appid: s.AppID, Dataflag: 4096, CommandId: input.CommandID, LocaleId: 2052, @@ -128,7 +120,7 @@ func (s *Session) UploadExciting(input ExcitingInput) ([]byte, error) { fileMd5, fileLength := utils.ComputeMd5AndLength(input.Body) _, _ = input.Body.Seek(0, io.SeekStart) addr := s.SsoAddr[0] - url := fmt.Sprintf("http://%v/cgi-bin/httpconn?htcmd=0x6FF0087&uin=%v", addr, s.uin) + url := fmt.Sprintf("http://%v/cgi-bin/httpconn?htcmd=0x6FF0087&Uin=%v", addr, s.Uin) var ( rspExt []byte offset int64 = 0 @@ -151,10 +143,10 @@ func (s *Session) UploadExciting(input ExcitingInput) ([]byte, error) { head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ MsgBasehead: &pb.DataHighwayHead{ Version: 1, - Uin: s.uin, + Uin: s.Uin, Command: "PicUp.DataUp", Seq: s.nextSeq(), - Appid: s.appID, + Appid: s.AppID, Dataflag: 0, CommandId: input.CommandID, LocaleId: 0, @@ -211,10 +203,10 @@ func (s *Session) sendHeartbreak(conn net.Conn) error { head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ MsgBasehead: &pb.DataHighwayHead{ Version: 1, - Uin: s.uin, + Uin: s.Uin, Command: "PicUp.Echo", Seq: s.nextSeq(), - Appid: s.appID, + Appid: s.AppID, Dataflag: 4096, CommandId: 0, LocaleId: 2052,