C# PC版微信消息監聽自動回復

最近有個微商客戶需要搞個 個人微信監聽群消息關鍵字並實現自動回復功能, 因為他有很多群  很多買家諮詢的話 一個個回復太麻煩, 客戶要求 比如群里有人發 關鍵字 產品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   群聊就是群名稱,   發送人昵稱也有 發送的消息內容也有, 拿正則取一下就完事。

 

 

 word就是提取的發送內容, 然後判斷如果發送的內容包含關鍵字 則調用SendMessage方法
/// <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    註明來意

 

如果覺得有幫助  您的打賞是我繼續寫的動力