码迷,mamicode.com
首页 > 微信 > 详细

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

时间:2019-11-28 13:00:18      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:数据   成功   hand   一个个   each   ndt   标识   datetime   ram   

最近有个微商客户需要搞个 个人微信监听群消息关键字并实现自动回复功能, 因为他有很多群  很多买家咨询的话 一个个回复太麻烦, 客户要求 比如群里有人发 关键字 产品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)
                            {
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<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);
}

  

来2个效果图

技术图片

 

 

 

技术图片

 

这是用客户微信号  在群里 发 产品1   则当前微信立马回复  前面设置的回复内容

 

有问题联系Q: 591811930

 

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

标签:数据   成功   hand   一个个   each   ndt   标识   datetime   ram   

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

(1)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!