基于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://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于基于kjavaQQ1.4版本协议的整理与重写的详细内容...