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

最近有个微商客户需要搞个 个人微信监听群消息关键字并实现自动回复功能, 因为他有很多群  很多买家咨询的话 一个个回复太麻烦, 客户要求 比如群里有人发 关键字 产品1  则自动回复产品1的相关描述

首先设置关键字,将关键字和回复内容存到一个txt就行

 

C# PC版微信消息监听自动回复_第1张图片

 

然后就是微信消息监听(windows的消息  句柄不懂的自己 google):

上监听的关键代码 :

 /// 消息主要接受程序
        /// 
        /// 
        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)
                            {
                                LogHelper.WriteLog("解析微信登录用户信息错误", e1);
                            }
                            return;

                        //文字,图片,视频,文件 解析
                        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 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版微信消息监听自动回复_第2张图片

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

C# PC版微信消息监听自动回复_第3张图片

 

然后用 另一个号往群里发消息 (当前登录用户和那个号必须在一个群 )

发送  : 产品1  这时观察message 的值

C# PC版微信消息监听自动回复_第4张图片

 

@chatroom 结尾的是 群的唯一标识id   群聊就是群名称,   发送人昵称也有 发送的消息内容也有, 拿正则取一下就完事

word就是提取的发送内容, 然后判断如果发送的内容包含关键字 则调用SendMessage方法 
 /// 
        /// 发送消息
        /// 
        /// 消息内容
        /// 通讯号
        /// 
        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   则当前微信立马回复  前面设置的回复内容

原文地址: https://www.cnblogs.com/alonglonga/p/11876300.html    小赫赫首发

有问题联系+微: longwang213  注明来意

你可能感兴趣的:(.net)