微信网页版接口

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
        }


    }


}

猜你喜欢

转载自blog.csdn.net/yinbucheng/article/details/56006850
今日推荐