1. 程式人生 > 程式設計 >C# PC版微信訊息監聽自動回覆的實現方法

C# PC版微信訊息監聽自動回覆的實現方法

最近有個微商客戶需要搞個 個人微信監聽群訊息關鍵字並實現自動回覆功能, 因為他有很多群 很多買家諮詢的話 一個個回覆太麻煩, 客戶要求 比如群裡有人發 關鍵字 產品1 則自動回覆產品1的相關描述

首先設定關鍵字,將關鍵字和回覆內容存到一個txt就行

C# PC版微信訊息監聽自動回覆的實現方法

然後就是微信訊息監聽(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 時,監聽的是微信登入的操作,這時給前臺窗體一個提示, 提示登入成功 如下圖

上監聽的關鍵程式碼 :

C# PC版微信訊息監聽自動回覆的實現方法

登入時message 訊息體的值 ||分割 第一個就是微信暱稱, wxid_ 開頭的就是微信唯一標識 , 最後是登入使用者的頭像

C# PC版微信訊息監聽自動回覆的實現方法

然後用 另一個號往群裡發訊息 (當前登入使用者和那個號必須在一個群 )

傳送 : 產品1 這時觀察message 的值

C# PC版微信訊息監聽自動回覆的實現方法

@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);
}

來2個效果圖

C# PC版微信訊息監聽自動回覆的實現方法

C# PC版微信訊息監聽自動回覆的實現方法

這是用客戶微訊號 在群裡 發 產品1 則當前微信立馬回覆 前面設定的回覆內容

到此這篇關於C# PC版微信訊息監聽自動回覆的實現方法的文章就介紹到這了,更多相關C# 微信監聽自動回覆內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!

原文地址:https://www.cnblogs.com/alonglonga/p/11876300.html

作者:小赫赫