C# PC版微信消息監聽自動回復
- 2021 年 1 月 7 日
- 筆記
最近有個微商客戶需要搞個 個人微信監聽群消息關鍵字並實現自動回復功能, 因為他有很多群 很多買家諮詢的話 一個個回復太麻煩, 客戶要求 比如群里有人發 關鍵字 產品1 則自動回復產品1的相關描述
首先設置關鍵字,將關鍵字和回復內容存到一個txt就行
然後就是微信消息監聽(windows的消息 句柄不懂的自己 google):
上監聽的關鍵代碼 :
/// 消息主要接受程序 /// </summary> /// <param name="m"></param> protected override void DefWndProc(ref Message m) { switch (m.Msg) { case 74: //74代表WM_COPYDATA string message = ""; int f = (int)m.WParam; try { COPYDATASTRUCT2 cds2 = (COPYDATASTRUCT2)m.GetLParam(typeof(COPYDATASTRUCT2)); message = Marshal.PtrToStringAnsi(cds2.lpData); } catch (Exception e) { LogHelper.WriteLog("解析微信消息報錯", e); //發文字帶空格報錯 } switch (f) { //登錄時解析用戶信息 case 10003: try { if (!string.IsNullOrEmpty(message)) { MessageHandler.Parse10003(message); } this.Invoke(new MethodInvoker(() => { richTextBox1.AppendText("【" + MessageHandler.myUserInfo.UserName + "】登錄成功!\r\n"); })); } catch (Exception e1) {<br> LogHelper.WriteLog("解析微信登錄用戶信息錯誤", e1); } return;<br> //文字,圖片,視頻,文件 解析 case 10012: try { if (message.Contains("msgtyp:")) { string[] datas = Regex.Split(message, "msgtyp:", RegexOptions.IgnoreCase); if (datas.Count() >= 2) { string msgtyp = datas[1].Split(',')[0]; switch (msgtyp.Replace(" ", "")) { case "1": //文字 if (message.Contains("[群-->]") && message.Contains("[消息內容-->]")) { string word = ""; //發送內容 //取消息內容 string[] wordArr = Regex.Split(message, @"消息內容-->]", RegexOptions.IgnoreCase); string[] aa = wordArr[1].Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries); if (aa[0].StartsWith(" ")) { word = aa[0].Substring(1); } else { word = aa[0]; } string groupId = WxMessageHelper.GetChatRoom(message); string groupName = WxMessageHelper.GetGroupName(message); string nickName = WxMessageHelper.GetNickName(message); string memberpuid = WxMessageHelper.GetWxId(message); List<string> data = ReadFile(); foreach(var str in data) { string key = str.Split(';')[0]; string value = str.Split(';')[1]; if (word.Contains(key)) { string[] sarr = Regex.Split(word, str, RegexOptions.IgnoreCase); this.Invoke(new MethodInvoker(() => { richTextBox1.AppendText("【" + nickName + "】在【" + groupName + "】發送了關鍵詞消息:"+ sarr[0]); richTextBox1.AppendTextColorful(key, Color.Red, false); richTextBox1.AppendText(key + "\r\n"); })); //調用回復 SendMessage(groupId + "||" + value, 20001); } } } break; } } } } catch (Exception e2) { this.Invoke(new MethodInvoker(() => { richTextBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "10012 : 解析微信群信息錯誤\r\n\r\n"); })); } break; default: break; } //消息內容 cds.lpData break; default: base.DefWndProc(ref m); break; } }
WParam=10003 時,監聽的是微信登錄的操作, 這時給前台窗體一個提示, 提示登錄成功 如下圖
登錄時message 消息體的值 ||分割 第一個就是微信昵稱, wxid_ 開頭的就是微信唯一標識 , 最後是登錄用戶的頭像
然後用 另一個號往群里發消息 (當前登錄用戶和那個號必須在一個群 )
發送 : 產品1 這時觀察message 的值
@chatroom 結尾的是 群的唯一標識id 群聊就是群名稱, 發送人昵稱也有 發送的消息內容也有, 拿正則取一下就完事。
/// <summary> /// 發送消息 /// </summary> /// <param name="message">消息內容</param> /// <param name="wParam">通訊號</param> /// <returns></returns> private int SendMessage(string message, int wParam) { byte[] sarr = System.Text.Encoding.Default.GetBytes(message); int len = sarr.Length; COPYDATASTRUCT cds; cds.dwData = (IntPtr)Convert.ToInt16(1); //可以是任意值 cds.cbData = len + 1; //指定lpData內存區域的位元組數 cds.lpData = message; //發送給目標窗口所在進程的數據 return myapi.SendMessage(common.微信句柄, 74, wParam, ref cds); //74代表WM_COPYDATA }
[StructLayout(LayoutKind.Sequential, Size=1)] public struct myapi { [DllImport("user32", EntryPoint="SetWindowLong")] public static extern int SetWindowLongA(int hwnd, int nIndex, int dwNewLong); [DllImport("User32.dll")] public static extern int SendMessage(int hwnd, int msg, int wParam, ref COPYDATASTRUCT IParam); [DllImport("User32.dll")] public static extern int FindWindow(string lpClassName, string lpWindowName); }
這是用客戶微信號 在群里 發 產品1 則當前微信立馬回復 前面設置的回復內容
博客經個人辛苦努力所得,如有轉載會特別申明,博客所有權歸本人和博客園所有,如有轉載請在顯著位置給出博文鏈接和作者姓名,否則本人將付諸法律
原文地址: //www.cnblogs.com/alonglonga/p/11876300.html 小赫赫首發
有問題聯繫+V: longwang213 註明來意
如果覺得有幫助 您的打賞是我繼續寫的動力