微信公众平台向特定用户推送消息
生活随笔
收集整理的這篇文章主要介紹了
微信公众平台向特定用户推送消息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、首先需要將微信的openid與系統用戶綁定。
在用戶關注公眾平臺的時候,回復一個鏈接,要求用戶綁定,可以設計如下消息進行回復,(openid最好進行加密處理,后者還需要用這個字段綁定fakeid)。
| 歡迎關注有問必答平臺,<a?href='http://myweixin123.duapp.com/bind.html?openid=@openid'>點擊此處進行用戶綁定</a>! |
在bind.html頁面將openid與系統的usercode進行綁定,這個綁定過程非常簡單,這里不詳敘述。
二、將openid與fakeid進行綁定
微信公眾平臺是一回一答的模式;但是在微信公眾平臺后臺,可以向特定用戶進行消息發送。我們利用這個機制使用代碼去模擬這個過程來實現消息推送。
首先需要模擬登錄:
| using?System; using?System.Collections.Generic; using?System.Linq; using?System.Web; using?System.Security.Cryptography; using?System.Text; using?System.Net; using?System.IO; using?System.Security.Authentication; using?System.Security.Cryptography.X509Certificates; /// <summary> ///WeiXinLogin 的摘要說明 /// </summary> public?class?WeiXinLogin { ???? ????/// <summary> ????/// MD5 32位加密 ????/// </summary> ????/// <param name="str"></param> ????/// <returns></returns> ????static?string?GetMd5Str32(string?str) ????{ ????????MD5CryptoServiceProvider md5Hasher = new?MD5CryptoServiceProvider(); ????????// Convert the input string to a byte array and compute the hash.? ????????char[] temp = str.ToCharArray(); ????????byte[] buf = new?byte[temp.Length]; ????????for?(int?i = 0; i < temp.Length; i++) ????????{ ????????????buf[i] = (byte)temp[i]; ????????} ????????byte[] data = md5Hasher.ComputeHash(buf); ????????// Create a new Stringbuilder to collect the bytes? ????????// and create a string.? ????????StringBuilder sBuilder = new?StringBuilder(); ????????// Loop through each byte of the hashed data?? ????????// and format each one as a hexadecimal string.? ????????for?(int?i = 0; i < data.Length; i++) ????????{ ????????????sBuilder.Append(data[i].ToString("x2")); ????????} ????????// Return the hexadecimal string.? ????????return?sBuilder.ToString(); ????} ????public?static?bool?ExecLogin(string?name,string?pass) ????{ ????????bool?result = false; ????????string?password = GetMd5Str32(pass).ToUpper(); ????????string?padata = "username="?+ name + "&pwd="?+ password + "&imgcode=&f=json"; ????????string?url = "https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN ";//請求登錄的URL ????????try ????????{ ????????????CookieContainer cc = new?CookieContainer();//接收緩存 ????????????byte[] byteArray = Encoding.UTF8.GetBytes(padata); // 轉化 ????????????HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create(url);? //新建一個WebRequest對象用來請求或者響應url ????????????ServicePointManager.CertificatePolicy = new?AcceptAllCertificatePolicy(); ????????????webRequest2.CookieContainer = cc;????????????????????????????????????? //保存cookie? ????????????webRequest2.Method = "POST";????????????????????????????????????????? //請求方式是POST ????????????webRequest2.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69 Safari/537.36"; ????????????webRequest2.Referer = "https://mp.weixin.qq.com/"; ????????????webRequest2.ContentType = "application/x-www-form-urlencoded";?????? //請求的內容格式為application/x-www-form-urlencoded ????????????webRequest2.ContentLength = byteArray.Length; ????????????Stream newStream = webRequest2.GetRequestStream();?????????? //返回用于將數據寫入 Internet 資源的 Stream。 ????????????// Send the data. ????????????newStream.Write(byteArray, 0, byteArray.Length);??? //寫入參數 ????????????newStream.Close(); ????????????HttpWebResponse response2 = (HttpWebResponse)webRequest2.GetResponse(); ????????????StreamReader sr2 = new?StreamReader(response2.GetResponseStream(), Encoding.Default); ????????????string?text2 = sr2.ReadToEnd(); ????????????//此處用到了newtonsoft來序列化 ????????????WeiXinRetInfo retinfo = Newtonsoft.Json.JsonConvert.DeserializeObject<WeiXinRetInfo>(text2); ????????????string?token = string.Empty; ????????????if?(retinfo.ErrMsg.Length > 0) ????????????{ ????????????????token = retinfo.ErrMsg.Split(new?char[] { '&'?})[2].Split(new?char[] { '='?})[1].ToString();//取得令牌 ????????????????LoginInfo.LoginCookie = cc; ????????????????LoginInfo.CreateDate = DateTime.Now; ????????????????LoginInfo.Token = token; ????????????????result = true; ????????????} ????????} ????????catch?(Exception ex) ????????{ ??????????? ????????????throw?new?Exception(ex.StackTrace); ????????} ????????return?result; ????} ????public?static?class?LoginInfo ????{ ????????/// <summary> ????????/// 登錄后得到的令牌 ????????/// </summary>??????? ????????public?static?string?Token { get; set; } ????????/// <summary> ????????/// 登錄后得到的cookie ????????/// </summary> ????????public?static?CookieContainer LoginCookie { get; set; } ????????/// <summary> ????????/// 創建時間 ????????/// </summary> ????????public?static?DateTime CreateDate { get; set; } ????} ????internal?class?AcceptAllCertificatePolicy : ICertificatePolicy ????{ ????????public?AcceptAllCertificatePolicy() ????????{ ????????} ????????public?bool?CheckValidationResult(ServicePoint sPoint, ???????????X509Certificate cert, WebRequest wRequest, int?certProb) ????????{ ????????????// Always accept? ????????????return?true; ????????} ????}? } |
獲取fakeid
| public?static?ArrayList SubscribeMP() { ????try ????{ ????????CookieContainer cookie = null; ????????string?token = null; ????????cookie = WeiXinLogin.LoginInfo.LoginCookie;//取得cookie ????????token = WeiXinLogin.LoginInfo.Token;//取得token ????????/*獲取用戶信息的url,這里有幾個參數給大家講一下,1.token此參數為上面的token 2.pagesize此參數為每一頁顯示的記錄條數 ????????3.pageid為當前的頁數,4.groupid為微信公眾平臺的用戶分組的組id,當然這也是我的猜想不一定正確*/ ????????string?Url = "https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&pagesize=10&pageidx=0&type=0&groupid=0&token="?+ token + "&lang=zh_CN"; ????????HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create(Url); ????????webRequest2.CookieContainer = cookie; ????????webRequest2.ContentType = "text/html; charset=UTF-8"; ????????webRequest2.Method = "GET"; ????????webRequest2.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"; ????????webRequest2.ContentType = "application/x-www-form-urlencoded"; ????????HttpWebResponse response2 = (HttpWebResponse)webRequest2.GetResponse(); ????????StreamReader sr2 = new?StreamReader(response2.GetResponseStream(), Encoding.Default); ????????string?text2 = sr2.ReadToEnd(); ????????MatchCollection mc; ????????//由于此方法獲取過來的信息是一個html網頁所以此處使用了正則表達式,注意:(此正則表達式只是獲取了fakeid的信息如果想獲得一些其他的信息修改此處的正則表達式就可以了。) ????????Regex r = new?Regex("\"id\"\\:\\d+,\"nick_name\""); //定義一個Regex對象實例 ????????mc = r.Matches(text2); ????????Int32 friendSum = mc.Count;????????? //好友總數 ????????string?fackID = ""; ????????ArrayList fackID1 = new?ArrayList(); ????????for?(int?i = 0; i < friendSum; i++) ????????{ ????????????//"id":208989515,"nick_name" ????????????fackID = mc[i].Value.Replace(",\"nick_name\"", "").Split(new?char[] { ':'?})[1]; ????????????fackID = fackID.Replace("\"", "").Trim(); ????????????fackID1.Add(fackID); ????????} ????????return?fackID1; ????} ????catch?(Exception ex) ????{ ????????throw?new?Exception(ex.StackTrace); ????} } |
根據fakeid獲取openid
public static string GetOpenidByFakeid(string fakeid){try{CookieContainer cookie = null;string token = null;cookie = WeiXinLogin.LoginInfo.LoginCookie;//取得cookietoken = WeiXinLogin.LoginInfo.Token;//取得tokenstring Url = "https://mp.weixin.qq.com/cgi-bin/singlemsgpage?msgid=&source=&count=20&t=wxm-singlechat&fromfakeid=" + fakeid + "&token=" + token + "&lang=zh_CN";HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create(Url);webRequest2.CookieContainer = cookie;webRequest2.ContentType = "text/html; charset=UTF-8";webRequest2.Method = "GET";webRequest2.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";webRequest2.ContentType = "application/x-www-form-urlencoded";HttpWebResponse response2 = (HttpWebResponse)webRequest2.GetResponse();StreamReader sr2 = new StreamReader(response2.GetResponseStream(), Encoding.UTF8);string text2 = sr2.ReadToEnd();HtmlDocument doc = new HtmlDocument();doc.LoadHtml(text2);var str = doc.GetElementbyId("json-msgList").InnerHtml;JArray messages = JArray.Parse(str);foreach (var message in messages){string strContent = HttpUtility.HtmlDecode(message["content"].ToString());Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""\s]?)(?<href>[^'""\s]*)\1[^>]*?>");MatchCollection match = reg.Matches(strContent);var href = "";foreach (Match m in match){href = m.Groups["href"].Value;}var openid = GetUrlParamValue(href, "openid");if (!string.IsNullOrEmpty(openid))return openid;}return "";}catch (Exception ex){return "";}}?
由于之前有建立openid與usercode的關系,所以可以根據usercode找到openid,又可以根據openid找到fakeid。使用下面代碼進行推送:
| public?static?bool?SendMessage(string?Message, string?fakeid) { ????bool?result = false; ????CookieContainer cookie = null; ????string?token = null; ????cookie = WeiXinLogin.LoginInfo.LoginCookie;//取得cookie ????token =? WeiXinLogin.LoginInfo.Token;//取得token ????string?strMsg = System.Web.HttpUtility.UrlEncode(Message);? //對傳遞過來的信息進行url編碼 ????string?padate = "type=1&content="?+ strMsg + "&error=false&tofakeid="?+ fakeid + "&token="?+ token + "&ajax=1"; ????string?url = "https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN"; ????byte[] byteArray = Encoding.UTF8.GetBytes(padate); // 轉化 ????HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create(url); ????webRequest2.CookieContainer = cookie; //登錄時得到的緩存 ????webRequest2.Referer = "https://mp.weixin.qq.com/cgi-bin/singlemsgpage?token="?+ token + "&fromfakeid="?+ fakeid + "&msgid=&source=&count=20&t=wxm-singlechat&lang=zh_CN"; ????webRequest2.Method = "POST"; ????webRequest2.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"; ????webRequest2.ContentType = "application/x-www-form-urlencoded"; ????webRequest2.ContentLength = byteArray.Length; ????Stream newStream = webRequest2.GetRequestStream(); ????// Send the data.??????????? ????newStream.Write(byteArray, 0, byteArray.Length);??? //寫入參數??? ????newStream.Close(); ????HttpWebResponse response2 = (HttpWebResponse)webRequest2.GetResponse(); ????StreamReader sr2 = new?StreamReader(response2.GetResponseStream(), Encoding.Default); ????string?text2 = sr2.ReadToEnd(); ????if?(text2.Contains("ok")) ????{ ????????result = true; ????} ????return?result; } |
可以寫一個長期運行的windows服務用于建立fakeid和openid的關系,這里不再詳訴。
總結
以上是生活随笔為你收集整理的微信公众平台向特定用户推送消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抽象类和模板模式
- 下一篇: PHP(一) 开发环境搭建