找回密码
 立即注册
首页 业界区 业界 C# PC版微信消息监听自动回复

C# PC版微信消息监听自动回复

黎娅茜 6 天前
最近有个微商客户需要搞个 个人微信监听群消息关键字并实现自动回复功能, 因为他有很多群  很多买家咨询的话 一个个回复太麻烦, 客户要求 比如群里有人发 关键字 产品1  则自动回复产品1的相关描述
 
首先设置关键字,将关键字和回复内容存到一个txt就行
1.png

然后就是微信消息监听(windows的消息  句柄不懂的自己 google):
上监听的关键代码 :
  1. /// 消息主要接受程序
  2.        /// </summary>
  3.        /// <param name="m"></param>
  4.        protected override void DefWndProc(ref Message m)
  5.        {
  6.            switch (m.Msg)
  7.            {
  8.                case 74:    //74代表WM_COPYDATA                  
  9.                    string message = "";
  10.                    int f = (int)m.WParam;
  11.                    try
  12.                    {
  13.                        COPYDATASTRUCT2 cds2 = (COPYDATASTRUCT2)m.GetLParam(typeof(COPYDATASTRUCT2));
  14.                        message = Marshal.PtrToStringAnsi(cds2.lpData);
  15.                    }
  16.                    catch (Exception e)
  17.                    {
  18.                        LogHelper.WriteLog("解析微信消息报错", e);  //发文字带空格报错
  19.                    }
  20.                    switch (f)
  21.                    {
  22.                        //登录时解析用户信息
  23.                        case 10003:
  24.                            try
  25.                            {
  26.                                if (!string.IsNullOrEmpty(message))
  27.                                {
  28.                                    MessageHandler.Parse10003(message);
  29.                                }
  30.                                this.Invoke(new MethodInvoker(() => { richTextBox1.AppendText("【" + MessageHandler.myUserInfo.UserName + "】登录成功!\r\n"); }));
  31.                            }
  32.                            catch (Exception e1)
  33.                            {<br>                                LogHelper.WriteLog("解析微信登录用户信息错误", e1);
  34.                            }
  35.                            return;<br>
  36.                        //文字,图片,视频,文件 解析
  37.                        case 10012:
  38.                            try
  39.                            {
  40.                                if (message.Contains("msgtyp:"))
  41.                                {
  42.                                    string[] datas = Regex.Split(message, "msgtyp:", RegexOptions.IgnoreCase);
  43.                                    if (datas.Count() >= 2)
  44.                                    {
  45.                                        string msgtyp = datas[1].Split(',')[0];
  46.                                        switch (msgtyp.Replace(" ", ""))
  47.                                        {
  48.                                            case "1":  //文字
  49.                                                if (message.Contains("[群-->]") && message.Contains("[消息内容-->]"))
  50.                                                {
  51.                                                    string word = "";      //发送内容
  52.                                                    //取消息内容
  53.                                                    string[] wordArr = Regex.Split(message, @"消息内容-->]", RegexOptions.IgnoreCase);
  54.                                                    string[] aa = wordArr[1].Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries);
  55.                                                    if (aa[0].StartsWith(" "))
  56.                                                    {
  57.                                                        word = aa[0].Substring(1);
  58.                                                    }
  59.                                                    else
  60.                                                    {
  61.                                                        word = aa[0];
  62.                                                    }
  63.                                                    string groupId = WxMessageHelper.GetChatRoom(message);
  64.                                                    string groupName = WxMessageHelper.GetGroupName(message);
  65.                                                    string nickName = WxMessageHelper.GetNickName(message);
  66.                                                    string memberpuid = WxMessageHelper.GetWxId(message);
  67.                                                    List<string> data = ReadFile();
  68.                                                    foreach(var str in data)
  69.                                                    {
  70.                                                        string key = str.Split(';')[0];
  71.                                                        string value = str.Split(';')[1];
  72.                                                        if (word.Contains(key))
  73.                                                        {
  74.                                                            string[] sarr = Regex.Split(word, str, RegexOptions.IgnoreCase);
  75.                                                            this.Invoke(new MethodInvoker(() => { richTextBox1.AppendText("【" + nickName + "】在【" + groupName + "】发送了关键词消息:"+ sarr[0]);
  76.                                                                richTextBox1.AppendTextColorful(key, Color.Red, false);
  77.                                                                richTextBox1.AppendText(key + "\r\n");
  78.                                                            }));
  79.                                                            //调用回复
  80.                                                            SendMessage(groupId + "||" + value, 20001);
  81.                                                        }
  82.                                                    }
  83.                                                }
  84.                                                break;
  85.                                        }
  86.                                    }
  87.                                }
  88.                            }
  89.                            catch (Exception e2)
  90.                            {
  91.                                this.Invoke(new MethodInvoker(() => { richTextBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "10012 : 解析微信群信息错误\r\n\r\n"); }));
  92.                            }
  93.                            break;
  94.                        default:
  95.                            break;
  96.                    }
  97.                    //消息内容  cds.lpData
  98.                    break;
  99.                default:
  100.                    base.DefWndProc(ref m);
  101.                    break;
  102.            }
  103.        }
复制代码
  WParam=10003 时,监听的是微信登录的操作, 这时给前台窗体一个提示, 提示登录成功 如下图
 
 
 
2.png

 登录时message 消息体的值  ||分割  第一个就是微信昵称,  wxid_ 开头的就是微信唯一标识 , 最后是登录用户的头像
 
3.png

 
然后用 另一个号往群里发消息 (当前登录用户和那个号必须在一个群 )
发送  : 产品1  这时观察message 的值
 
4.png

 
@chatroom 结尾的是 群的唯一标识id   群聊就是群名称,   发送人昵称也有 发送的消息内容也有, 拿正则取一下就完事。
 
 
 word就是提取的发送内容, 然后判断如果发送的内容包含关键字 则调用SendMessage方法 
  1. /// <summary>
  2.        /// 发送消息
  3.        /// </summary>
  4.        /// <param name="message">消息内容</param>
  5.        /// <param name="wParam">通讯号</param>
  6.        /// <returns></returns>
  7.        private int SendMessage(string message, int wParam)
  8.        {
  9.            byte[] sarr = System.Text.Encoding.Default.GetBytes(message);
  10.            int len = sarr.Length;
  11.            COPYDATASTRUCT cds;
  12.            cds.dwData = (IntPtr)Convert.ToInt16(1);    //可以是任意值
  13.            cds.cbData = len + 1;   //指定lpData内存区域的字节数
  14.            cds.lpData = message;  //发送给目标窗口所在进程的数据
  15.            return myapi.SendMessage(common.微信句柄, 74, wParam, ref cds);  //74代表WM_COPYDATA
  16.        }
  17.   
  18. [StructLayout(LayoutKind.Sequential, Size=1)]
  19. public struct myapi
  20. {
  21.     [DllImport("user32", EntryPoint="SetWindowLong")]
  22.     public static extern int SetWindowLongA(int hwnd, int nIndex, int dwNewLong);
  23.     [DllImport("User32.dll")]
  24.     public static extern int SendMessage(int hwnd, int msg, int wParam, ref COPYDATASTRUCT IParam);
  25.     [DllImport("User32.dll")]
  26.     public static extern int FindWindow(string lpClassName, string lpWindowName);
  27. }
复制代码
5.gif

 
6.gif

 这是用客户微信号  在群里 发 产品1   则当前微信立马回复  前面设置的回复内容
 
博客经个人辛苦努力所得,如有转载会特别申明,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律
原文地址: https://www.cnblogs.com/alonglonga/p/11876300.html    小赫赫首发
有问题联系+Q:  591811930  注明来意
 
如果觉得有帮助  您的打赏是我继续写的动力
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册