版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yinbucheng/article/details/56006850
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Threading;
using System.Net;
using System.IO;
using System.Drawing;
using System.Xml;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Security.Cryptography;
using System.Collections;
namespace WxBean
{
class WxUtils
{
//自身数据
SelfBean selfData;
//联系人数据
List<FriendBean> friends;
//最近人数据
List<FriendBean> currentData;
string url_params="";
string message="";
string skey="";
string wxsid="";
string wxuin="";
string pass_ticket="";
string isgrayscale="";
string SyncKey="";
string syncCheckKey = "";
string uuid="";
string webwx_data_ticket="";
string pic_url = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetmsgimg";
string pic_url_qq = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetmsgimg";
string vidoe_url = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetvideo";
string vidoe_url_qq = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetvideo";
string cookie = "pgv_pvi=6709982208; webwxuvid=eac6c967c1de446c73c08acc64904546218df93ddfedacbf78aeb8150ab77b8f76c2abd11d782cf5b59b46ffb9ca213e; pgv_si=s1867008000; ";
private static WxUtils Instance = new WxUtils();
List<MessageBean> lastMessage = new List<MessageBean>();//上一次的数据记录
private WxUtils()
{
}
public static WxUtils getInstance()
{
return Instance;
}
//获取自身的信息
public SelfBean getSelfConfig()
{
return selfData;
}
//设置好友列表
public void setFriendContacts(List<FriendBean> friends)
{
this.friends = friends;
}
//获取好友列表
public List<FriendBean> getFriendContacts()
{
return friends;
}
//返回cookie给别人用
public string getCookieData()
{
return cookie;
}
//这个是获取二维码,保扩先获取uuid在
public Bitmap getWx_Code()
{
uuid = getUUID();
if (uuid == null)
return null;
return getQR_Code(uuid);
}
//获取UUID
private string getUUID()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=" + getTimeStap());
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
string[] results = retString.Split(new char[] { ';' });
if (results[0].IndexOf("200") > -1)
{
string tempReuslt = results[1];
tempReuslt = tempReuslt.Replace("window.QRLogin.uuid = ", "");
tempReuslt = tempReuslt.Replace("\"", "");
tempReuslt = tempReuslt.Replace(" ", "");
return tempReuslt;
}
else
{
return null;
}
}
//获取时间戳
public string getTimeStap()
{
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
DateTime nowTime = DateTime.Now;
long unixTime = (long)Math.Round((nowTime - startTime).TotalMilliseconds, MidpointRounding.AwayFromZero);
return unixTime + "";
}
//获取二维码(这获取的图片是200*200的)
private Bitmap getQR_Code(string param)
{
if (param == null)
return null;
string url = "https://login.weixin.qq.com/qrcode/" + param;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
Bitmap image = new Bitmap(myResponseStream);
myResponseStream.Close();
Bitmap result = GetImageThumb(image, new Size(200, 200));
return result;
}
//压缩图片
public Bitmap GetImageThumb(Bitmap mg, Size newSize)
{
double ratio = 0d;
double myThumbWidth = 0d;
double myThumbHeight = 0d;
int x = 0;
int y = 0;
Bitmap bp;
if ((mg.Width / Convert.ToDouble(newSize.Width)) > (mg.Height /
Convert.ToDouble(newSize.Height)))
ratio = Convert.ToDouble(mg.Width) / Convert.ToDouble(newSize.Width);
else
ratio = Convert.ToDouble(mg.Height) / Convert.ToDouble(newSize.Height);
myThumbHeight = Math.Ceiling(mg.Height / ratio);
myThumbWidth = Math.Ceiling(mg.Width / ratio);
Size thumbSize = new Size((int)newSize.Width, (int)newSize.Height);
bp = new Bitmap(newSize.Width, newSize.Height);
x = (newSize.Width - thumbSize.Width) / 2;
y = (newSize.Height - thumbSize.Height);
System.Drawing.Graphics g = Graphics.FromImage(bp);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
Rectangle rect = new Rectangle(x, y, thumbSize.Width, thumbSize.Height);
g.DrawImage(mg, rect, 0, 0, mg.Width, mg.Height, GraphicsUnit.Pixel);
return bp;
}
//等待验证
public string wait_login()
{
string url = "https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=0&uuid=" + uuid + "&_=" + getTimeStap();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
string[] result = retString.Split(new char[] { ';' });
string code_result = result[0].Replace("window.code=", "");
if (code_result != "200")
return null;
else
{
string url_result = result[1].Replace("window.redirect_uri=", "");
url_result = url_result.Replace("\"", "");
url_result = url_result.Replace(" ", "");
url_result = url_result.Replace("\n", "");
url_params = url_result;
return "success";
}
}
//获取cookie
private string getCookie()
{
//string url = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?" + url_params + "&fun=new";
string url = url_params + "&fun=new";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string data = response.GetResponseHeader("Set-Cookie");
string[] temps = Regex.Split(data, "GMT,", RegexOptions.IgnoreCase);
int len = temps.Length;
cookie += "wxpluginkey="+getTimeStap()+"; ";
for (int i = 0; i < len; i++)
{
string temp = temps[i];
int index = temp.IndexOf(";");
cookie += temp.Substring(0, index + 1) + " ";
}
cookie += "mm_lang=zh_CN; MM_WX_NOTIFY_STATE=1; MM_WX_SOUND_STATE=1";
decodeData_ticket(temps);
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
XmlDocument doc = new XmlDocument();
doc.LoadXml(retString);
XmlNode root = doc.SelectSingleNode("error");
message = root.SelectSingleNode("message").InnerText;
if (root.SelectSingleNode("skey")!=null)
skey = root.SelectSingleNode("skey").InnerText;
if (root.SelectSingleNode("wxsid")!=null)
wxsid = root.SelectSingleNode("wxsid").InnerText;
if (root.SelectSingleNode("wxuin")!=null)
wxuin = root.SelectSingleNode("wxuin").InnerText;
if (root.SelectSingleNode("pass_ticket")!=null)
pass_ticket = root.SelectSingleNode("pass_ticket").InnerText;
if (root.SelectSingleNode("isgrayscale")!=null)
isgrayscale = root.SelectSingleNode("isgrayscale").InnerText;
return retString;
}
//解析data_ticket数据
private void decodeData_ticket(string[] temps)
{
if (temps == null)
return;
int len = temps.Count();
if (len == 0)
return;
for (int i = 0; i < len; i++)
{
string temp = temps[i];
if (temp.IndexOf("webwx_data_ticket=") > -1)
{
int index = temp.IndexOf(";");
temp = temp.Substring(0, index);
int size = temp.Length;
webwx_data_ticket = temp.Substring(18, size - 18);
break;
}
}
}
//初始化微信数据
public void InitData()
{
getCookie();//获取cookie
initSelf();//初始化自身信息
friends = getContacts();//获取联系人
}
public void initSelf()
{
try
{
string ret = string.Empty;
string postUrl = "";
if (url_params.IndexOf("wx2.qq") > -1)
postUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=" + getTimeStap() + "&lang=zh_CN&pass_ticket=" + pass_ticket;
else
postUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=" + getTimeStap() + "&lang=zh_CN&pass_ticket=" + pass_ticket;
string paramData = "{\"BaseRequest\":{\"Uin\":\"" + wxuin + "\",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"}}";
byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
webReq.Headers["Cookie"] = cookie;
webReq.ContentType = "application/json; charset=UTF-8";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
decodeData(ret);
selfData = decodeSelf(ret);
currentData = decodeContacts(ret);
sr.Close();
response.Close();
newStream.Close();
}
catch (Exception)
{
return;
}
}
//获取自身信息
private SelfBean decodeSelf(string data)
{
JObject self = (JObject)JsonConvert.DeserializeObject(data);
string tempData = self["User"].ToString();
JObject tempSelf = (JObject)JsonConvert.DeserializeObject(tempData);
SelfBean bean = new SelfBean();
bean.Uin = tempSelf["Uin"].ToString();
bean.UserName = tempSelf["UserName"].ToString();
bean.NikeName = tempSelf["NickName"].ToString();
if (url_params.IndexOf("wx2.qq") > -1)
{
if (tempSelf["HeadImgUrl"].ToString() != null && tempSelf["HeadImgUrl"].ToString() != "")
bean.HeadImagUrl = "https://wx2.qq.com" + tempSelf["HeadImgUrl"].ToString();
}
else
{
if (tempSelf["HeadImgUrl"].ToString() != null && tempSelf["HeadImgUrl"].ToString() != "")
bean.HeadImagUrl = "https://wx.qq.com" + tempSelf["HeadImgUrl"].ToString();
}
bean.RemarkName = tempSelf["RemarkName"].ToString();
bean.PYInitial = tempSelf["PYInitial"].ToString();
bean.PYQuanPin = tempSelf["PYQuanPin"].ToString();
bean.RemarkPYQuanPin = tempSelf["RemarkPYQuanPin"].ToString();
bean.RemarkPYInitial = tempSelf["RemarkPYInitial"].ToString();
if (tempSelf["HideInputBarFlag"].ToString() != null && tempSelf["HideInputBarFlag"].ToString() != "")
bean.HideInputBarFlag = Convert.ToInt32(tempSelf["HideInputBarFlag"].ToString());
if (tempSelf["StarFriend"].ToString() != null && tempSelf["StarFriend"].ToString() != "")
bean.StarFriend = Convert.ToInt32(tempSelf["StarFriend"].ToString());
if (tempSelf["Sex"].ToString() != null && tempSelf["Sex"].ToString() != "")
bean.Sex = Convert.ToInt32(tempSelf["Sex"].ToString());
bean.Signature = tempSelf["Signature"].ToString();
if (tempSelf["AppAccountFlag"].ToString() != null && tempSelf["AppAccountFlag"].ToString() != "")
bean.AppAccountFlag = Convert.ToInt32(tempSelf["AppAccountFlag"].ToString());
if (tempSelf["VerifyFlag"].ToString() != null && tempSelf["VerifyFlag"].ToString() != "")
bean.VerifyFlag = Convert.ToInt32(tempSelf["VerifyFlag"].ToString());
if (tempSelf["ContactFlag"].ToString() != null && tempSelf["ContactFlag"].ToString() != "")
bean.ContactFlag = Convert.ToInt32(tempSelf["ContactFlag"].ToString());
if (tempSelf["WebWxPluginSwitch"].ToString() != null && tempSelf["WebWxPluginSwitch"].ToString() != "")
bean.WebWxPluginSwitch = Convert.ToInt32(tempSelf["WebWxPluginSwitch"].ToString());
if (tempSelf["HeadImgFlag"].ToString() != null && tempSelf["HeadImgFlag"].ToString() != "")
bean.HeadImgFlag = Convert.ToInt32(tempSelf["HeadImgFlag"].ToString());
if (tempSelf["SnsFlag"].ToString() != null && tempSelf["SnsFlag"].ToString() != "")
bean.SnsFlag = Convert.ToInt32(tempSelf["SnsFlag"].ToString());
return bean;
}
//解析数据
private void decodeData(string data)
{
JObject jo = (JObject)JsonConvert.DeserializeObject(data);
string zone = jo["SyncKey"].ToString();
string tempData = "";
tempData = zone.Replace("\r\n", "");
RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"[ ]{2,}", options);
SyncKey = regex.Replace(tempData, @"");
JObject jstr = (JObject)JsonConvert.DeserializeObject(zone);
string tempStr = jstr["List"].ToString();
JArray jarray = (JArray)JsonConvert.DeserializeObject(tempStr);
int count = jarray.Count();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++)
{
string keyStr = jarray[i].ToString();
JObject jkey = (JObject)JsonConvert.DeserializeObject(keyStr);
sb.Append(jkey["Key"].ToString()).Append("_").Append(jkey["Val"]);
if (i != count - 1)
{
sb.Append("|");
}
}
syncCheckKey = sb.ToString();
}
//获取联系人列表
public List<FriendBean> getContacts()
{
string ret = string.Empty;
string postUrl = "";
if (url_params.IndexOf("wx2.qq") > -1)
postUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact";
else
postUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact";
string paramData = "{\"BaseRequest\":{\"Uin\":\"" + wxuin + "\",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"}}";
byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
webReq.Headers["Cookie"] = cookie;
webReq.ContentType = "application/json; charset=UTF-8";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
List<FriendBean> result = decodeContacts(ret);
sr.Close();
response.Close();
newStream.Close();
return result;
}
//解析联系人数据
private List<FriendBean> decodeContacts(string json)
{
List<FriendBean> contacts = new List<FriendBean>();
JObject data = (JObject)JsonConvert.DeserializeObject(json);
JToken myData = data["MemberList"];
if (myData == null)
myData = data["ContactList"];
if (myData == null)
return null;
string tempData = myData.ToString();
JArray array = (JArray)JsonConvert.DeserializeObject(tempData);
int len = array.Count;
for (int i = 0; i < len; i++)
{
FriendBean bean = new FriendBean();
JToken temp = array[i];
bean.Uin = Convert.ToInt32(temp["Uin"].ToString());
bean.NickName = temp["NickName"].ToString();
bean.UserName = temp["UserName"].ToString();
if (url_params.IndexOf("wx2.qq") > -1)
{
if (temp["HeadImgUrl"].ToString() != null && temp["HeadImgUrl"].ToString() != "")
bean.HeadImgUrl = "https://wx2.qq.com" + temp["HeadImgUrl"].ToString();
}
else
{
if (temp["HeadImgUrl"].ToString() != null && temp["HeadImgUrl"].ToString() != "")
bean.HeadImgUrl = "https://wx.qq.com" + temp["HeadImgUrl"].ToString();
}
if (temp["ContactFlag"].ToString() != null && temp["ContactFlag"].ToString() != "")
bean.ContactFlag = Convert.ToInt32(temp["ContactFlag"].ToString());
if (temp["MemberCount"].ToString() != null && temp["MemberCount"].ToString() != "")
bean.MemberCount = Convert.ToInt32(temp["MemberCount"].ToString());
bean.RemarkName = temp["RemarkName"].ToString();
if (temp["Sex"].ToString() != null && temp["Sex"].ToString() != "")
bean.Sex = Convert.ToInt32(temp["Sex"].ToString());
bean.Signature = temp["Signature"].ToString();
bean.PYInitial = temp["PYInitial"].ToString();
bean.PYQuanPin = temp["PYQuanPin"].ToString();
if (temp["Statues"].ToString() != null && temp["Statues"].ToString() != "")
bean.Statues = Convert.ToInt32(temp["Statues"].ToString());
if (temp["AttrStatus"].ToString() != null && temp["AttrStatus"].ToString() != "")
{
string value = temp["AttrStatus"].ToString();
bean.AttrStatus = long.Parse(value);
}
bean.Province = temp["Province"].ToString();
bean.City = temp["City"].ToString();
if (temp["SnsFlag"].ToString() != null && temp["SnsFlag"].ToString() != "")
bean.SnsFlag = Convert.ToInt32(temp["SnsFlag"].ToString());
bean.DisplayName = temp["DisplayName"].ToString();
bean.KeyWord = temp["KeyWord"].ToString();
if (temp["ChatRoomId"].ToString() != null && temp["ChatRoomId"].ToString() != "")
bean.ChatRoomId = Convert.ToInt32(temp["ChatRoomId"].ToString());
bean.EncryChatRoomId = temp["EncryChatRoomId"].ToString();
contacts.Add(bean);
}
return contacts;
}
//获取最新消息数据
public List<MessageBean> getNewMsg()
{
List<MessageBean> tempData = getCurrentMsg();
if (tempData == null)
return null;
int count = tempData.Count();
if (count == 0)
return null;
if (lastMessage == null||lastMessage.Count()==0)
{
lastMessage = tempData;
return tempData;
}
List<MessageBean> result = checkNewData(tempData);
lastMessage = tempData;
return result;
}
private List<MessageBean> checkNewData(List<MessageBean> data)
{
if (data == null)
return null;
int count = data.Count();
if (count == 0)
return null;
List<MessageBean> tempData = new List<MessageBean>();
for (int i = 0; i < count; i++)
{
if (isNewOne(data[i]))
{
tempData.Add(data[i]);
}
}
return tempData;
}
private Boolean isNewOne(MessageBean data)
{
if (lastMessage == null)
return true;
int count = lastMessage.Count();
if (count == 0)
return true;
for (int i = 0; i < count; i++)
{
if (data.Equals(lastMessage[i]))
return false;
}
return true;
}
private List<MessageBean> getCurrentMsg()
{
int data = synCheckGet();
if (data == -1)
return null;
return getCurrentMsgData();
}
//按照谷歌抓取的信息
private int synCheckGet()
{
try
{
string url = "";
if (url_params.IndexOf("wx2.qq") > -1)
url = "https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=" + getTimeStap() + "&skey=" + skey + "&sid=" + wxsid + "&uin=" + wxuin + "&deviceid=e" + getTimeStap() + "&synckey="+syncCheckKey+"&_=" + getTimeStap();
else
url = "https://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=" + getTimeStap() + "&skey=" + skey + "&sid=" + wxsid + "&uin=" + wxuin + "&deviceid=e" + getTimeStap() + "&synckey="+syncCheckKey+"&_=" + getTimeStap();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
request.Headers["Cookie"] = cookie;
request.Host = "webpush.wx.qq.com";
request.Referer = "https://wx.qq.com/";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return decodeState(retString);
}
catch (Exception)
{
return -1;
}
}
private int decodeState(string str)
{
if (str.IndexOf("retcode:\"1100\"")>-1)
return -1;
if (str.IndexOf("selector:\"0\"") > -1)
return -1;
return 1;
}
//获取最新消息
private List<MessageBean> getCurrentMsgData()
{
string ret = string.Empty;
string postUrl = "";
if (url_params.IndexOf("wx2.qq") > -1)
postUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=" + wxsid + "&skey=" + skey;
else
postUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=" + wxsid + "&skey=" + skey;
string paramData = "{\"BaseRequest\":{\"Uin1\":\"" + wxuin + "\",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"},\"SyncKey\":" + SyncKey + ",\"rr\":\"-" + getTimeStap() + "\"}";
byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
string tempData = "refreshTimes=5; login_frequency=2; ";
string temp2 = cookie;
int number = temp2.IndexOf("wxpluginkey=");
string result = temp2.Insert(number, tempData);
webReq.Headers["Cookie"] = result;
webReq.ContentType = "application/json; charset=UTF-8";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
decodeData(ret);
List<MessageBean> resultData = decodeMsg(ret);
sr.Close();
response.Close();
return resultData;
}
//解析消息
private List<MessageBean> decodeMsg(string data)
{
JObject msgJo = (JObject)JsonConvert.DeserializeObject(data);
string tempData = msgJo["AddMsgList"].ToString();
JArray array = (JArray)JsonConvert.DeserializeObject(tempData);
int len = array.Count;
List<MessageBean> messages = new List<MessageBean>();
for (int i = 0; i < len; i++)
{
MessageBean bean = new MessageBean();
JToken temp = array[i];
bean.MsgId = temp["MsgId"].ToString();
bean.FromUserName = temp["FromUserName"].ToString();
bean.toUserName = temp["ToUserName"].ToString();
if (temp["MsgType"].ToString() != null && temp["MsgType"].ToString() != "")
bean.MsgType = Convert.ToInt32(temp["MsgType"].ToString());
bean.Content = temp["Content"].ToString();
if (temp["Status"].ToString() != null && temp["Status"].ToString() != "")
bean.Status = Convert.ToInt32(temp["Status"].ToString());
if (temp["ImgStatus"].ToString() != null && temp["ImgStatus"].ToString() != "")
bean.ImgStatus = Convert.ToInt32(temp["ImgStatus"].ToString());
if (temp["CreateTime"].ToString() != null && temp["CreateTime"].ToString() != "")
bean.CreateTime = Convert.ToInt32(temp["CreateTime"].ToString());
if (temp["VoiceLength"].ToString() != null && temp["VoiceLength"].ToString() != "")
bean.VoiceLength = Convert.ToInt32(temp["VoiceLength"].ToString());
if (temp["PlayLength"].ToString() != null && temp["PlayLength"].ToString() != "")
bean.PlayLength = Convert.ToInt32(temp["PlayLength"].ToString());
bean.FileName = temp["FileName"].ToString();
bean.FileSize = temp["FileSize"].ToString();
bean.MediaId = temp["MediaId"].ToString();
bean.Url = temp["Url"].ToString();
if (temp["AppMsgType"].ToString() != null && temp["AppMsgType"].ToString() != "")
bean.AppMsgType = Convert.ToInt32(temp["AppMsgType"].ToString());
if (temp["StatusNotifyCode"].ToString() != null && temp["StatusNotifyCode"].ToString() != "")
bean.StatusNotifyCode = Convert.ToInt32(temp["StatusNotifyCode"].ToString());
bean.StatusNotifyUserName = temp["StatusNotifyUserName"].ToString();
if (bean.MsgType == 3)//图片
{
string contentData = "";
if (url_params.IndexOf("wx2.qq") > -1)
{
contentData = pic_url + "?&MsgID=" + bean.MsgId + "&skey=" + skey + "&type=slave";
}else{
contentData = pic_url_qq + "?&MsgID=" + bean.MsgId + "&skey=" + skey + "&type=slave";
}
bean.Content = contentData;
}else if (bean.MsgType == 43)//视频
{
string contentData ="";
if (url_params.IndexOf("wx2.qq") > -1)
{
contentData = vidoe_url + "?msgid=" + bean.MsgId + "&skey=" + skey;
}
else
{
contentData = vidoe_url_qq + "?msgid=" + bean.MsgId + "&skey=" + skey;
}
bean.Content = contentData;
}
else if (bean.MsgType == 51)
{
continue;
}
messages.Add(bean);
}
return messages;
}
//给外面使用的方法发送文字
public void sendMsg(string toUserName, string content)
{
if (selfData == null)
return;
sendMsg(selfData.UserName, toUserName, content);
}
//发送文字消息
public void sendMsg(string fromUserName, string toUserName, string content)
{
try
{
string ret = string.Empty;
string postUrl = "";
if (url_params.IndexOf("wx2.qq") > -1)
postUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=" + pass_ticket;
else
postUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=" + pass_ticket;
string paramData = "{\"BaseRequest\":{\"Uin\":" + wxuin + ",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"},\"Msg\":{\"Type\":1,\"Content\":\"" + content + "\",\"FromUserName\":\"" + fromUserName + "\",\"ToUserName\":\"" + toUserName + "\",\"LocalID\":\"" + getTimeStap() + "1123\",\"ClientMsgId\":\"" + getTimeStap() + "1123\"},\"Scene\":0}";
byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
string tempData = "refreshTimes=5; login_frequency=2; ";
string temp2 = cookie;
int number = temp2.IndexOf("wxpluginkey=");
string result = temp2.Insert(number, tempData);
webReq.Headers["Cookie"] = result;
webReq.ContentType = "application/json; charset=UTF-8";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
sr.Close();
response.Close();
}
catch (Exception)
{
return;
}
}
//给外面使用的发送图片方法
public void sendPic(string toUserName, string filePath)
{
if (selfData == null)
return;
sendPic(selfData.UserName, toUserName, filePath);
}
//发送图片
public void sendPic(string fromUserName, string toUserName, string filePath)
{
try
{
FileInfo fileInfo = new FileInfo(filePath);
if (fileInfo == null)
return;
long fileSize = fileInfo.Length;
string md5file = "df967e09a42e42e196636abc7d0949f5";
string url = "";
if (url_params.IndexOf("wx2.qq") > -1)
url = "https://file.wx2.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json";
else
url = "https://file.wx.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json";
string paramData = "{\"UploadType\":2,\"BaseRequest\":{\"Uin\":" + wxuin + ",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"},\"ClientMediaId\":" + getTimeStap() + "1123,\"TotalLen\":" + fileSize + ",\"StartPos\":0,\"DataLen\":" + fileSize + ",\"MediaType\":4,\"FromUserName\":\"" + fromUserName + "\",\"ToUserName\":\"" + toUserName + "\",\"FileMd5\":\"" + md5file + "\"}";
string fileName = "1.jpg";//获取文件名称
// 这个可以是改变的,也可以是下面这个固定的字符串
string boundary = "----WebKitFormBoundaryTvv02SMEofqwHTiN";
//发送option请求
HttpWebRequest webrequest2 = (HttpWebRequest)WebRequest.Create(url);
webrequest2.Method = "OPTIONS";
webrequest2.Headers.Add("Accept-Encoding:gzip, deflate, sdch, br");
webrequest2.Headers.Add("Accept-Language:zh-CN,zh;q=0.8");
webrequest2.Headers.Add("Access-Control-Request-Method:POST");
if (url_params.IndexOf("wx2.qq") > -1)
{
webrequest2.Host = "file.wx2.qq.com";
webrequest2.Referer = "https://wx2.qq.com/";
webrequest2.Headers.Add("Origin:https://wx2.qq.com");
}
else
{
webrequest2.Host = "file.wx.qq.com";
webrequest2.Referer = "https://wx.qq.com/";
webrequest2.Headers.Add("Origin:https://wx.qq.com");
}
WebResponse responce2 = webrequest2.GetResponse();
Stream s2 = responce2.GetResponseStream();
StreamReader sr2 = new StreamReader(s2);
// 返回数据流
string data2 = sr2.ReadToEnd();
sr2.Close();
s2.Close();
// 创建request对象
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url);
webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
webrequest.Method = "POST";
webrequest.Headers.Add("Accept-Encoding:gzip, deflate, br");
if (url_params.IndexOf("wx2.qq") > -1)
{
webrequest.Referer = "https://wx2.qq.com/";
webrequest.Host = "file.wx2.qq.com";
webrequest.Headers.Add("Origin:https://wx2.qq.com");
}
else
{
webrequest.Referer = "https://wx.qq.com/";
webrequest.Host = "file.wx.qq.com";
webrequest.Headers.Add("Origin:https://wx.qq.com");
}
webrequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36";
webrequest.Headers.Add("Accept-Language:zh-CN,zh;q=0.8");
// 构造发送数据
StringBuilder sb = new StringBuilder();
List<string> poststr = new List<string>();
poststr.Add("id=WU_FILE_1");
poststr.Add("name=" + fileName);
poststr.Add("type=image/jpeg");
poststr.Add("lastModifiedDate=Thu Feb 16 2017 16:34:04 GMT+0800 (中国标准时间)");
poststr.Add("size=" + fileSize);
poststr.Add("mediatype=pic");
poststr.Add("uploadmediarequest=" + paramData);
poststr.Add("webwx_data_ticket=" + webwx_data_ticket);
poststr.Add("pass_ticket=undefined");
foreach (string c in poststr)
{
string[] item = c.Split('=');
if (item.Length != 2)
{
break;
}
string name = item[0];
string value = item[1];
sb.Append("--" + boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"" + name + "\"");
sb.Append("\r\n\r\n");
sb.Append(value);
sb.Append("\r\n");
}
// 文件域的数据
sb.Append("--" + boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"filename\";filename=\"" + fileName + "\"");
sb.Append("\r\n");
sb.Append("Content-Type: ");
sb.Append("image/jpeg");
sb.Append("\r\n\r\n");
string postHeader = sb.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);
//构造尾部数据
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
webrequest.ContentLength = length;
Stream requestStream = webrequest.GetRequestStream();
// 输入头部数据
requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
// 输入文件流数据
byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
requestStream.Write(buffer, 0, bytesRead);
// 输入尾部数据
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
WebResponse responce = webrequest.GetResponse();
Stream s = responce.GetResponseStream();
StreamReader sr = new StreamReader(s);
// 返回数据流
string data = sr.ReadToEnd();
sr.Close();
s.Close();
string mediaId = getMediaId(data);
if (mediaId == null || mediaId == "")
return;
//真正发送图片
realsendPic(fromUserName, toUserName, mediaId);
}catch(Exception){
return;
}
}
//真正发送图片
private void realsendPic(string fromUserName, string toUserName, string mediaId)
{
try
{
string ret = string.Empty;
string postUrl = "";
if (url_params.IndexOf("wx2.qq") > -1)
postUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsgimg?fun=async&f=json&lang=zh_CN&pass_ticket=" + pass_ticket;
else
postUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsgimg?fun=async&f=json&lang=zh_CN&pass_ticket=" + pass_ticket;
string paramData = "{\"BaseRequest\":{\"Uin1\":\"" + wxuin + "\",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"},\"Msg\":{\"Type\":3,\"Content\":\"\",\"FromUserName\":\"" + fromUserName + "\",\"ToUserName\":\"" + toUserName + "\",\"LocalID\":\"" + getTimeStap() + "1123\",\"ClientMsgId\":\"" + getTimeStap() + "1123\",\"MediaId\":\"" + mediaId + "\"},\"Scene\":0}";
byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
webReq.Headers["Cookie"] = cookie;
webReq.ContentType = "application/json; charset=UTF-8";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
sr.Close();
response.Close();
newStream.Close();
}
catch (Exception)
{
return;
}
}
//获取媒体唯一编号
private string getMediaId(string data)
{
JObject msgJo = (JObject)JsonConvert.DeserializeObject(data);
string result = msgJo["MediaId"].ToString();
return result;
}
//获取图片(指定大小)
public Bitmap getPicFromWx(string url,int width,int height)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
request.Headers["Cookie"] = cookie;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
Bitmap image = new Bitmap(myResponseStream);
myResponseStream.Close();
if (width <=0 || height <= 0)
return image;
Bitmap result = GetImageThumb(image, new Size(width, height));
return result;
}
//获取原图
public Bitmap getPicFromWx(string url)
{
return getPicFromWx(url, 0, 0);
}
//通过昵称获取指定的userName
public string getAssignUserName(string nickName)
{
if (friends == null)
return null;
int count = friends.Count();
if (count <= 0)
return null;
for (int i = 0; i < count; i++)
{
FriendBean temp = friends[i];
if (temp.NickName!=null&&temp.NickName.Equals(nickName))
{
return temp.UserName;
}
}
return null;
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Threading;
using System.Net;
using System.IO;
using System.Drawing;
using System.Xml;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Security.Cryptography;
using System.Collections;
namespace WxBean
{
class WxUtils
{
//自身数据
SelfBean selfData;
//联系人数据
List<FriendBean> friends;
//最近人数据
List<FriendBean> currentData;
string url_params="";
string message="";
string skey="";
string wxsid="";
string wxuin="";
string pass_ticket="";
string isgrayscale="";
string SyncKey="";
string syncCheckKey = "";
string uuid="";
string webwx_data_ticket="";
string pic_url = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetmsgimg";
string pic_url_qq = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetmsgimg";
string vidoe_url = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetvideo";
string vidoe_url_qq = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetvideo";
string cookie = "pgv_pvi=6709982208; webwxuvid=eac6c967c1de446c73c08acc64904546218df93ddfedacbf78aeb8150ab77b8f76c2abd11d782cf5b59b46ffb9ca213e; pgv_si=s1867008000; ";
private static WxUtils Instance = new WxUtils();
List<MessageBean> lastMessage = new List<MessageBean>();//上一次的数据记录
private WxUtils()
{
}
public static WxUtils getInstance()
{
return Instance;
}
//获取自身的信息
public SelfBean getSelfConfig()
{
return selfData;
}
//设置好友列表
public void setFriendContacts(List<FriendBean> friends)
{
this.friends = friends;
}
//获取好友列表
public List<FriendBean> getFriendContacts()
{
return friends;
}
//返回cookie给别人用
public string getCookieData()
{
return cookie;
}
//这个是获取二维码,保扩先获取uuid在
public Bitmap getWx_Code()
{
uuid = getUUID();
if (uuid == null)
return null;
return getQR_Code(uuid);
}
//获取UUID
private string getUUID()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=" + getTimeStap());
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
string[] results = retString.Split(new char[] { ';' });
if (results[0].IndexOf("200") > -1)
{
string tempReuslt = results[1];
tempReuslt = tempReuslt.Replace("window.QRLogin.uuid = ", "");
tempReuslt = tempReuslt.Replace("\"", "");
tempReuslt = tempReuslt.Replace(" ", "");
return tempReuslt;
}
else
{
return null;
}
}
//获取时间戳
public string getTimeStap()
{
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
DateTime nowTime = DateTime.Now;
long unixTime = (long)Math.Round((nowTime - startTime).TotalMilliseconds, MidpointRounding.AwayFromZero);
return unixTime + "";
}
//获取二维码(这获取的图片是200*200的)
private Bitmap getQR_Code(string param)
{
if (param == null)
return null;
string url = "https://login.weixin.qq.com/qrcode/" + param;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
Bitmap image = new Bitmap(myResponseStream);
myResponseStream.Close();
Bitmap result = GetImageThumb(image, new Size(200, 200));
return result;
}
//压缩图片
public Bitmap GetImageThumb(Bitmap mg, Size newSize)
{
double ratio = 0d;
double myThumbWidth = 0d;
double myThumbHeight = 0d;
int x = 0;
int y = 0;
Bitmap bp;
if ((mg.Width / Convert.ToDouble(newSize.Width)) > (mg.Height /
Convert.ToDouble(newSize.Height)))
ratio = Convert.ToDouble(mg.Width) / Convert.ToDouble(newSize.Width);
else
ratio = Convert.ToDouble(mg.Height) / Convert.ToDouble(newSize.Height);
myThumbHeight = Math.Ceiling(mg.Height / ratio);
myThumbWidth = Math.Ceiling(mg.Width / ratio);
Size thumbSize = new Size((int)newSize.Width, (int)newSize.Height);
bp = new Bitmap(newSize.Width, newSize.Height);
x = (newSize.Width - thumbSize.Width) / 2;
y = (newSize.Height - thumbSize.Height);
System.Drawing.Graphics g = Graphics.FromImage(bp);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
Rectangle rect = new Rectangle(x, y, thumbSize.Width, thumbSize.Height);
g.DrawImage(mg, rect, 0, 0, mg.Width, mg.Height, GraphicsUnit.Pixel);
return bp;
}
//等待验证
public string wait_login()
{
string url = "https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=0&uuid=" + uuid + "&_=" + getTimeStap();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
string[] result = retString.Split(new char[] { ';' });
string code_result = result[0].Replace("window.code=", "");
if (code_result != "200")
return null;
else
{
string url_result = result[1].Replace("window.redirect_uri=", "");
url_result = url_result.Replace("\"", "");
url_result = url_result.Replace(" ", "");
url_result = url_result.Replace("\n", "");
url_params = url_result;
return "success";
}
}
//获取cookie
private string getCookie()
{
//string url = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?" + url_params + "&fun=new";
string url = url_params + "&fun=new";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string data = response.GetResponseHeader("Set-Cookie");
string[] temps = Regex.Split(data, "GMT,", RegexOptions.IgnoreCase);
int len = temps.Length;
cookie += "wxpluginkey="+getTimeStap()+"; ";
for (int i = 0; i < len; i++)
{
string temp = temps[i];
int index = temp.IndexOf(";");
cookie += temp.Substring(0, index + 1) + " ";
}
cookie += "mm_lang=zh_CN; MM_WX_NOTIFY_STATE=1; MM_WX_SOUND_STATE=1";
decodeData_ticket(temps);
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
XmlDocument doc = new XmlDocument();
doc.LoadXml(retString);
XmlNode root = doc.SelectSingleNode("error");
message = root.SelectSingleNode("message").InnerText;
if (root.SelectSingleNode("skey")!=null)
skey = root.SelectSingleNode("skey").InnerText;
if (root.SelectSingleNode("wxsid")!=null)
wxsid = root.SelectSingleNode("wxsid").InnerText;
if (root.SelectSingleNode("wxuin")!=null)
wxuin = root.SelectSingleNode("wxuin").InnerText;
if (root.SelectSingleNode("pass_ticket")!=null)
pass_ticket = root.SelectSingleNode("pass_ticket").InnerText;
if (root.SelectSingleNode("isgrayscale")!=null)
isgrayscale = root.SelectSingleNode("isgrayscale").InnerText;
return retString;
}
//解析data_ticket数据
private void decodeData_ticket(string[] temps)
{
if (temps == null)
return;
int len = temps.Count();
if (len == 0)
return;
for (int i = 0; i < len; i++)
{
string temp = temps[i];
if (temp.IndexOf("webwx_data_ticket=") > -1)
{
int index = temp.IndexOf(";");
temp = temp.Substring(0, index);
int size = temp.Length;
webwx_data_ticket = temp.Substring(18, size - 18);
break;
}
}
}
//初始化微信数据
public void InitData()
{
getCookie();//获取cookie
initSelf();//初始化自身信息
friends = getContacts();//获取联系人
}
public void initSelf()
{
try
{
string ret = string.Empty;
string postUrl = "";
if (url_params.IndexOf("wx2.qq") > -1)
postUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=" + getTimeStap() + "&lang=zh_CN&pass_ticket=" + pass_ticket;
else
postUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=" + getTimeStap() + "&lang=zh_CN&pass_ticket=" + pass_ticket;
string paramData = "{\"BaseRequest\":{\"Uin\":\"" + wxuin + "\",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"}}";
byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
webReq.Headers["Cookie"] = cookie;
webReq.ContentType = "application/json; charset=UTF-8";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
decodeData(ret);
selfData = decodeSelf(ret);
currentData = decodeContacts(ret);
sr.Close();
response.Close();
newStream.Close();
}
catch (Exception)
{
return;
}
}
//获取自身信息
private SelfBean decodeSelf(string data)
{
JObject self = (JObject)JsonConvert.DeserializeObject(data);
string tempData = self["User"].ToString();
JObject tempSelf = (JObject)JsonConvert.DeserializeObject(tempData);
SelfBean bean = new SelfBean();
bean.Uin = tempSelf["Uin"].ToString();
bean.UserName = tempSelf["UserName"].ToString();
bean.NikeName = tempSelf["NickName"].ToString();
if (url_params.IndexOf("wx2.qq") > -1)
{
if (tempSelf["HeadImgUrl"].ToString() != null && tempSelf["HeadImgUrl"].ToString() != "")
bean.HeadImagUrl = "https://wx2.qq.com" + tempSelf["HeadImgUrl"].ToString();
}
else
{
if (tempSelf["HeadImgUrl"].ToString() != null && tempSelf["HeadImgUrl"].ToString() != "")
bean.HeadImagUrl = "https://wx.qq.com" + tempSelf["HeadImgUrl"].ToString();
}
bean.RemarkName = tempSelf["RemarkName"].ToString();
bean.PYInitial = tempSelf["PYInitial"].ToString();
bean.PYQuanPin = tempSelf["PYQuanPin"].ToString();
bean.RemarkPYQuanPin = tempSelf["RemarkPYQuanPin"].ToString();
bean.RemarkPYInitial = tempSelf["RemarkPYInitial"].ToString();
if (tempSelf["HideInputBarFlag"].ToString() != null && tempSelf["HideInputBarFlag"].ToString() != "")
bean.HideInputBarFlag = Convert.ToInt32(tempSelf["HideInputBarFlag"].ToString());
if (tempSelf["StarFriend"].ToString() != null && tempSelf["StarFriend"].ToString() != "")
bean.StarFriend = Convert.ToInt32(tempSelf["StarFriend"].ToString());
if (tempSelf["Sex"].ToString() != null && tempSelf["Sex"].ToString() != "")
bean.Sex = Convert.ToInt32(tempSelf["Sex"].ToString());
bean.Signature = tempSelf["Signature"].ToString();
if (tempSelf["AppAccountFlag"].ToString() != null && tempSelf["AppAccountFlag"].ToString() != "")
bean.AppAccountFlag = Convert.ToInt32(tempSelf["AppAccountFlag"].ToString());
if (tempSelf["VerifyFlag"].ToString() != null && tempSelf["VerifyFlag"].ToString() != "")
bean.VerifyFlag = Convert.ToInt32(tempSelf["VerifyFlag"].ToString());
if (tempSelf["ContactFlag"].ToString() != null && tempSelf["ContactFlag"].ToString() != "")
bean.ContactFlag = Convert.ToInt32(tempSelf["ContactFlag"].ToString());
if (tempSelf["WebWxPluginSwitch"].ToString() != null && tempSelf["WebWxPluginSwitch"].ToString() != "")
bean.WebWxPluginSwitch = Convert.ToInt32(tempSelf["WebWxPluginSwitch"].ToString());
if (tempSelf["HeadImgFlag"].ToString() != null && tempSelf["HeadImgFlag"].ToString() != "")
bean.HeadImgFlag = Convert.ToInt32(tempSelf["HeadImgFlag"].ToString());
if (tempSelf["SnsFlag"].ToString() != null && tempSelf["SnsFlag"].ToString() != "")
bean.SnsFlag = Convert.ToInt32(tempSelf["SnsFlag"].ToString());
return bean;
}
//解析数据
private void decodeData(string data)
{
JObject jo = (JObject)JsonConvert.DeserializeObject(data);
string zone = jo["SyncKey"].ToString();
string tempData = "";
tempData = zone.Replace("\r\n", "");
RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"[ ]{2,}", options);
SyncKey = regex.Replace(tempData, @"");
JObject jstr = (JObject)JsonConvert.DeserializeObject(zone);
string tempStr = jstr["List"].ToString();
JArray jarray = (JArray)JsonConvert.DeserializeObject(tempStr);
int count = jarray.Count();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++)
{
string keyStr = jarray[i].ToString();
JObject jkey = (JObject)JsonConvert.DeserializeObject(keyStr);
sb.Append(jkey["Key"].ToString()).Append("_").Append(jkey["Val"]);
if (i != count - 1)
{
sb.Append("|");
}
}
syncCheckKey = sb.ToString();
}
//获取联系人列表
public List<FriendBean> getContacts()
{
string ret = string.Empty;
string postUrl = "";
if (url_params.IndexOf("wx2.qq") > -1)
postUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact";
else
postUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact";
string paramData = "{\"BaseRequest\":{\"Uin\":\"" + wxuin + "\",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"}}";
byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
webReq.Headers["Cookie"] = cookie;
webReq.ContentType = "application/json; charset=UTF-8";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
List<FriendBean> result = decodeContacts(ret);
sr.Close();
response.Close();
newStream.Close();
return result;
}
//解析联系人数据
private List<FriendBean> decodeContacts(string json)
{
List<FriendBean> contacts = new List<FriendBean>();
JObject data = (JObject)JsonConvert.DeserializeObject(json);
JToken myData = data["MemberList"];
if (myData == null)
myData = data["ContactList"];
if (myData == null)
return null;
string tempData = myData.ToString();
JArray array = (JArray)JsonConvert.DeserializeObject(tempData);
int len = array.Count;
for (int i = 0; i < len; i++)
{
FriendBean bean = new FriendBean();
JToken temp = array[i];
bean.Uin = Convert.ToInt32(temp["Uin"].ToString());
bean.NickName = temp["NickName"].ToString();
bean.UserName = temp["UserName"].ToString();
if (url_params.IndexOf("wx2.qq") > -1)
{
if (temp["HeadImgUrl"].ToString() != null && temp["HeadImgUrl"].ToString() != "")
bean.HeadImgUrl = "https://wx2.qq.com" + temp["HeadImgUrl"].ToString();
}
else
{
if (temp["HeadImgUrl"].ToString() != null && temp["HeadImgUrl"].ToString() != "")
bean.HeadImgUrl = "https://wx.qq.com" + temp["HeadImgUrl"].ToString();
}
if (temp["ContactFlag"].ToString() != null && temp["ContactFlag"].ToString() != "")
bean.ContactFlag = Convert.ToInt32(temp["ContactFlag"].ToString());
if (temp["MemberCount"].ToString() != null && temp["MemberCount"].ToString() != "")
bean.MemberCount = Convert.ToInt32(temp["MemberCount"].ToString());
bean.RemarkName = temp["RemarkName"].ToString();
if (temp["Sex"].ToString() != null && temp["Sex"].ToString() != "")
bean.Sex = Convert.ToInt32(temp["Sex"].ToString());
bean.Signature = temp["Signature"].ToString();
bean.PYInitial = temp["PYInitial"].ToString();
bean.PYQuanPin = temp["PYQuanPin"].ToString();
if (temp["Statues"].ToString() != null && temp["Statues"].ToString() != "")
bean.Statues = Convert.ToInt32(temp["Statues"].ToString());
if (temp["AttrStatus"].ToString() != null && temp["AttrStatus"].ToString() != "")
{
string value = temp["AttrStatus"].ToString();
bean.AttrStatus = long.Parse(value);
}
bean.Province = temp["Province"].ToString();
bean.City = temp["City"].ToString();
if (temp["SnsFlag"].ToString() != null && temp["SnsFlag"].ToString() != "")
bean.SnsFlag = Convert.ToInt32(temp["SnsFlag"].ToString());
bean.DisplayName = temp["DisplayName"].ToString();
bean.KeyWord = temp["KeyWord"].ToString();
if (temp["ChatRoomId"].ToString() != null && temp["ChatRoomId"].ToString() != "")
bean.ChatRoomId = Convert.ToInt32(temp["ChatRoomId"].ToString());
bean.EncryChatRoomId = temp["EncryChatRoomId"].ToString();
contacts.Add(bean);
}
return contacts;
}
//获取最新消息数据
public List<MessageBean> getNewMsg()
{
List<MessageBean> tempData = getCurrentMsg();
if (tempData == null)
return null;
int count = tempData.Count();
if (count == 0)
return null;
if (lastMessage == null||lastMessage.Count()==0)
{
lastMessage = tempData;
return tempData;
}
List<MessageBean> result = checkNewData(tempData);
lastMessage = tempData;
return result;
}
private List<MessageBean> checkNewData(List<MessageBean> data)
{
if (data == null)
return null;
int count = data.Count();
if (count == 0)
return null;
List<MessageBean> tempData = new List<MessageBean>();
for (int i = 0; i < count; i++)
{
if (isNewOne(data[i]))
{
tempData.Add(data[i]);
}
}
return tempData;
}
private Boolean isNewOne(MessageBean data)
{
if (lastMessage == null)
return true;
int count = lastMessage.Count();
if (count == 0)
return true;
for (int i = 0; i < count; i++)
{
if (data.Equals(lastMessage[i]))
return false;
}
return true;
}
private List<MessageBean> getCurrentMsg()
{
int data = synCheckGet();
if (data == -1)
return null;
return getCurrentMsgData();
}
//按照谷歌抓取的信息
private int synCheckGet()
{
try
{
string url = "";
if (url_params.IndexOf("wx2.qq") > -1)
url = "https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=" + getTimeStap() + "&skey=" + skey + "&sid=" + wxsid + "&uin=" + wxuin + "&deviceid=e" + getTimeStap() + "&synckey="+syncCheckKey+"&_=" + getTimeStap();
else
url = "https://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=" + getTimeStap() + "&skey=" + skey + "&sid=" + wxsid + "&uin=" + wxuin + "&deviceid=e" + getTimeStap() + "&synckey="+syncCheckKey+"&_=" + getTimeStap();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
request.Headers["Cookie"] = cookie;
request.Host = "webpush.wx.qq.com";
request.Referer = "https://wx.qq.com/";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return decodeState(retString);
}
catch (Exception)
{
return -1;
}
}
private int decodeState(string str)
{
if (str.IndexOf("retcode:\"1100\"")>-1)
return -1;
if (str.IndexOf("selector:\"0\"") > -1)
return -1;
return 1;
}
//获取最新消息
private List<MessageBean> getCurrentMsgData()
{
string ret = string.Empty;
string postUrl = "";
if (url_params.IndexOf("wx2.qq") > -1)
postUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=" + wxsid + "&skey=" + skey;
else
postUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=" + wxsid + "&skey=" + skey;
string paramData = "{\"BaseRequest\":{\"Uin1\":\"" + wxuin + "\",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"},\"SyncKey\":" + SyncKey + ",\"rr\":\"-" + getTimeStap() + "\"}";
byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
string tempData = "refreshTimes=5; login_frequency=2; ";
string temp2 = cookie;
int number = temp2.IndexOf("wxpluginkey=");
string result = temp2.Insert(number, tempData);
webReq.Headers["Cookie"] = result;
webReq.ContentType = "application/json; charset=UTF-8";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
decodeData(ret);
List<MessageBean> resultData = decodeMsg(ret);
sr.Close();
response.Close();
return resultData;
}
//解析消息
private List<MessageBean> decodeMsg(string data)
{
JObject msgJo = (JObject)JsonConvert.DeserializeObject(data);
string tempData = msgJo["AddMsgList"].ToString();
JArray array = (JArray)JsonConvert.DeserializeObject(tempData);
int len = array.Count;
List<MessageBean> messages = new List<MessageBean>();
for (int i = 0; i < len; i++)
{
MessageBean bean = new MessageBean();
JToken temp = array[i];
bean.MsgId = temp["MsgId"].ToString();
bean.FromUserName = temp["FromUserName"].ToString();
bean.toUserName = temp["ToUserName"].ToString();
if (temp["MsgType"].ToString() != null && temp["MsgType"].ToString() != "")
bean.MsgType = Convert.ToInt32(temp["MsgType"].ToString());
bean.Content = temp["Content"].ToString();
if (temp["Status"].ToString() != null && temp["Status"].ToString() != "")
bean.Status = Convert.ToInt32(temp["Status"].ToString());
if (temp["ImgStatus"].ToString() != null && temp["ImgStatus"].ToString() != "")
bean.ImgStatus = Convert.ToInt32(temp["ImgStatus"].ToString());
if (temp["CreateTime"].ToString() != null && temp["CreateTime"].ToString() != "")
bean.CreateTime = Convert.ToInt32(temp["CreateTime"].ToString());
if (temp["VoiceLength"].ToString() != null && temp["VoiceLength"].ToString() != "")
bean.VoiceLength = Convert.ToInt32(temp["VoiceLength"].ToString());
if (temp["PlayLength"].ToString() != null && temp["PlayLength"].ToString() != "")
bean.PlayLength = Convert.ToInt32(temp["PlayLength"].ToString());
bean.FileName = temp["FileName"].ToString();
bean.FileSize = temp["FileSize"].ToString();
bean.MediaId = temp["MediaId"].ToString();
bean.Url = temp["Url"].ToString();
if (temp["AppMsgType"].ToString() != null && temp["AppMsgType"].ToString() != "")
bean.AppMsgType = Convert.ToInt32(temp["AppMsgType"].ToString());
if (temp["StatusNotifyCode"].ToString() != null && temp["StatusNotifyCode"].ToString() != "")
bean.StatusNotifyCode = Convert.ToInt32(temp["StatusNotifyCode"].ToString());
bean.StatusNotifyUserName = temp["StatusNotifyUserName"].ToString();
if (bean.MsgType == 3)//图片
{
string contentData = "";
if (url_params.IndexOf("wx2.qq") > -1)
{
contentData = pic_url + "?&MsgID=" + bean.MsgId + "&skey=" + skey + "&type=slave";
}else{
contentData = pic_url_qq + "?&MsgID=" + bean.MsgId + "&skey=" + skey + "&type=slave";
}
bean.Content = contentData;
}else if (bean.MsgType == 43)//视频
{
string contentData ="";
if (url_params.IndexOf("wx2.qq") > -1)
{
contentData = vidoe_url + "?msgid=" + bean.MsgId + "&skey=" + skey;
}
else
{
contentData = vidoe_url_qq + "?msgid=" + bean.MsgId + "&skey=" + skey;
}
bean.Content = contentData;
}
else if (bean.MsgType == 51)
{
continue;
}
messages.Add(bean);
}
return messages;
}
//给外面使用的方法发送文字
public void sendMsg(string toUserName, string content)
{
if (selfData == null)
return;
sendMsg(selfData.UserName, toUserName, content);
}
//发送文字消息
public void sendMsg(string fromUserName, string toUserName, string content)
{
try
{
string ret = string.Empty;
string postUrl = "";
if (url_params.IndexOf("wx2.qq") > -1)
postUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=" + pass_ticket;
else
postUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=" + pass_ticket;
string paramData = "{\"BaseRequest\":{\"Uin\":" + wxuin + ",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"},\"Msg\":{\"Type\":1,\"Content\":\"" + content + "\",\"FromUserName\":\"" + fromUserName + "\",\"ToUserName\":\"" + toUserName + "\",\"LocalID\":\"" + getTimeStap() + "1123\",\"ClientMsgId\":\"" + getTimeStap() + "1123\"},\"Scene\":0}";
byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
string tempData = "refreshTimes=5; login_frequency=2; ";
string temp2 = cookie;
int number = temp2.IndexOf("wxpluginkey=");
string result = temp2.Insert(number, tempData);
webReq.Headers["Cookie"] = result;
webReq.ContentType = "application/json; charset=UTF-8";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
sr.Close();
response.Close();
}
catch (Exception)
{
return;
}
}
//给外面使用的发送图片方法
public void sendPic(string toUserName, string filePath)
{
if (selfData == null)
return;
sendPic(selfData.UserName, toUserName, filePath);
}
//发送图片
public void sendPic(string fromUserName, string toUserName, string filePath)
{
try
{
FileInfo fileInfo = new FileInfo(filePath);
if (fileInfo == null)
return;
long fileSize = fileInfo.Length;
string md5file = "df967e09a42e42e196636abc7d0949f5";
string url = "";
if (url_params.IndexOf("wx2.qq") > -1)
url = "https://file.wx2.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json";
else
url = "https://file.wx.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json";
string paramData = "{\"UploadType\":2,\"BaseRequest\":{\"Uin\":" + wxuin + ",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"},\"ClientMediaId\":" + getTimeStap() + "1123,\"TotalLen\":" + fileSize + ",\"StartPos\":0,\"DataLen\":" + fileSize + ",\"MediaType\":4,\"FromUserName\":\"" + fromUserName + "\",\"ToUserName\":\"" + toUserName + "\",\"FileMd5\":\"" + md5file + "\"}";
string fileName = "1.jpg";//获取文件名称
// 这个可以是改变的,也可以是下面这个固定的字符串
string boundary = "----WebKitFormBoundaryTvv02SMEofqwHTiN";
//发送option请求
HttpWebRequest webrequest2 = (HttpWebRequest)WebRequest.Create(url);
webrequest2.Method = "OPTIONS";
webrequest2.Headers.Add("Accept-Encoding:gzip, deflate, sdch, br");
webrequest2.Headers.Add("Accept-Language:zh-CN,zh;q=0.8");
webrequest2.Headers.Add("Access-Control-Request-Method:POST");
if (url_params.IndexOf("wx2.qq") > -1)
{
webrequest2.Host = "file.wx2.qq.com";
webrequest2.Referer = "https://wx2.qq.com/";
webrequest2.Headers.Add("Origin:https://wx2.qq.com");
}
else
{
webrequest2.Host = "file.wx.qq.com";
webrequest2.Referer = "https://wx.qq.com/";
webrequest2.Headers.Add("Origin:https://wx.qq.com");
}
WebResponse responce2 = webrequest2.GetResponse();
Stream s2 = responce2.GetResponseStream();
StreamReader sr2 = new StreamReader(s2);
// 返回数据流
string data2 = sr2.ReadToEnd();
sr2.Close();
s2.Close();
// 创建request对象
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url);
webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
webrequest.Method = "POST";
webrequest.Headers.Add("Accept-Encoding:gzip, deflate, br");
if (url_params.IndexOf("wx2.qq") > -1)
{
webrequest.Referer = "https://wx2.qq.com/";
webrequest.Host = "file.wx2.qq.com";
webrequest.Headers.Add("Origin:https://wx2.qq.com");
}
else
{
webrequest.Referer = "https://wx.qq.com/";
webrequest.Host = "file.wx.qq.com";
webrequest.Headers.Add("Origin:https://wx.qq.com");
}
webrequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36";
webrequest.Headers.Add("Accept-Language:zh-CN,zh;q=0.8");
// 构造发送数据
StringBuilder sb = new StringBuilder();
List<string> poststr = new List<string>();
poststr.Add("id=WU_FILE_1");
poststr.Add("name=" + fileName);
poststr.Add("type=image/jpeg");
poststr.Add("lastModifiedDate=Thu Feb 16 2017 16:34:04 GMT+0800 (中国标准时间)");
poststr.Add("size=" + fileSize);
poststr.Add("mediatype=pic");
poststr.Add("uploadmediarequest=" + paramData);
poststr.Add("webwx_data_ticket=" + webwx_data_ticket);
poststr.Add("pass_ticket=undefined");
foreach (string c in poststr)
{
string[] item = c.Split('=');
if (item.Length != 2)
{
break;
}
string name = item[0];
string value = item[1];
sb.Append("--" + boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"" + name + "\"");
sb.Append("\r\n\r\n");
sb.Append(value);
sb.Append("\r\n");
}
// 文件域的数据
sb.Append("--" + boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"filename\";filename=\"" + fileName + "\"");
sb.Append("\r\n");
sb.Append("Content-Type: ");
sb.Append("image/jpeg");
sb.Append("\r\n\r\n");
string postHeader = sb.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);
//构造尾部数据
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
webrequest.ContentLength = length;
Stream requestStream = webrequest.GetRequestStream();
// 输入头部数据
requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
// 输入文件流数据
byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
requestStream.Write(buffer, 0, bytesRead);
// 输入尾部数据
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
WebResponse responce = webrequest.GetResponse();
Stream s = responce.GetResponseStream();
StreamReader sr = new StreamReader(s);
// 返回数据流
string data = sr.ReadToEnd();
sr.Close();
s.Close();
string mediaId = getMediaId(data);
if (mediaId == null || mediaId == "")
return;
//真正发送图片
realsendPic(fromUserName, toUserName, mediaId);
}catch(Exception){
return;
}
}
//真正发送图片
private void realsendPic(string fromUserName, string toUserName, string mediaId)
{
try
{
string ret = string.Empty;
string postUrl = "";
if (url_params.IndexOf("wx2.qq") > -1)
postUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsgimg?fun=async&f=json&lang=zh_CN&pass_ticket=" + pass_ticket;
else
postUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsgimg?fun=async&f=json&lang=zh_CN&pass_ticket=" + pass_ticket;
string paramData = "{\"BaseRequest\":{\"Uin1\":\"" + wxuin + "\",\"Sid\":\"" + wxsid + "\",\"Skey\":\"" + skey + "\",\"DeviceID\":\"e" + getTimeStap() + "\"},\"Msg\":{\"Type\":3,\"Content\":\"\",\"FromUserName\":\"" + fromUserName + "\",\"ToUserName\":\"" + toUserName + "\",\"LocalID\":\"" + getTimeStap() + "1123\",\"ClientMsgId\":\"" + getTimeStap() + "1123\",\"MediaId\":\"" + mediaId + "\"},\"Scene\":0}";
byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
webReq.Headers["Cookie"] = cookie;
webReq.ContentType = "application/json; charset=UTF-8";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
sr.Close();
response.Close();
newStream.Close();
}
catch (Exception)
{
return;
}
}
//获取媒体唯一编号
private string getMediaId(string data)
{
JObject msgJo = (JObject)JsonConvert.DeserializeObject(data);
string result = msgJo["MediaId"].ToString();
return result;
}
//获取图片(指定大小)
public Bitmap getPicFromWx(string url,int width,int height)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
request.Headers["Cookie"] = cookie;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
Bitmap image = new Bitmap(myResponseStream);
myResponseStream.Close();
if (width <=0 || height <= 0)
return image;
Bitmap result = GetImageThumb(image, new Size(width, height));
return result;
}
//获取原图
public Bitmap getPicFromWx(string url)
{
return getPicFromWx(url, 0, 0);
}
//通过昵称获取指定的userName
public string getAssignUserName(string nickName)
{
if (friends == null)
return null;
int count = friends.Count();
if (count <= 0)
return null;
for (int i = 0; i < count; i++)
{
FriendBean temp = friends[i];
if (temp.NickName!=null&&temp.NickName.Equals(nickName))
{
return temp.UserName;
}
}
return null;
}
}
}