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

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

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

有问题联系Q: 591811930

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

                          

微信                                                                                  支付宝

C# PC版微信消息监听自动回复的更多相关文章

  1. 仿PC版微信的练手项目(可实时通讯)

    仿PC版微信的DEMO 本项目是由一个仿PC版微信的vue前端项目,和一个使用leancloud进行数据存储的.提供WebSocket的node后端项目构成. 本项目使用的技术栈:vue + vue- ...

  2. XMPP——Smack[2]会话、消息监听、字体表情和聊天窗口控制

    连接之后,拿到了connection,通过它可以搞定会话 建立一个会话 MessageListener msgListener = new MessageListener() { public voi ...

  3. Java ActiveMQ 讲解(二)Spring ActiveMQ整合+注解消息监听

    对于ActiveMQ消息的发送,原声的api操作繁琐,而且如果不进行二次封装,打开关闭会话以及各种创建操作也是够够的了.那么,Spring提供了一个很方便的去收发消息的框架,spring jms.整合 ...

  4. spring与activemq(三种消息监听方式)

    1.3     消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageListener.Sessio ...

  5. 多线程消息监听容器配置[ 消费者spring-kafka配置文件]

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. 详细解读:远程线程注入DLL到PC版微信

    一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以 ...

  7. 简单消息监听容器--SimpleMessageListenerContainer

    这个类非常强大,我们可以对他做很多设置,对于消费者的配置项,这个类都可以满足监听队列(多个队列).自动启动.自动声明功能可以设置事务特性.事务管理器.事务属性.事务容量(并发).是否开启事务.回滚消息 ...

  8. 读取PC版微信数据库(电脑版微信数据库)内容

    原始网址   https://www.cnblogs.com/Charltsing/p/WeChatPCdb.html 1.PC版微信的密钥是32位byte,不同于安卓版(7位字符串) 2.通过OD或 ...

  9. 聊天框Demo:DotNetCore+ActiveMQ+Mqttjs 实现前后台消息监听

    网上查了查 ActiveMQ + .net core 的例子很少,自己做一个demo 作为记录,另外FineUI Core基础版要来了,出来后我会用FineUI再做一版,为知识星球的引流... 1.安 ...

随机推荐

  1. MySql大小写配置

    新安装mysql5.7版本后,linux环境下默认是大小写敏感的.可以在客户端执行以下命令: SHOW VARIABLES LIKE '%case%' 可以看到 lower_case_table_na ...

  2. 括号序列的dp问题模型

    括号序列的dp问题模型 Codeforces314E ◦给定一个长度为n的仅包含左括号和问号的字符串,将问号变成左括号或 右括号使得该括号序列合法,求方案总数. ◦例如(())与()()都是合法的括号 ...

  3. AcWing:238. 银河英雄传说(带权并查集)

    有一个划分为N列的星际战场,各列依次编号为1,2,…,N. 有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列. 有T条指令,每条指令格式为以下两种之一: 1.M i j,表示让第i号战 ...

  4. mysql 查看当前正在执行的语句

    查看当前正在执行的语句 show processlist:show processlist; 结束正在执行的语句进程 kill 进程id

  5. 反省——关于csp-s模拟50

    本人于搜索csp-s模拟49题解时,有意识地点开了一篇关于csp-s模拟50T2的题解,并知道了题解是二维前缀和以及四维偏序. 更重要的是,那篇博客说有解法二,叫二维莫队. 于是我上网搜索二维莫队,结 ...

  6. 第十四周课程总结&实验报告(简单记事本的实现)

    1.JDBC概述 JDBC提供了一种与平台无关的用于执行SQL语句的标准JavaAPI,可以方便的实现多种关系型数据库的统一操作,它由一组用Java语言编写的类和接口组成 主要常用操作类与接口: ja ...

  7. Qt自定义窗口部件

    QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)   改进法   1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和Hexs ...

  8. django-admin 配置

    本节讲django-admin配置方法: 1.在工程配置文件中(settings.py)中启用admin组件.确保有如下两行配置: 2.执行数据库迁移的命令,确保对应的表在数据库中已经添加了 #pyt ...

  9. pm2 配合log4js处理日志

    1.pm2启动时通常会发现log4js记录不到日志信息: 2.决解方案,安装pm2的pm2-intercom进程间通信模块 3.在log4js的配置文件logger.js里添加如下命令: pm2: t ...

  10. 加载大图片的OOM异常

    * 原因:系统分配给应用程序的堆内存 < 图片的大小* 解决方案:缩放图片显示* OOM:OutOfMemoryError * 图片的宽高 * 宽 2400 * 高 3200 * 手机屏幕的宽高 ...