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); } }
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); //} }
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; } }
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); } }