基于kjavaQQ1.4版本协议的整理与重写
这好像还是今年年初弄的一个东西,当时忘了是为了什么了,反正就是弄了这个手机QQ的协议,然后自己根据这开始写了一个简陋的QQ客户端,越来越有种想法,感觉该去看看C++了,对于C#这一年粗略的研究了很多东西,总结开来--码,不想继续这种想法,在整理完以前的东西之后,就去大踏步的开进C++
这个是手机QQ,基于1.4版本的协议,经测试一切正常,能够实现的功能在代码里都有注释,还有webQQ和飞信,有想研究的可以自行去研究,感觉那两个虽然有实现,但不是想这个这样自己去拦截封包然后测试,在能发消息的那一刻,确实很兴奋,但是那两个都是基于别人研究的整理,只当是多加深了一下网络封包的理解
下面这个是用到的协议,也可以自己去拦截看看是否现在已经改变,至少在今年三月的时候还是能正常用的
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; namespace JI { public static class Helper_QQ { /// <summary> /// 登录QQ /// </summary> public static string QQLogin = " VER=1.4&CON=1&CMD=Login&SEQ=QQSeq&UIN=QQNumber&PS=QQPassword&M5=1&LG=0&LC=812822641C978097&GD=EX4RLS2GFYGR6T1R&CKE=\r\n " ; /// <summary> /// QQ验证码 /// </summary> public static string QQYanZheng = " VER=1.4&CON=1&CMD=VERIFYCODE&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&SC=2&VC=YanZhengMa\r\n " ; /// <summary> /// 隐身 /// </summary> public static string QQYinShen = " VER=1.4&CON=1&CMD=Change_Stat&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&ST=40\r\n " ; /// <summary> /// 离开 /// </summary> public static string QQLiKai = " VER=1.4&CON=1&CMD=Change_Stat&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&ST=30\r\n " ; /// <summary> /// 在线 /// </summary> public static string QQZaiXian = " VER=1.4&CON=1&CMD=Change_Stat&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&ST=10\r\n " ; /// <summary> /// 注销 /// </summary> public static string QQZhuXiao = " VER=1.4&CON=1&CMD=Logout&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382\r\n " ; /// <summary> /// 获取取QQ在线好友 /// </summary> public static string QQZaiXianHaoYou = " VER=1.4&CON=1&CMD=Query_Stat2&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&CM=2&UN=0\r\n " ; /// <summary> /// 发送消息 /// </summary> public static string QQSentMessage = " VER=1.4&CON=1&CMD=CLTMSG&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&UN=HaoYou&MG=Message\r\n " ; /// <summary> /// 查看好友资料 /// </summary> public static string QQHaoYouZiLiao = " VER=1.4&CON=1&CMD=GetInfo&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&LV=2&UN=HaoYou\r\n " ; /// <summary> /// 加好友 /// </summary> public static string QQJiaHaoYou = " VER=1.4&CON=1&CMD=AddToList&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&UN=HaoYou\r\n " ; /// <summary> /// 验证好友信息 /// </summary> public static string QQYanZhengHaoYou = " VER=1.4&CON=1&CMD=Ack_AddToList&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&UN=HaoYou&CD=2&RS=YanZheng\r\n " ; /// <summary> /// 转换密码为MD5 /// </summary> /// <param name="toCryString"></param> /// <returns></returns> public static string MD5( string toCryString) { System.Security.Cryptography.MD5CryptoServiceProvider hashmd5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); return BitConverter.ToString(hashmd5.ComputeHash(Encoding.Default.GetBytes(toCryString))).Replace( " - " , "" ).ToLower(); } } public class QQ { public string QQNumber = null ; public string QQPassword = null ; public string QQZhuangTai = null ; public enum QQzhuangtai { 在线 = 1 , 隐身, 离线 } public void User( string number, string password) { this .QQNumber = number; this .QQPassword = password; } /// <summary> /// QQ登录 /// </summary> /// <returns></returns> public Byte[] Login() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string PasswordMD5 = ( this .QQPassword); string LoginString= Helper_QQ.QQLogin.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber).Replace( " QQPassword " , PasswordMD5); return System.Text.Encoding.UTF8.GetBytes(LoginString); } /// <summary> /// 验证码 /// </summary> /// <param name="yanzheng"></param> /// <returns></returns> public Byte[] YanZheng( string yanzheng) { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string yz = Helper_QQ.QQYanZheng.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber).Replace( " YanZhengMa " , yanzheng); return System.Text.Encoding.UTF8.GetBytes(yz); } /// <summary> /// 隐身 /// </summary> /// <returns></returns> public Byte[] YinShen() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string ys = Helper_QQ.QQYinShen.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber); return System.Text.Encoding.UTF8.GetBytes(ys); } /// <summary> /// 离开 /// </summary> /// <returns></returns> public Byte[] LiKai() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string lk = Helper_QQ.QQLiKai.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber); return System.Text.Encoding.UTF8.GetBytes(lk); } /// <summary> /// 在线 /// </summary> /// <returns></returns> public Byte[] ZaiXian() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string zx = Helper_QQ.QQZaiXian.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber); return System.Text.Encoding.UTF8.GetBytes(zx); } /// <summary> /// 注销 /// </summary> /// <returns></returns> public Byte[] ZhuXiao() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string zx = Helper_QQ.QQZhuXiao.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber); return System.Text.Encoding.UTF8.GetBytes(zx); } /// <summary> /// 获取在线好友 /// </summary> /// <param name="ZaiXianHaoYou"></param> /// <returns></returns> public Byte[] ZaiXianHaoYou() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string zxhy = Helper_QQ.QQZaiXianHaoYou.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber); return System.Text.Encoding.UTF8.GetBytes(zxhy); } /// <summary> /// 发送消息 /// </summary> /// <param name="SentMessage"></param> /// <returns></returns> public Byte[] SentMessage( string qqNumber, string message) { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string sm = Helper_QQ.QQSentMessage.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber).Replace( " HaoYou " , qqNumber).Replace( " Message " , message); return System.Text.Encoding.UTF8.GetBytes(sm); } /// <summary> /// 获取好友资料 /// </summary> /// <param name="qqNumber"></param> /// <param name="message"></param> /// <returns></returns> public Byte[] HaoYouZiLiao( string qqNumber) { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string sm = Helper_QQ.QQHaoYouZiLiao.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber).Replace( " HaoYou " , qqNumber); return System.Text.Encoding.UTF8.GetBytes(sm); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; namespace JI { public static class Helper_QQ { /// <summary> /// 登录QQ /// </summary> public static string QQLogin = " VER=1.4&CON=1&CMD=Login&SEQ=QQSeq&UIN=QQNumber&PS=QQPassword&M5=1&LG=0&LC=812822641C978097&GD=EX4RLS2GFYGR6T1R&CKE=\r\n " ; /// <summary> /// QQ验证码 /// </summary> public static string QQYanZheng = " VER=1.4&CON=1&CMD=VERIFYCODE&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&SC=2&VC=YanZhengMa\r\n " ; /// <summary> /// 隐身 /// </summary> public static string QQYinShen = " VER=1.4&CON=1&CMD=Change_Stat&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&ST=40\r\n " ; /// <summary> /// 离开 /// </summary> public static string QQLiKai = " VER=1.4&CON=1&CMD=Change_Stat&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&ST=30\r\n " ; /// <summary> /// 在线 /// </summary> public static string QQZaiXian = " VER=1.4&CON=1&CMD=Change_Stat&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&ST=10\r\n " ; /// <summary> /// 注销 /// </summary> public static string QQZhuXiao = " VER=1.4&CON=1&CMD=Logout&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382\r\n " ; /// <summary> /// 获取取QQ在线好友 /// </summary> public static string QQZaiXianHaoYou = " VER=1.4&CON=1&CMD=Query_Stat2&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&CM=2&UN=0\r\n " ; /// <summary> /// 发送消息 /// </summary> public static string QQSentMessage = " VER=1.4&CON=1&CMD=CLTMSG&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&UN=HaoYou&MG=Message\r\n " ; /// <summary> /// 查看好友资料 /// </summary> public static string QQHaoYouZiLiao = " VER=1.4&CON=1&CMD=GetInfo&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&LV=2&UN=HaoYou\r\n " ; /// <summary> /// 加好友 /// </summary> public static string QQJiaHaoYou = " VER=1.4&CON=1&CMD=AddToList&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&UN=HaoYou\r\n " ; /// <summary> /// 验证好友信息 /// </summary> public static string QQYanZhengHaoYou = " VER=1.4&CON=1&CMD=Ack_AddToList&SEQ=QQSeq&UIN=QQNumber&SID=&XP=C4CA4238A0B92382&UN=HaoYou&CD=2&RS=YanZheng\r\n " ; /// <summary> /// 转换密码为MD5 /// </summary> /// <param name="toCryString"></param> /// <returns></returns> public static string MD5( string toCryString) { System.Security.Cryptography.MD5CryptoServiceProvider hashmd5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); return BitConverter.ToString(hashmd5.ComputeHash(Encoding.Default.GetBytes(toCryString))).Replace( " - " , "" ).ToLower(); } } public class QQ { public string QQNumber = null ; public string QQPassword = null ; public string QQZhuangTai = null ; public enum QQzhuangtai { 在线 = 1 , 隐身, 离线 } public void User( string number, string password) { this .QQNumber = number; this .QQPassword = password; } /// <summary> /// QQ登录 /// </summary> /// <returns></returns> public Byte[] Login() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string PasswordMD5 = ( this .QQPassword); string LoginString= Helper_QQ.QQLogin.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber).Replace( " QQPassword " , PasswordMD5); return System.Text.Encoding.UTF8.GetBytes(LoginString); } /// <summary> /// 验证码 /// </summary> /// <param name="yanzheng"></param> /// <returns></returns> public Byte[] YanZheng( string yanzheng) { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string yz = Helper_QQ.QQYanZheng.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber).Replace( " YanZhengMa " , yanzheng); return System.Text.Encoding.UTF8.GetBytes(yz); } /// <summary> /// 隐身 /// </summary> /// <returns></returns> public Byte[] YinShen() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string ys = Helper_QQ.QQYinShen.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber); return System.Text.Encoding.UTF8.GetBytes(ys); } /// <summary> /// 离开 /// </summary> /// <returns></returns> public Byte[] LiKai() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string lk = Helper_QQ.QQLiKai.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber); return System.Text.Encoding.UTF8.GetBytes(lk); } /// <summary> /// 在线 /// </summary> /// <returns></returns> public Byte[] ZaiXian() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string zx = Helper_QQ.QQZaiXian.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber); return System.Text.Encoding.UTF8.GetBytes(zx); } /// <summary> /// 注销 /// </summary> /// <returns></returns> public Byte[] ZhuXiao() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string zx = Helper_QQ.QQZhuXiao.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber); return System.Text.Encoding.UTF8.GetBytes(zx); } /// <summary> /// 获取在线好友 /// </summary> /// <param name="ZaiXianHaoYou"></param> /// <returns></returns> public Byte[] ZaiXianHaoYou() { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string zxhy = Helper_QQ.QQZaiXianHaoYou.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber); return System.Text.Encoding.UTF8.GetBytes(zxhy); } /// <summary> /// 发送消息 /// </summary> /// <param name="SentMessage"></param> /// <returns></returns> public Byte[] SentMessage( string qqNumber, string message) { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string sm = Helper_QQ.QQSentMessage.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber).Replace( " HaoYou " , qqNumber).Replace( " Message " , message); return System.Text.Encoding.UTF8.GetBytes(sm); } /// <summary> /// 获取好友资料 /// </summary> /// <param name="qqNumber"></param> /// <param name="message"></param> /// <returns></returns> public Byte[] HaoYouZiLiao( string qqNumber) { string SEQ = DateTime.Now.Ticks.ToString().Substring( 7 , 7 ); string sm = Helper_QQ.QQHaoYouZiLiao.Replace( " QQSeq " , SEQ).Replace( " QQNumber " , this .QQNumber).Replace( " HaoYou " , qqNumber); return System.Text.Encoding.UTF8.GetBytes(sm); } } }
这个是socket,感觉很垃圾的自己该,反正我现在感觉以前写的代码都很垃圾
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Threading; using System.Net.Sockets; namespace JI { class Helper_Socket { public Thread tClient = null ; public IPEndPoint pClient = null ; public Socket sClient = null ; public NetworkStream nsClient = null ; public bool m_bConnectedClient = false ; public event EventHandler RecivedMessage; public string message; protected virtual void OnRecivedMessage() { var handler = RecivedMessage; if (handler != null ) { handler( this , EventArgs.Empty); } } public bool Connect(IPEndPoint server) { pClient = server; // new IPEndPoint(IPAddress.Parse("58.60.12.177"), 14000); sClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sClient.Connect(pClient); if (sClient.Connected) { nsClient = new NetworkStream(sClient); tClient = new Thread( new ThreadStart( this .ThreadListenClient)); tClient.Start(); m_bConnectedClient = true ; return true ; } return false ; } public bool Sent( byte [] sentArray) { int length = sentArray.Length; if (sClient.Connected) { int sentNum = sClient.Send(sentArray, 0 , length, SocketFlags.None); if (sentNum == length) { return true ; } else { return false ; } } return false ; } public void Close() { sClient.Close(); } public void ThreadListenClient() { string tmp = string .Empty; while (m_bConnectedClient) { try { byte [] data = new byte [ 2056 ]; sClient.Receive(data); var messagetemp = Encoding.UTF8.GetString(data).Trim(); message = messagetemp.Replace( " \0 " , "" ); if (message.Length > 0 ) { OnRecivedMessage(); } } catch { } } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Threading; using System.Net.Sockets; namespace JI { class Helper_Socket { public Thread tClient = null ; public IPEndPoint pClient = null ; public Socket sClient = null ; public NetworkStream nsClient = null ; public bool m_bConnectedClient = false ; public event EventHandler RecivedMessage; public string message; protected virtual void OnRecivedMessage() { var handler = RecivedMessage; if (handler != null ) { handler( this , EventArgs.Empty); } } public bool Connect(IPEndPoint server) { pClient = server; // new IPEndPoint(IPAddress.Parse("58.60.12.177"), 14000); sClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sClient.Connect(pClient); if (sClient.Connected) { nsClient = new NetworkStream(sClient); tClient = new Thread( new ThreadStart( this .ThreadListenClient)); tClient.Start(); m_bConnectedClient = true ; return true ; } return false ; } public bool Sent( byte [] sentArray) { int length = sentArray.Length; if (sClient.Connected) { int sentNum = sClient.Send(sentArray, 0 , length, SocketFlags.None); if (sentNum == length) { return true ; } else { return false ; } } return false ; } public void Close() { sClient.Close(); } public void ThreadListenClient() { string tmp = string .Empty; while (m_bConnectedClient) { try { byte [] data = new byte [ 2056 ]; sClient.Receive(data); var messagetemp = Encoding.UTF8.GetString(data).Trim(); message = messagetemp.Replace( " \0 " , "" ); if (message.Length > 0 ) { OnRecivedMessage(); } } catch { } } } } }
这个是帮助类,有抄袭的嫌疑,忘了抄谁的了,原作见谅
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Media.Imaging; using System.IO; using System.Windows.Media; namespace JI { class Helper { /// <summary> /// 字符串转16进制字节数组 /// </summary> /// <param name="hexString"></param> /// <returns></returns> public static byte [] strToToHexByte( string hexString) { hexString = hexString.Replace( " " , "" ); if ((hexString.Length % 2 ) != 0 ) hexString += " " ; byte [] returnBytes = new byte [hexString.Length / 2 ]; for ( int i = 0 ; i < returnBytes.Length; i++ ) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2 , 2 ), 16 ); return returnBytes; } /// <summary> /// 字节数组转16进制字符串 /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static string byteToHexStr( byte [] bytes) { string returnStr = "" ; if (bytes != null ) { for ( int i = 0 ; i < bytes.Length; i++ ) { returnStr += bytes[i].ToString( " X2 " ); } } return returnStr; } /// <summary> /// 从汉字转换到16进制 /// </summary> /// <param name="s"></param> /// <param name="charset"> 编码,如"utf-8","gb2312" </param> /// <param name="fenge"> 是否每字符用逗号分隔 </param> /// <returns></returns> public static string ToHex( string s, string charset, bool fenge) { if ((s.Length % 2 ) != 0 ) { s += " " ; // 空格 // throw new ArgumentException("s is not valid chinese string!"); } System.Text.Encoding chs = System.Text.Encoding.GetEncoding(charset); byte [] bytes = chs.GetBytes(s); string str = "" ; for ( int i = 0 ; i < bytes.Length; i++ ) { str += string .Format( " {0:X} " , bytes[i]); if (fenge && (i != bytes.Length - 1 )) { str += string .Format( " {0} " , " , " ); } } return str.ToLower(); } /// <summary> /// 从16进制转换成汉字 /// </summary> /// <param name="hex"></param> /// <param name="charset"> 编码,如"utf-8","gb2312" </param> /// <returns></returns> public static string UnHex( string hex, string charset) { if (hex == null ) throw new ArgumentNullException( " hex " ); hex = hex.Replace( " , " , "" ); hex = hex.Replace( " /n " , "" ); hex = hex.Replace( " // " , "" ); hex = hex.Replace( " " , "" ); if (hex.Length % 2 != 0 ) { hex += " 20 " ; // 空格 } // 需要将 hex 转换成 byte 数组。 byte [] bytes = new byte [hex.Length / 2 ]; for ( int i = 0 ; i < bytes.Length; i++ ) { try { // 每两个字符是一个 byte。 bytes[i] = byte .Parse(hex.Substring(i * 2 , 2 ), System.Globalization.NumberStyles.HexNumber); } catch { // Rethrow an exception with custom message. throw new ArgumentException( " hex is not a valid hex number! " , " hex " ); } } System.Text.Encoding chs = System.Text.Encoding.GetEncoding(charset); return chs.GetString(bytes); } /// <summary> /// 保存图片 /// </summary> /// <param name="bitmap"></param> public static void SaveImageCapture(BitmapSource bitmap) { JpegBitmapEncoder encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bitmap)); encoder.QualityLevel = 100 ; Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); dlg.FileName = " Image " ; dlg.DefaultExt = " .Jpg " ; dlg.Filter = " Image (.jpg)|*.jpg " ; Nullable < bool > result = dlg.ShowDialog(); if (result == true ) { string filename = dlg.FileName; FileStream fstream = new FileStream(filename, FileMode.Create); encoder.Save(fstream); fstream.Close(); } } /// <summary> /// 打开文件 /// </summary> /// <returns></returns> public static string Search() { string filPath = string .Empty; System.Windows.Forms.OpenFileDialog openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); openFileDialog1.Filter = " 图片文件(*.jpg,*.jpeg,*.png,*.bmp)|*.jpg;*.jpeg;*.png;*.bmp " ; openFileDialog1.FilterIndex = 1 ; openFileDialog1.RestoreDirectory = true ; if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { filPath = openFileDialog1.FileName; } else { } return filPath; } /// <summary> /// 打开图片 /// </summary> /// <param name="bitmap"></param> /// <returns></returns> public static ImageSource ToConBmpToImSour(System.Drawing.Bitmap bitmap) { MemoryStream stream = new MemoryStream(); bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); ImageBrush imageBrush = new ImageBrush(); ImageSourceConverter imageSourceConverter = new ImageSourceConverter(); imageBrush.ImageSource = (ImageSource)imageSourceConverter.ConvertFrom(stream); return imageBrush.ImageSource; } /// <summary> /// 创建Image控件 /// </summary> /// <param name="imageSource"></param> /// <returns></returns> public static System.Windows.Controls.Image CreatImage(ImageSource imageSource) { System.Windows.Controls.Image image = new System.Windows.Controls.Image(); image.Source = imageSource; image.Stretch = System.Windows.Media.Stretch.Fill; return image; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Media.Imaging; using System.IO; using System.Windows.Media; namespace JI { class Helper { /// <summary> /// 字符串转16进制字节数组 /// </summary> /// <param name="hexString"></param> /// <returns></returns> public static byte [] strToToHexByte( string hexString) { hexString = hexString.Replace( " " , "" ); if ((hexString.Length % 2 ) != 0 ) hexString += " " ; byte [] returnBytes = new byte [hexString.Length / 2 ]; for ( int i = 0 ; i < returnBytes.Length; i++ ) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2 , 2 ), 16 ); return returnBytes; } /// <summary> /// 字节数组转16进制字符串 /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static string byteToHexStr( byte [] bytes) { string returnStr = "" ; if (bytes != null ) { for ( int i = 0 ; i < bytes.Length; i++ ) { returnStr += bytes[i].ToString( " X2 " ); } } return returnStr; } /// <summary> /// 从汉字转换到16进制 /// </summary> /// <param name="s"></param> /// <param name="charset"> 编码,如"utf-8","gb2312" </param> /// <param name="fenge"> 是否每字符用逗号分隔 </param> /// <returns></returns> public static string ToHex( string s, string charset, bool fenge) { if ((s.Length % 2 ) != 0 ) { s += " " ; // 空格 // throw new ArgumentException("s is not valid chinese string!"); } System.Text.Encoding chs = System.Text.Encoding.GetEncoding(charset); byte [] bytes = chs.GetBytes(s); string str = "" ; for ( int i = 0 ; i < bytes.Length; i++ ) { str += string .Format( " {0:X} " , bytes[i]); if (fenge && (i != bytes.Length - 1 )) { str += string .Format( " {0} " , " , " ); } } return str.ToLower(); } /// <summary> /// 从16进制转换成汉字 /// </summary> /// <param name="hex"></param> /// <param name="charset"> 编码,如"utf-8","gb2312" </param> /// <returns></returns> public static string UnHex( string hex, string charset) { if (hex == null ) throw new ArgumentNullException( " hex " ); hex = hex.Replace( " , " , "" ); hex = hex.Replace( " /n " , "" ); hex = hex.Replace( " // " , "" ); hex = hex.Replace( " " , "" ); if (hex.Length % 2 != 0 ) { hex += " 20 " ; // 空格 } // 需要将 hex 转换成 byte 数组。 byte [] bytes = new byte [hex.Length / 2 ]; for ( int i = 0 ; i < bytes.Length; i++ ) { try { // 每两个字符是一个 byte。 bytes[i] = byte .Parse(hex.Substring(i * 2 , 2 ), System.Globalization.NumberStyles.HexNumber); } catch { // Rethrow an exception with custom message. throw new ArgumentException( " hex is not a valid hex number! " , " hex " ); } } System.Text.Encoding chs = System.Text.Encoding.GetEncoding(charset); return chs.GetString(bytes); } /// <summary> /// 保存图片 /// </summary> /// <param name="bitmap"></param> public static void SaveImageCapture(BitmapSource bitmap) { JpegBitmapEncoder encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bitmap)); encoder.QualityLevel = 100 ; Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); dlg.FileName = " Image " ; dlg.DefaultExt = " .Jpg " ; dlg.Filter = " Image (.jpg)|*.jpg " ; Nullable < bool > result = dlg.ShowDialog(); if (result == true ) { string filename = dlg.FileName; FileStream fstream = new FileStream(filename, FileMode.Create); encoder.Save(fstream); fstream.Close(); } } /// <summary> /// 打开文件 /// </summary> /// <returns></returns> public static string Search() { string filPath = string .Empty; System.Windows.Forms.OpenFileDialog openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); openFileDialog1.Filter = " 图片文件(*.jpg,*.jpeg,*.png,*.bmp)|*.jpg;*.jpeg;*.png;*.bmp " ; openFileDialog1.FilterIndex = 1 ; openFileDialog1.RestoreDirectory = true ; if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { filPath = openFileDialog1.FileName; } else { } return filPath; } /// <summary> /// 打开图片 /// </summary> /// <param name="bitmap"></param> /// <returns></returns> public static ImageSource ToConBmpToImSour(System.Drawing.Bitmap bitmap) { MemoryStream stream = new MemoryStream(); bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); ImageBrush imageBrush = new ImageBrush(); ImageSourceConverter imageSourceConverter = new ImageSourceConverter(); imageBrush.ImageSource = (ImageSource)imageSourceConverter.ConvertFrom(stream); return imageBrush.ImageSource; } /// <summary> /// 创建Image控件 /// </summary> /// <param name="imageSource"></param> /// <returns></returns> public static System.Windows.Controls.Image CreatImage(ImageSource imageSource) { System.Windows.Controls.Image image = new System.Windows.Controls.Image(); image.Source = imageSource; image.Stretch = System.Windows.Media.Stretch.Fill; return image; } } }
这个是主界面处理,我那时候还不懂得封装和拆分,也不知道什么分层,全把wpf当作winform使了,原谅一个初学者的无知……
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; using JI; using System.Net; using System.IO; namespace QQ__迹 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { #region 参数设置 QQ qq = null ; string re = string .Empty; Helper_Socket socket = null ; double width = 0 ; double height = 0 ; WaterEffect effect; Point point; int a = 0 ; const int shuxin = 1000 * 30 ; List < string > HaoYouListTemp = new List< string > (); List < string > HaoYouListZiLiao = new List< string > (); int hyconut = 0 ; Image image = new Image(); int xianshinum = 1 ; #endregion public MainWindow() { InitializeComponent(); ToBindTimerEvent(); this .Loaded += new RoutedEventHandler(MainWindow_Loaded); } private void MainWindow_Loaded( object sender, RoutedEventArgs e) { XianShi( 0 ); user.Text = " 12345678 " ; psw.Password = " 12345678 " ; effect = new WaterEffect( 120 , 100 ); Media.Child = image; BitmapImage bi3 = new BitmapImage(); bi3.BeginInit(); bi3.UriSource = new Uri( " IMAG0460.jpg " , UriKind.Relative); bi3.EndInit(); image.Stretch = Stretch.Fill; image.Source = bi3; Media.Effect = effect; } public void ToBindTimerEvent() { DispatcherTimer timer = new DispatcherTimer { Interval = new TimeSpan( 0 , 0 , 0 , 0 , 1 ) }; timer.Tick += new EventHandler(timer_Tick); timer.Start(); } public void timer_Tick( object sender, EventArgs e) { a ++ ; if (a == shuxin) { if (qq != null && socket.m_bConnectedClient) { socket.Sent(qq.ZaiXian()); } a = 0 ; } } protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { if (socket != null ) { socket.m_bConnectedClient = false ; socket.Close(); } base .OnClosing(e); } private void dl_MouseDown( object sender, MouseButtonEventArgs e) { socket = new Helper_Socket(); IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse( " 58.60.12.177 " ), 14000 ); var con = socket.Connect(serverEndPoint); if (con) { socket.RecivedMessage += new EventHandler(socket_RecivedMessage); } else { MessageBox.Show( " 请检查网络联通性 " , " 登录失败 " ); this .Close(); } string num = user.Text.Trim(); string pswd = JI.Helper_QQ.MD5(psw.Password); qq = new QQ(); qq.User(num, pswd); bool chack = false ; if (socket.m_bConnectedClient) { chack = socket.Sent(qq.Login()); } } private void socket_RecivedMessage( object sender, EventArgs e) { var messageSocket = (Helper_Socket)sender; try { #region 登录处理 #region 验证码处理 if (messageSocket.message.Contains( " CMD=VERIFYCODE " ) && !messageSocket.message.Contains( " RE=1 " ) && !messageSocket.message.Contains( " RS=0 " )) { // 验证码处理 string imageStrem = (messageSocket.message.Split( new string [] { " &VC= " }, StringSplitOptions.RemoveEmptyEntries))[ 1 ]; // (new char[] { '&', 'V', 'C' }); var imageByte = (imageStrem.Split( new string [] { " \r\n " }, StringSplitOptions.RemoveEmptyEntries))[ 0 ]; using (MemoryStream ms = new MemoryStream(Helper.strToToHexByte(imageByte.Trim()))) { BitmapDecoder decoder = BitmapDecoder.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); var img = decoder.Frames[ 0 ]; ImageSourceConverter imageSourceConverter = new ImageSourceConverter(); img.Freeze(); Dispatcher.Invoke((Action) delegate { griddl.Visibility = System.Windows.Visibility.Collapsed; gridyz.Opacity = 1 ; gridyz.Visibility = System.Windows.Visibility.Visible; imageYanZheng.Source = img; // Helper.SaveImageCapture((BitmapSource)imageSourceConverter.ConvertFrom(ms)); }); } } #endregion #region 登录成功 else if (messageSocket.message.Contains( " RS=0 " ) && messageSocket.message.Contains( " CMD=Login " )) { Dispatcher.Invoke((Action) delegate { gridyz.Visibility = System.Windows.Visibility.Collapsed; griddl.Visibility = System.Windows.Visibility.Collapsed; XianShi( 1 ); loginQQ.Content = qq.QQNumber; qq.QQZhuangTai = (QQ.QQzhuangtai.在线).ToString(); ztQQ.Content = qq.QQZhuangTai; }); if (qq != null && socket.m_bConnectedClient) { HaoYouListTemp.Clear(); HaoYouListZiLiao.Clear(); socket.Sent(qq.ZaiXianHaoYou()); } } #endregion #region 密码错误 else if (messageSocket.message.Contains( " RA=Password error! " )) { MessageBox.Show( " 密码错误 " , " 登录失败 " ); Dispatcher.Invoke((Action) delegate { gridyz.Visibility = System.Windows.Visibility.Collapsed; griddl.Visibility = System.Windows.Visibility.Visible; psw.Password = "" ; }); } #endregion #endregion #region 消息处理 #region 获取在线好友 if (messageSocket.message.Contains( " CMD=QUERY_STAT2 " ) && messageSocket.message.Contains( " RES=0 " )) { var qqList = messageSocket.message.Split( new string [] { " &UN= " }, 10 , StringSplitOptions.RemoveEmptyEntries); string ListTemp = string .Empty; foreach ( var list in qqList) { if (!list.Contains( " &MG= " )) { ListTemp = (list.Replace( " & " , "" )); } } var haoyouList = (ListTemp.Split(( new string [] { " \r\n " }), StringSplitOptions.RemoveEmptyEntries))[ 0 ].Split( new char [] { ' , ' }, StringSplitOptions.RemoveEmptyEntries); if (qq != null && socket.m_bConnectedClient) { HaoYouListTemp.AddRange(haoyouList); HaoYouListTemp.ForEach(haoy => { socket.Sent(qq.HaoYouZiLiao(haoy)); }); } /// /好友列表 Dispatcher.Invoke((Action) delegate { listBoxhyl.ItemsSource = HaoYouListTemp; }); } #endregion #region 状态更改 if (messageSocket.message.Contains( " CMD=Change_Stat " ) && messageSocket.message.Contains( " RES=0 " )) // && messageSocket.message.Contains("UIN=" + qq.QQNumber)) { Dispatcher.Invoke((Action) delegate { ztQQ.Content = qq.QQZhuangTai; }); } #endregion #region 系统消息 if (messageSocket.message.Contains( " CMD=Server_Msg " ) && messageSocket.message.Contains( " &MG= " ) && messageSocket.message.Contains( " RES=0 " )) // && messageSocket.message.Contains("UIN=" + qq.QQNumber)) { var msgList = messageSocket.message.Split(( new string [] { " \r\n " }), StringSplitOptions.RemoveEmptyEntries); List < string []> message = new List< string []> (); foreach ( var str in msgList) { message.Add(str.Split( new string [] { " &UN= " , " &MG= " }, StringSplitOptions.RemoveEmptyEntries)); } message.ForEach(s => { Dispatcher.Invoke((Action) delegate { if (s.Length > 2 ) { var name = string .Empty; HaoYouListZiLiao.ForEach(who => { if (who.Contains(s[ 1 ].ToString())) { name = who; } }); textBlockr.Text += name + NowTime() + " 对我说: " + s[ 2 ].ToString() + System.Environment.NewLine; } }); }); } #endregion #region 好友资料 // if (messageSocket.message.Contains("CMD=GETINFO") && messageSocket.message.Contains("&UN=") && messageSocket.message.Contains("&NK=") && messageSocket.message.Contains("&RES=0&")) // { // var haoyouziliao = messageSocket.message.Split((new string[] { "&UN=", "&NK=", "&PR=", "\r\n" }), StringSplitOptions.RemoveEmptyEntries); // // Dispatcher.Invoke((Action)delegate // // { // HaoYouListTemp.ForEach(hyzl => // { // if (hyzl == haoyouziliao[1]) // { // hyzl += " " + haoyouziliao[2]; // HaoYouListZiLiao.Add(hyzl); // } // }); // hyconut++; // if (hyconut == HaoYouListTemp.Count) // { // hyconut = 0; // listBoxhyl.ItemsSource = HaoYouListZiLiao; // } // // }); // } #endregion #endregion } catch { } } private void tc_MouseDown( object sender, MouseButtonEventArgs e) { this .Close(); } private void fsyz_MouseDown( object sender, MouseButtonEventArgs e) { var yanzheng = qq.YanZheng(yzm.Text.Trim()); if (socket.m_bConnectedClient) { socket.Sent(yanzheng); } } private void sent_MouseDown( object sender, MouseButtonEventArgs e) { string cz = caozuo.Text; string msg = textBlocks.Text; var who = textBox1.Text.Trim(); if (qq != null && socket.m_bConnectedClient) { if (cz == " 发送 " && msg.Length > 0 && who.Length > 0 ) { string sentto = "" ; try {sentto = textBox1.Text.Remove( 10 ).Trim();} catch { sentto = textBox1.Text.Trim(); } if (sentto.Length > 0 ) { socket.Sent(qq.SentMessage(sentto, msg)); textBlockr.Text += " 我 " + NowTime() + " 对 " + who + " 说: " + msg + System.Environment.NewLine; textBlocks.Text = "" ; } } if (cz == " 退出 " ) { this .Close(); } if (cz == (QQ.QQzhuangtai.隐身).ToString()) { socket.Sent(qq.YinShen()); qq.QQZhuangTai = cz; } else if (cz == (QQ.QQzhuangtai.离线).ToString()) { socket.Sent(qq.LiKai()); qq.QQZhuangTai = cz; } else if (cz == (QQ.QQzhuangtai.在线).ToString()) { socket.Sent(qq.ZaiXian()); qq.QQZhuangTai = cz; } } } private void listBoxhyl_SelectionChanged( object sender, SelectionChangedEventArgs e) { textBox1.Text = listBoxhyl.SelectedValue.ToString(); } private void sb_MouseDown( object sender, MouseButtonEventArgs e) { point = e.GetPosition(MainGrid); width = Media.ActualWidth; height = Media.ActualHeight; if (width > 0 && height > 0 ) { effect.Drop(( float )(point.X / width), ( float )(point.Y / height)); } } private void jhy_MouseDown( object sender, MouseButtonEventArgs e) { var sentto = textBox1.Text.Trim(); if (qq != null && socket.m_bConnectedClient && sentto.Length > 0 ) { socket.Sent(qq.HaoYouZiLiao(sentto)); } } private void sx_MouseDown( object sender, MouseButtonEventArgs e) { if (qq != null && socket.m_bConnectedClient) { HaoYouListTemp.Clear(); HaoYouListZiLiao.Clear(); socket.Sent(qq.ZaiXianHaoYou()); } } private void Window_PreviewKeyDown( object sender, KeyEventArgs e) { try { #region 换图 bool isShift = false ; string path = string .Empty; System.Windows.Input.KeyboardDevice kd = e.KeyboardDevice; if ((kd.GetKeyStates(Key.LeftCtrl) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.B) & System.Windows.Input.KeyStates.Down) > 0 || (kd.GetKeyStates(Key.RightCtrl) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.B) & System.Windows.Input.KeyStates.Down) > 0 ) { path = Helper.Search(); isShift = true ; } if (isShift && path.Length > 0 ) { image.Source = Helper.ToConBmpToImSour( new System.Drawing.Bitmap(path)); isShift = false ; } #endregion #region 隐藏 bool boolyincang= false ; if ((kd.GetKeyStates(Key.LeftCtrl) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.LeftAlt) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.Z) & System.Windows.Input.KeyStates.Down) > 0 ) { boolyincang = true ; xianshinum *= - 1 ; } if (boolyincang) { XianShi(xianshinum); boolyincang = false ; } #endregion } catch { } } private void textBlockr_TextChanged( object sender, TextChangedEventArgs e) { textBlocks.Focus(); } public string NowTime() { return DateTime.Now.ToString().Split( new string [] { " " }, StringSplitOptions.RemoveEmptyEntries)[ 1 ]; } private void textBlocks_PreviewKeyDown( object sender, KeyEventArgs e) { bool isShift = false ; System.Windows.Input.KeyboardDevice kd = e.KeyboardDevice; if ((kd.GetKeyStates(Key.RightCtrl) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.Enter) & System.Windows.Input.KeyStates.Down) > 0 ) { isShift = true ; } if ((kd.GetKeyStates(Key.LeftAlt) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.S) & System.Windows.Input.KeyStates.Down) > 0 ) { isShift = true ; } if (isShift) { caozuo.Text = " 发送 " ; string cz = caozuo.Text; string msg = textBlocks.Text; var who = textBox1.Text.Trim(); if (qq != null && socket.m_bConnectedClient) { if (cz == " 发送 " && msg.Length > 0 && who.Length > 0 ) { var sentto = textBox1.Text.Remove( 10 ).Trim(); if (sentto.Length > 0 ) { socket.Sent(qq.SentMessage(sentto, msg)); textBlockr.Text += " 我 " + NowTime() + " 对 " + who + " 说: " + msg + System.Environment.NewLine; textBlocks.Text = "" ; } } } isShift = false ; } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; using JI; using System.Net; using System.IO; namespace QQ__迹 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { #region 参数设置 QQ qq = null ; string re = string .Empty; Helper_Socket socket = null ; double width = 0 ; double height = 0 ; WaterEffect effect; Point point; int a = 0 ; const int shuxin = 1000 * 30 ; List < string > HaoYouListTemp = new List< string > (); List < string > HaoYouListZiLiao = new List< string > (); int hyconut = 0 ; Image image = new Image(); int xianshinum = 1 ; #endregion public MainWindow() { InitializeComponent(); ToBindTimerEvent(); this .Loaded += new RoutedEventHandler(MainWindow_Loaded); } private void MainWindow_Loaded( object sender, RoutedEventArgs e) { XianShi( 0 ); user.Text = " 12345678 " ; psw.Password = " 12345678 " ; effect = new WaterEffect( 120 , 100 ); Media.Child = image; BitmapImage bi3 = new BitmapImage(); bi3.BeginInit(); bi3.UriSource = new Uri( " IMAG0460.jpg " , UriKind.Relative); bi3.EndInit(); image.Stretch = Stretch.Fill; image.Source = bi3; Media.Effect = effect; } public void ToBindTimerEvent() { DispatcherTimer timer = new DispatcherTimer { Interval = new TimeSpan( 0 , 0 , 0 , 0 , 1 ) }; timer.Tick += new EventHandler(timer_Tick); timer.Start(); } public void timer_Tick( object sender, EventArgs e) { a ++ ; if (a == shuxin) { if (qq != null && socket.m_bConnectedClient) { socket.Sent(qq.ZaiXian()); } a = 0 ; } } protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { if (socket != null ) { socket.m_bConnectedClient = false ; socket.Close(); } base .OnClosing(e); } private void dl_MouseDown( object sender, MouseButtonEventArgs e) { socket = new Helper_Socket(); IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse( " 58.60.12.177 " ), 14000 ); var con = socket.Connect(serverEndPoint); if (con) { socket.RecivedMessage += new EventHandler(socket_RecivedMessage); } else { MessageBox.Show( " 请检查网络联通性 " , " 登录失败 " ); this .Close(); } string num = user.Text.Trim(); string pswd = JI.Helper_QQ.MD5(psw.Password); qq = new QQ(); qq.User(num, pswd); bool chack = false ; if (socket.m_bConnectedClient) { chack = socket.Sent(qq.Login()); } } private void socket_RecivedMessage( object sender, EventArgs e) { var messageSocket = (Helper_Socket)sender; try { #region 登录处理 #region 验证码处理 if (messageSocket.message.Contains( " CMD=VERIFYCODE " ) && !messageSocket.message.Contains( " RE=1 " ) && !messageSocket.message.Contains( " RS=0 " )) { // 验证码处理 string imageStrem = (messageSocket.message.Split( new string [] { " &VC= " }, StringSplitOptions.RemoveEmptyEntries))[ 1 ]; // (new char[] { '&', 'V', 'C' }); var imageByte = (imageStrem.Split( new string [] { " \r\n " }, StringSplitOptions.RemoveEmptyEntries))[ 0 ]; using (MemoryStream ms = new MemoryStream(Helper.strToToHexByte(imageByte.Trim()))) { BitmapDecoder decoder = BitmapDecoder.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); var img = decoder.Frames[ 0 ]; ImageSourceConverter imageSourceConverter = new ImageSourceConverter(); img.Freeze(); Dispatcher.Invoke((Action) delegate { griddl.Visibility = System.Windows.Visibility.Collapsed; gridyz.Opacity = 1 ; gridyz.Visibility = System.Windows.Visibility.Visible; imageYanZheng.Source = img; // Helper.SaveImageCapture((BitmapSource)imageSourceConverter.ConvertFrom(ms)); }); } } #endregion #region 登录成功 else if (messageSocket.message.Contains( " RS=0 " ) && messageSocket.message.Contains( " CMD=Login " )) { Dispatcher.Invoke((Action) delegate { gridyz.Visibility = System.Windows.Visibility.Collapsed; griddl.Visibility = System.Windows.Visibility.Collapsed; XianShi( 1 ); loginQQ.Content = qq.QQNumber; qq.QQZhuangTai = (QQ.QQzhuangtai.在线).ToString(); ztQQ.Content = qq.QQZhuangTai; }); if (qq != null && socket.m_bConnectedClient) { HaoYouListTemp.Clear(); HaoYouListZiLiao.Clear(); socket.Sent(qq.ZaiXianHaoYou()); } } #endregion #region 密码错误 else if (messageSocket.message.Contains( " RA=Password error! " )) { MessageBox.Show( " 密码错误 " , " 登录失败 " ); Dispatcher.Invoke((Action) delegate { gridyz.Visibility = System.Windows.Visibility.Collapsed; griddl.Visibility = System.Windows.Visibility.Visible; psw.Password = "" ; }); } #endregion #endregion #region 消息处理 #region 获取在线好友 if (messageSocket.message.Contains( " CMD=QUERY_STAT2 " ) && messageSocket.message.Contains( " RES=0 " )) { var qqList = messageSocket.message.Split( new string [] { " &UN= " }, 10 , StringSplitOptions.RemoveEmptyEntries); string ListTemp = string .Empty; foreach ( var list in qqList) { if (!list.Contains( " &MG= " )) { ListTemp = (list.Replace( " & " , "" )); } } var haoyouList = (ListTemp.Split(( new string [] { " \r\n " }), StringSplitOptions.RemoveEmptyEntries))[ 0 ].Split( new char [] { ' , ' }, StringSplitOptions.RemoveEmptyEntries); if (qq != null && socket.m_bConnectedClient) { HaoYouListTemp.AddRange(haoyouList); HaoYouListTemp.ForEach(haoy => { socket.Sent(qq.HaoYouZiLiao(haoy)); }); } /// /好友列表 Dispatcher.Invoke((Action) delegate { listBoxhyl.ItemsSource = HaoYouListTemp; }); } #endregion #region 状态更改 if (messageSocket.message.Contains( " CMD=Change_Stat " ) && messageSocket.message.Contains( " RES=0 " )) // && messageSocket.message.Contains("UIN=" + qq.QQNumber)) { Dispatcher.Invoke((Action) delegate { ztQQ.Content = qq.QQZhuangTai; }); } #endregion #region 系统消息 if (messageSocket.message.Contains( " CMD=Server_Msg " ) && messageSocket.message.Contains( " &MG= " ) && messageSocket.message.Contains( " RES=0 " )) // && messageSocket.message.Contains("UIN=" + qq.QQNumber)) { var msgList = messageSocket.message.Split(( new string [] { " \r\n " }), StringSplitOptions.RemoveEmptyEntries); List < string []> message = new List< string []> (); foreach ( var str in msgList) { message.Add(str.Split( new string [] { " &UN= " , " &MG= " }, StringSplitOptions.RemoveEmptyEntries)); } message.ForEach(s => { Dispatcher.Invoke((Action) delegate { if (s.Length > 2 ) { var name = string .Empty; HaoYouListZiLiao.ForEach(who => { if (who.Contains(s[ 1 ].ToString())) { name = who; } }); textBlockr.Text += name + NowTime() + " 对我说: " + s[ 2 ].ToString() + System.Environment.NewLine; } }); }); } #endregion #region 好友资料 // if (messageSocket.message.Contains("CMD=GETINFO") && messageSocket.message.Contains("&UN=") && messageSocket.message.Contains("&NK=") && messageSocket.message.Contains("&RES=0&")) // { // var haoyouziliao = messageSocket.message.Split((new string[] { "&UN=", "&NK=", "&PR=", "\r\n" }), StringSplitOptions.RemoveEmptyEntries); // // Dispatcher.Invoke((Action)delegate // // { // HaoYouListTemp.ForEach(hyzl => // { // if (hyzl == haoyouziliao[1]) // { // hyzl += " " + haoyouziliao[2]; // HaoYouListZiLiao.Add(hyzl); // } // }); // hyconut++; // if (hyconut == HaoYouListTemp.Count) // { // hyconut = 0; // listBoxhyl.ItemsSource = HaoYouListZiLiao; // } // // }); // } #endregion #endregion } catch { } } private void tc_MouseDown( object sender, MouseButtonEventArgs e) { this .Close(); } private void fsyz_MouseDown( object sender, MouseButtonEventArgs e) { var yanzheng = qq.YanZheng(yzm.Text.Trim()); if (socket.m_bConnectedClient) { socket.Sent(yanzheng); } } private void sent_MouseDown( object sender, MouseButtonEventArgs e) { string cz = caozuo.Text; string msg = textBlocks.Text; var who = textBox1.Text.Trim(); if (qq != null && socket.m_bConnectedClient) { if (cz == " 发送 " && msg.Length > 0 && who.Length > 0 ) { string sentto = "" ; try {sentto = textBox1.Text.Remove( 10 ).Trim();} catch { sentto = textBox1.Text.Trim(); } if (sentto.Length > 0 ) { socket.Sent(qq.SentMessage(sentto, msg)); textBlockr.Text += " 我 " + NowTime() + " 对 " + who + " 说: " + msg + System.Environment.NewLine; textBlocks.Text = "" ; } } if (cz == " 退出 " ) { this .Close(); } if (cz == (QQ.QQzhuangtai.隐身).ToString()) { socket.Sent(qq.YinShen()); qq.QQZhuangTai = cz; } else if (cz == (QQ.QQzhuangtai.离线).ToString()) { socket.Sent(qq.LiKai()); qq.QQZhuangTai = cz; } else if (cz == (QQ.QQzhuangtai.在线).ToString()) { socket.Sent(qq.ZaiXian()); qq.QQZhuangTai = cz; } } } private void listBoxhyl_SelectionChanged( object sender, SelectionChangedEventArgs e) { textBox1.Text = listBoxhyl.SelectedValue.ToString(); } private void sb_MouseDown( object sender, MouseButtonEventArgs e) { point = e.GetPosition(MainGrid); width = Media.ActualWidth; height = Media.ActualHeight; if (width > 0 && height > 0 ) { effect.Drop(( float )(point.X / width), ( float )(point.Y / height)); } } private void jhy_MouseDown( object sender, MouseButtonEventArgs e) { var sentto = textBox1.Text.Trim(); if (qq != null && socket.m_bConnectedClient && sentto.Length > 0 ) { socket.Sent(qq.HaoYouZiLiao(sentto)); } } private void sx_MouseDown( object sender, MouseButtonEventArgs e) { if (qq != null && socket.m_bConnectedClient) { HaoYouListTemp.Clear(); HaoYouListZiLiao.Clear(); socket.Sent(qq.ZaiXianHaoYou()); } } private void Window_PreviewKeyDown( object sender, KeyEventArgs e) { try { #region 换图 bool isShift = false ; string path = string .Empty; System.Windows.Input.KeyboardDevice kd = e.KeyboardDevice; if ((kd.GetKeyStates(Key.LeftCtrl) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.B) & System.Windows.Input.KeyStates.Down) > 0 || (kd.GetKeyStates(Key.RightCtrl) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.B) & System.Windows.Input.KeyStates.Down) > 0 ) { path = Helper.Search(); isShift = true ; } if (isShift && path.Length > 0 ) { image.Source = Helper.ToConBmpToImSour( new System.Drawing.Bitmap(path)); isShift = false ; } #endregion #region 隐藏 bool boolyincang= false ; if ((kd.GetKeyStates(Key.LeftCtrl) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.LeftAlt) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.Z) & System.Windows.Input.KeyStates.Down) > 0 ) { boolyincang = true ; xianshinum *= - 1 ; } if (boolyincang) { XianShi(xianshinum); boolyincang = false ; } #endregion } catch { } } private void textBlockr_TextChanged( object sender, TextChangedEventArgs e) { textBlocks.Focus(); } public string NowTime() { return DateTime.Now.ToString().Split( new string [] { " " }, StringSplitOptions.RemoveEmptyEntries)[ 1 ]; } private void textBlocks_PreviewKeyDown( object sender, KeyEventArgs e) { bool isShift = false ; System.Windows.Input.KeyboardDevice kd = e.KeyboardDevice; if ((kd.GetKeyStates(Key.RightCtrl) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.Enter) & System.Windows.Input.KeyStates.Down) > 0 ) { isShift = true ; } if ((kd.GetKeyStates(Key.LeftAlt) & System.Windows.Input.KeyStates.Down) > 0 && (kd.GetKeyStates(Key.S) & System.Windows.Input.KeyStates.Down) > 0 ) { isShift = true ; } if (isShift) { caozuo.Text = " 发送 " ; string cz = caozuo.Text; string msg = textBlocks.Text; var who = textBox1.Text.Trim(); if (qq != null && socket.m_bConnectedClient) { if (cz == " 发送 " && msg.Length > 0 && who.Length > 0 ) { var sentto = textBox1.Text.Remove( 10 ).Trim(); if (sentto.Length > 0 ) { socket.Sent(qq.SentMessage(sentto, msg)); textBlockr.Text += " 我 " + NowTime() + " 对 " + who + " 说: " + msg + System.Environment.NewLine; textBlocks.Text = "" ; } } } isShift = false ; } } } }
在这个版本的协议里面,协议都是通过明文发送的,可以直接通过拦截数据包去得到真实的消息信息,具体的做法是,下载一个Kjava10一下的手机QQ,然后装一个java模拟器,再然后找一个拦截网络包的工具,剩下的,你知道的……
以上就只这个手机QQ的全部实现了,其实有用的只有协议的部分,其他的代码都只是这样实现能成功的参考,完全当作垃圾也行……
9.18,钓鱼岛是中国的!!!
迹
分类: WPF-迹`@柳燕
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于基于kjavaQQ1.4版本协议的整理与重写的详细内容...