整理 | 小耕家的喵大仙
出品 | CSDN(ID:lichao19897314)
Q Q | 978124155
往期知识回顾
(1)开启探索微信自动化之路-微信UI自动化(.Net+C#)
(2)初始化微信窗体UI自动化实例-微信UI自动化(.Net+C#)
(3)采用热键终止微信采集任务-微信UI自动化(.Net+C#)
(4)采集微信通讯录和联系人-微信UI自动化(.Net+C#)
(5)实现对微信窗体元素静默操作-微信UI自动化(.Net+C#)
(6)搜索特定微信通讯录联系人-微信UI自动化(.Net+C#)
(7)定时群发微信图文消息-微信UI自动化(.Net+C#)
(8)监控微信进程运行状态-微信UI自动化(.Net+C#)
(9)监控微信网络连接状态-微信UI自动化(.Net+C#)
(10)实现微信窗体自动跟随移动-微信UI自动化(.Net+C#)
(11)实现微信窗体尺寸跟随自动调整-微信UI自动化(.Net+C#)
(12)采集微信消息记录及历史消息-微信UI自动化(.Net+C#)
(13)自动回复微信聊天消息-微信UI自动化(.Net+C#)
(14)微信窗体元素截图操作-微信UI自动化(.Net+C#)
(15)针对微信主窗体的行为控制-微信UI自动化(.Net+C#)
(16)微信多开-微信UI自动化(.Net+C#)
(17)自动采集微信聊天信息中的文件-微信UI自动化(.Net+C#)
(18)采集微信群成员信息-微信UI自动化(.Net+C#)
(19)批量添加微信好友-微信UI自动化(.Net+C#)
(20)批量将微信群成员添加为好友-微信UI自动化(.Net+C#)
(21)批量删除微信联系人-微信UI自动化(.Net+C#)
(22)采集微信通讯录详情面板-微信UI自动化(.Net+C#)
👆😀以上文章是以往使用自动化方案操作微信的一些案例!如有兴趣请点击浏览!
因为文章可能无法满足读者要求,如需源码和支持请联系本人 QQ 978124155
本种采集方式的优缺点
有同学私聊我希望通过一种【静默无感知】的情况下获取到微信的实时消息,所以在该种需求下我们只能通过监控微信主窗体的【聊天】列表来获取可视区域范围内的尽可能多的实时消息。
首先这里需要强调一下,使用该种方式获取实时消息会有一些限制,如果对消息完整性不强的同学可以使用本种方式,比较快捷和容易实现,为什么会这样说呢,该方式的缺陷如下
- 如果某个用户批量发送多条消息,那么【聊天】列表中只会显示最后一条消息,会导致中间的消息丢失。
- 如果同时给你发送消息的好友或者群特别多,本来历史消息积压比较严重,可能导致实时消息超出可视区域,那么就会丢失不在可视区域范围内的消息。
- 如果当前微信主窗体被用户切换到其他位置,导致【聊天】列表不在可视区域中,那么就会导致无法接受实时消息。
上面介绍了本种方式的缺点,但是优点也很明显,就是实现上简单,且无需和微信窗体主动交互大大增强了软件与用户的交互性,在面对一些消息量不大的个人微信场景个人觉得是足够了。
软件视频和部分截图
各位朋友如果时间允许可观看视频直观感受下软件的执行过程,会更加直观清晰,本人将自动化速度调节的慢些,以便更加清晰的感受到自动化带来的魅力。
通过监控微信主窗体【聊天】列表框控件我们软件中得到的实时消息。通过两张图片中的数据对比发现实时消息是准确的在满足特定条件的情况下。
实现思路
- 判断微信主窗体【聊天】功能区域是否在可视区域中。如果在则继续下面逻辑,不在则循环监听。
- 遍历【聊天】列表中的所有listitem项的内容,内容包含消息发送人名称,消息内容,时间。
- 如果是公众号这类通知则忽略。
- 如果发现本消息发送人不存在缓存中,则将本记录添加到缓存,继续读取列表下一条记录。
- 如果发现本消息发送人存在缓存中,则判断与缓存中消息内容是否一致,如果一致则代表是旧消息,如果不一致则代表是新消息。
- 将新消息通过事件的方式通知软件显示或者做其他业务处理。
技术细节
判断【聊天】列表是否在可视区域中
var currentChatList = UI_WX_Window.Current.Find("/Pane/Pane[1]/Pane[2]/Pane/Pane/Pane/List");
if (currentChatList == null || currentChatList.ControlType != FlaUI.Core.Definitions.ControlType.List)
{
Thread.Sleep(1000);
continue;
}
定义一个存储消息的DTO对象
/// <summary>
/// 微信实时消息对象
/// </summary>
public class WXRealMsgEntity
{
/// <summary>
/// 主控件名称
/// </summary>
public string ListItemName { get; set; }
/// <summary>
/// 发送消息的微信用户
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 消息内容
/// </summary>
public string CurrentMessage { get; set; }
/// <summary>
/// 实时消息数量
/// </summary>
public string Count { get; set; }
/// <summary>
/// 接收最后一条消息的时间
/// </summary>
public string Time { get; set; }
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
获取【列表】中的消息并判断是否是新消息需要提醒
var messageList = currentChatList.FindAllChildren().ToList();
var tempMessageSource = new List<WXRealMsgEntity>();
foreach (var item in messageList)
{
if (item.ControlType != FlaUI.Core.Definitions.ControlType.ListItem)
{
continue;
}
var listName = item.Name;
var buttonName = item.FindFirstByXPath("/Pane[1]/Button")?.Name + "";//发送消息人
var lastMessage = item.FindFirstByXPath("/Pane/Pane[2]/Text")?.Name + "";//消息内容
var time = item.FindFirstByXPath("/Pane/Pane/Pane[1]/Text[2]")?.Name + "";
var count = item.FindFirstByXPath("/Pane/Text")?.Name + "";
var messageitem = historyMessageSource.FirstOrDefault(s => s.UserName == buttonName);
if (messageitem == null)
{
messageitem = new WXRealMsgEntity { ListItemName = listName, UserName = buttonName, Time = time, CurrentMessage = lastMessage, Count = count };
historyMessageSource.Add(messageitem);
}
var cnt = historyMessageSource.Count(s => s.UserName == buttonName
&& s.CurrentMessage == lastMessage
&& s.Time == time
&& s.Count == count);
if (cnt == 0)
{
//新消息通知
InputTaskMessage(messageitem.UserName + "发送给新消息你:" + lastMessage);
messageitem.CurrentMessage = lastMessage;
messageitem.Time = time;
messageitem.Count = count;
}
}
因为文章可能无法满足读者要求,如需源码和支持请联系本人 QQ 978124155
(22)采集微信通讯录好友明细信息-微信UI自动化(.Net+C#)https://blog.csdn.net/lichao19897314/article/details/138498543
(24)实时采集微信消息(基于独立窗体)-微信UI自动化(.Net+C#)https://blog.csdn.net/lichao19897314/article/details/138630885