protected override void ParseBody(ByteBuffer buf)
        {
            //怎么我得到的数据是//01 00 05 00 00 20 78 09 D7 43 99 8B DD 87 59 82 EA 85 7D 09 9A B2 92 77 53 5B 6D E3 6C B6 66 B3 21 75 6B 0B 37 85
            #if DEBUG
            Client.LogManager.Log(ToString() + " Decoded Data:" + Utils.Util.ToHex(buf.ToByteArray()));
            #endif
            ReplyCode = buf.Get();//03: ok   04: need verifying 可是我得到的是01是由于前面错了了一个byte
            buf.Get();//0x00
            buf.Get();//0x05
            Png_Data = buf.Get();
            int len = 0;
            if (Png_Data == 0x00 && ReplyCode == 0x01)
            {
                len = (int)buf.Get();
                while (len == 0)
                {
                    len = (int)buf.Get();
                }
            }
            else //ReplyCode != 0x01按下面走 兼容多版本
            {
                buf.GetInt();//需要验证码时为00 00 01 23,不需要时为全0
                len=(int)buf.GetChar();
            }
            Answer_Token = buf.GetByteArray(len);
            if (Png_Data== 0x01)//有验证码数据
            {
                len = (int)buf.GetChar();
                byte[] data = buf.GetByteArray(len);
                buf.Get();
                Next = buf.Get();
                string directory = Utils.Util.MapPath("/Verify/");
                this.CodeFileName = Path.Combine(directory, Client.QQUser.QQ + ".png");
                FileStream fs=null;
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
                if (Next != 0x00)
                {
                    fs = new FileStream(this.CodeFileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Read);

                }
                else fs = new FileStream(this.CodeFileName, FileMode.Append, FileAccess.Write, FileShare.Read);
                //fs.Seek(0, SeekOrigin.End);
                fs.Write(data,0,data.Length);
                fs.Close();
                fs=null;

                len = (int)buf.GetChar();
                Png_Token = buf.GetByteArray(len);
            }

            //
            if (Png_Data!=0x00)
            {
                if (Next!=0x00)
                {
                    //prot_login_request(qq, &png_token, 0, 1);
                    Client.LogManager.Log("接收到部分验证码图片数据,继续接收....");
                    OutPacket outPacket = new LoginRequestPacket(Client, Png_Token, 0, 1);//发送一个请求验证码的包
                    Client.PacketManager.SendPacketAnyway(outPacket, QQPort.Main.Name);
                }
                else
                {
                    //qq->data.verify_token = answer_token;
                    //qqclient_set_process(qq, P_VERIFYING);
                    Client.LoginStatus = LoginStatus.NeedVerifyCode;
                    Client.QQUser.QQKey.Verify_Token = Answer_Token;
                    Client.LogManager.Log("Need input Verify Code");
                    //Client.LoginManager.OnLoginNeedVerifyCode(e);
                }
            }
            else
            {
                //DBG("process verify password");
                //qq->data.token_c = answer_token;
                //prot_login_verify(qq);
                Client.LogManager.Log("Process LoginRequest Success! Now Process Verify Password...");
                Client.QQUser.QQKey.Answer_Token = Answer_Token;
                OutPacket outPacket = new LoginVerifyPacket(Client);//发送一个登陆请求包
                Client.PacketManager.SendPacketAnyway(outPacket, QQPort.Main.Name);
            }
        }
Esempio n. 2
0
        internal void ProcessLoginVerifyReply(LoginVerifyReplyPacket loginVerifyReplyPacket, LoginVerifyPacket loginVerifyPacket)
        {
            QQEventArgs<LoginVerifyReplyPacket, LoginVerifyPacket> e = new QQEventArgs<LoginVerifyReplyPacket, LoginVerifyPacket>(QQClient, loginVerifyReplyPacket, loginVerifyPacket);
            switch (loginVerifyReplyPacket.ReplyCode)
            {
                case 0x00://success!
                    QQClient.LogManager.Log(loginVerifyReplyPacket.ToString() + ":0x" + loginVerifyReplyPacket.ReplyCode.ToString("X2") + " Login Success!");
                    //触发事件
                    OutPacket outPacket = new LoginGetInfoPacket(this.QQClient);//发送一个登陆请求包
                    QQClient.PacketManager.SendPacketAnyway(outPacket, QQPort.Main.Name);
                    break;
                case 0x33:
                case 0x51://denied!
                    QQClient.LogManager.Log(loginVerifyReplyPacket.ToString() + ":0x" + loginVerifyReplyPacket.ReplyCode.ToString("X2") + " Denied!");
                    break;
                case 0xBF:
                    QQClient.LogManager.Log(loginVerifyReplyPacket.ToString() + ":0x" + loginVerifyReplyPacket.ReplyCode.ToString("X2") + " No this QQ number!");
                    break;
                case 0x34:
                    QQClient.LogManager.Log(loginVerifyReplyPacket.ToString() + ":0x" + loginVerifyReplyPacket.ReplyCode.ToString("X2") + " Wrong password!");
                    QQClient.LoginStatus = LoginStatus.WrongPassword;
                    break;
                default:
                    QQClient.LogManager.Log(loginVerifyReplyPacket.ToString() + ":0x" + loginVerifyReplyPacket.ReplyCode.ToString("X2") + " Unknow ReplyCode!");
                    break;

            }
            //return;
        }