• 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 + "】登录成功!
    "); }));
                               }
                               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 + "
    ");
                                                               }));
     
                                                               //调用回复
                                                               SendMessage(groupId + "||" + value, 20001);
                                                           }
                                                       }
                                                   }
     
                                                   break;
                                           }
                                       }
                                   }
                               }
                               catch (Exception e2)
                               {
                                   this.Invoke(new MethodInvoker(() => { richTextBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "10012 : 解析微信群信息错误
    
    "); }));
                               }
                               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   则当前微信立马回复  前面设置的回复内容

    博客经个人辛苦努力所得,如有转载会特别申明,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律

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

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

    如果觉得有帮助  您的打赏是我继续写的动力

  • 相关阅读:
    python 中提取文件的最后几列
    python 中将单条scaffold的碱基序列按照指定数目输出
    python 中print函数实现输出不换行
    linux 中 如何提取文件的最后几列、删除最后几列
    python 中列出指定目录下的所有文件及目录
    python 中 if语句取反
    linux 中 awk命令中数组的应用
    python 中 文件读取循环的坑
    linux 中 awk命令内使用cut命令
    ETCD 简介 + 使用 风行天下
  • 原文地址:https://www.cnblogs.com/lovewuhan/p/14248879.html
Copyright © 2020-2023  润新知