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);
            }
        }
示例#2
0
        internal void ProcessLoginRequestReply(LoginRequestReplyPacket loginRequestReplyPacket, LoginRequestPacket loginRequestPacket)
        {
            QQEventArgs<LoginRequestReplyPacket, LoginRequestPacket> e = new QQEventArgs<LoginRequestReplyPacket, LoginRequestPacket>(QQClient, loginRequestReplyPacket, loginRequestPacket);
            //if (loginRequestReplyPacket.Png_Data != 0x00)//需要验证码
            //{
            //    if (loginRequestReplyPacket.Next != 0x00)//还有验证码数据没接受完
            //    {
            //        QQClient.LogManager.Log("接收到部分验证码图片数据,继续接收....");
            //        OutPacket outPacket = new LoginRequestPacket(QQClient, loginRequestReplyPacket.Png_Token, 0, 1);//发送一个请求验证码的包
            //        QQClient.PacketManager.SendPacketAnyway(outPacket, QQPort.Main.Name);
            //    }
            //    else//已经得到验证码文件
            //    {
            //        QQClient.LoginStatus = LoginStatus.NeedVerifyCode;
            //        QQClient.QQUser.QQKey.Verify_Token = loginRequestReplyPacket.Answer_Token;
            //        QQClient.LogManager.Log("Need input Verify Code");
            //        OnLoginNeedVerifyCode(e);

            //    }
            //}
            //else//不需要验证码
            //{
            //    QQClient.LogManager.Log("Process LoginRequest Success! Now Process Verify Password...");
            //    QQClient.QQUser.QQKey.Answer_Token = loginRequestReplyPacket.Answer_Token;
            //    OutPacket outPacket =new LoginVerifyPacket(this.QQClient) ;//发送一个登陆请求包
            //    QQClient.PacketManager.SendPacketAnyway(outPacket, QQPort.Main.Name);

            //}
        }
示例#3
0
        internal void ProcessLoginTouchReply(LoginTouchReplyPacket loginTouchReplyPacket, LoginTouchPacket loginTouchPacket)
        {
            QQEventArgs<LoginTouchReplyPacket, LoginTouchPacket> e = new QQEventArgs<LoginTouchReplyPacket, LoginTouchPacket>(QQClient, loginTouchReplyPacket, loginTouchPacket);
            if (loginTouchReplyPacket.ReplyCode == ReplyCode.OK)
            {
                QQClient.LoginStatus = LoginStatus.Connected;
                if (loginTouchReplyPacket.IsRedirect)//转向
                {
                    if (Utils.Util.IsIPZero(loginTouchReplyPacket.RedirectIP))
                    {
                        //OnLoginRedirectNull(e);
                        QQClient.LogManager.Log("RedirectIp Is Zero!");
                        QQClient.LoginStatus = LoginStatus.Failed;
                    }
                    else
                    {
                        QQClient.LoginStatus = new LoginStatus("Redirect to" + Utils.Util.GetIpStringFromBytes(loginTouchReplyPacket.RedirectIP), "重定向到服务器" + Utils.Util.GetIpStringFromBytes(loginTouchReplyPacket.RedirectIP));
                        //OnLoginRedirect(e);
                        QQClient.LoginRedirect = true;
                        QQClient.ConnectionManager.ConnectionPool.Release(QQPort.Main.Name);
                        QQClient.LogManager.Log("Redirect to " + Utils.Util.GetIpStringFromBytes(loginTouchReplyPacket.RedirectIP));
                        string ipTemp = QQClient.LoginServerHost;
                        QQClient.LoginServerHost = Utils.Util.GetIpStringFromBytes(QQClient.ServerInfo.CSP_dwConnIP);
                        QQClient.ServerInfo.CSP_dwConnIP = Utils.Util.IpToBytes(ipTemp);
                        //重新登录
                        QQClient.Login();
                    }
                }
                else
                {
                    //将服务器返回的时间和IP存入QQClient等待使用
                    QQClient.ServerTime = loginTouchReplyPacket.ServerTime;
                    QQClient.ClientIP = loginTouchReplyPacket.ClientIP;
                    //0xba开始登陆
                    QQUser.QQKey.LoginRequestToken = loginTouchReplyPacket.Token;
                    OutPacket outPacket = new LoginRequestPacket(this.QQClient);
                    QQClient.PacketManager.SendPacketAnyway(outPacket, QQPort.Main.Name);
                    //QQUser.QQKey = new QQKey(this.QQUser);
                    //QQClient.LoginManager.

                }

            }
            else
            { QQClient.LoginStatus = LoginStatus.Failed; }
        }
示例#4
0
        public void LoginSendVerifyCode(string verifyCode)
        {
            byte[] bytes=Utils.Util.GetBytes(verifyCode);

            ByteBuffer buf = new ByteBuffer(bytes);

            uint vCode = buf.GetUInt();
            if (QQClient.LoginStatus==LoginStatus.Login)
            {
                //qqclient_set_process(qq, P_LOGIN);	//原来漏了这个  20090709
                //prot_user_request_token(qq, qq->data.operating_number, qq->data.operation, 1, code);
                QQClient.LogManager.Log("send Verify Code:" + vCode.ToString());
                OutPacket outPacket=new LoginRequestPacket(QQClient,QQClient.QQUser.QQKey.Verify_Token,vCode,0);
                QQClient.PacketManager.SendPacketAnyway(outPacket, QQPort.Main.Name);
            }
            else
            {
                //qqclient_set_process(qq, P_LOGGING);	//原来这个是P_LOGIN,错了。 20090709
                //prot_login_request(qq, &qq->data.verify_token, code, 0);
                QQClient.LogManager.Log("send Verify Code:" + vCode.ToString());
                OutPacket outPacket = new LoginRequestPacket(QQClient, QQClient.QQUser.QQKey.Verify_Token, vCode, 0);
                QQClient.PacketManager.SendPacketAnyway(outPacket, QQPort.Main.Name);
            }
        }