C# PC版微信消息监听自动回复的实现方法

 更新时间:2020年05月25日 11:44:46   作者:小赫赫  
这篇文章主要介绍了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 + "】登录成功!\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 时,监听的是微信登录的操作, 这时给前台窗体一个提示, 提示登录成功 如下图

上监听的关键代码 :

登录时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 则当前微信立马回复 前面设置的回复内容

到此这篇关于C# PC版微信消息监听自动回复的实现方法的文章就介绍到这了,更多相关C# 微信监听自动回复内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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

作者:小赫赫

相关文章

  • c#各种Timer类的区别与用法介绍

    c#各种Timer类的区别与用法介绍

    System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。在必须更新用户界面的情况下,建议不要使用该计时器,因为它的回调不在用户界面线程上发生
    2013-10-10
  • c# 理解csredis库实现分布式锁的详细流程

    c# 理解csredis库实现分布式锁的详细流程

    这篇文章主要介绍了c# 理解csredis实现分布式锁,该库本身已经足够完善,这里我画蛇添足一下,为了方便自己的使用,本文通过实例代码给大家详细介绍,需要的朋友可以参考下
    2022-02-02
  • C# 操作符之二 算数操作符

    C# 操作符之二 算数操作符

    算数操作符+,-,*,/,%,的用法和大多程序设计语言是相同的,%号的作用是整数除法中产生余数,而整数法会直接去掉小数部分,而不是四舍五入。
    2011-02-02
  • C#编程实现Excel文档中搜索文本内容的方法及思路

    C#编程实现Excel文档中搜索文本内容的方法及思路

    有了在Word文档中编程实现搜索文本的经验,在Excel中实现这个功能也并非难事。
    2013-07-07
  • C#中Span相关的性能优化建议

    C#中Span相关的性能优化建议

    Span 是C#7.2引入的一种新类型,在.NET Core 2.1运行时中受支持,Span 提供对内存连续区域的类型安全访问,这篇文章主要给大家介绍了关于C#中Span相关的一些性能优化建议,需要的朋友可以参考下
    2021-08-08
  • c#压缩字符串的方法

    c#压缩字符串的方法

    这篇文章主要介绍了c#压缩字符串的方法,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 用C#获取硬盘序列号,CPU序列号,网卡MAC地址的源码

    用C#获取硬盘序列号,CPU序列号,网卡MAC地址的源码

    用C#获取硬盘序列号,CPU序列号,网卡MAC地址的源码...
    2007-03-03
  • 理解C#中的Lambda表达式

    理解C#中的Lambda表达式

    这篇文章主要介绍了理解C#中的Lambda表达式,本文用实例代码来讲解Lambda表达式,用不同的角度总结对它的认识,需要的朋友可以参考下
    2015-04-04
  • C# PDF Page操作设置页面切换按钮的方法

    C# PDF Page操作设置页面切换按钮的方法

    这篇文章主要介绍了C# PDF Page操作设置页面切换按钮的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • Unity的IPreprocessBuildWithReport实用案例深入解析

    Unity的IPreprocessBuildWithReport实用案例深入解析

    这篇文章主要为大家介绍了Unity的IPreprocessBuildWithReport实用案例深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论