(23)实时采集微信消息(基于主窗体)-微信UI自动化(.Net+C#)

news2024/12/23 0:10:04

整理 | 小耕家的喵大仙

出品 | 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 

本种采集方式的优缺点

      有同学私聊我希望通过一种【静默无感知】的情况下获取到微信的实时消息,所以在该种需求下我们只能通过监控微信主窗体的【聊天】列表来获取可视区域范围内的尽可能多的实时消息。

      首先这里需要强调一下,使用该种方式获取实时消息会有一些限制,如果对消息完整性不强的同学可以使用本种方式,比较快捷和容易实现,为什么会这样说呢,该方式的缺陷如下

  1. 如果某个用户批量发送多条消息,那么【聊天】列表中只会显示最后一条消息,会导致中间的消息丢失。
  2. 如果同时给你发送消息的好友或者群特别多,本来历史消息积压比较严重,可能导致实时消息超出可视区域,那么就会丢失不在可视区域范围内的消息。
  3. 如果当前微信主窗体被用户切换到其他位置,导致【聊天】列表不在可视区域中,那么就会导致无法接受实时消息。

      上面介绍了本种方式的缺点,但是优点也很明显,就是实现上简单,且无需和微信窗体主动交互大大增强了软件与用户的交互性,在面对一些消息量不大的个人微信场景个人觉得是足够了。

软件视频和部分截图

各位朋友如果时间允许可观看视频直观感受下软件的执行过程,会更加直观清晰,本人将自动化速度调节的慢些,以便更加清晰的感受到自动化带来的魅力。

通过监控微信主窗体【聊天】列表框控件我们软件中得到的实时消息。通过两张图片中的数据对比发现实时消息是准确的在满足特定条件的情况下。

实现思路
  1. 判断微信主窗体【聊天】功能区域是否在可视区域中。如果在则继续下面逻辑,不在则循环监听。
  2. 遍历【聊天】列表中的所有listitem项的内容,内容包含消息发送人名称,消息内容,时间。
  3. 如果是公众号这类通知则忽略。
  4. 如果发现本消息发送人不存在缓存中,则将本记录添加到缓存,继续读取列表下一条记录。
  5. 如果发现本消息发送人存在缓存中,则判断与缓存中消息内容是否一致,如果一致则代表是旧消息,如果不一致则代表是新消息。
  6. 将新消息通过事件的方式通知软件显示或者做其他业务处理。
技术细节

判断【聊天】列表是否在可视区域中

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#)icon-default.png?t=N7T8https://blog.csdn.net/lichao19897314/article/details/138498543

(24)实时采集微信消息(基于独立窗体)-微信UI自动化(.Net+C#)icon-default.png?t=N7T8https://blog.csdn.net/lichao19897314/article/details/138630885

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1657670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux调试

文章目录 1. 使用打印来调试1.1 重定向1.2 标准预定义宏1.3 日志代码 2. 内核异常2.1 内核打印2.1.1 打印级别2.1.2 跟踪异常2.1.3 动态打印2.1.4 RAM console 2.2 OOPS2.2.1 有源代码的情况2.2.2 没有源代码的情况 3 查看日志4 工具调试 1. 使用打印来调试 1.1 重定向 2>…

HDLbits 刷题 -- Exams/m2014 q3

Consider the function f shown in the Karnaugh map below. Implement this function. d is dont-care, which means you may choose to output whatever value is convenient. 译&#xff1a;考虑下面卡诺图中显示的函数f。 实现这个函数。D是dont-care&#xff0c;这意味着…

【数据结构】栈(Stack)和队列(Queue)

文章目录 栈一、栈的概念及结构二、栈的特点三、栈的实现1.初始化栈2.判断栈空3.入栈4.出栈5.取栈顶元素6.栈的元素个数7.销毁 队列一、队列的概念及结构二、队列的特点三、队列的实现1.初始化2.入队3.出队4.判断队空5.取队头元素6.取队尾元素 总结 栈 一、栈的概念及结构 栈…

Python ValueError: bad transparency mask

修改前 修复后 运行正常 from PIL import Image# 读取图片 #报错信息解决ValueError: bad transparency mask--相关文档地址https://blog.csdn.net/kalath_aiur/article/details/103945309 #1. 检查 alpha 通道是否是一个有效的掩码。如果不是&#xff0c;则需要对 alpha 通道…

随机梯度下降SGD的理解和现象分析

提出问题&#xff1a;令人疑惑的损失值 在某次瞎炼丹的过程中&#xff0c;出现了如下令人疑惑的损失值变化图像&#xff1a; 嗯&#xff0c;看起来还挺工整&#xff0c;来看看前10轮打印的具体损失值变化&#xff1a; | epoch 1 | iter 5 / 10 | time 1[s] | loss 2.3137 |…

Hadoop3:HDFS的Shell操作(常用命令汇总)

一、简介 什么是HDFS的Shell操作&#xff1f; 很简单&#xff0c;就是在Linux的终端&#xff0c;通过命令来操作HDFS。 如果&#xff0c;你们学习过git、docker、k8s&#xff0c;应该会发现&#xff0c;这些命令的特点和shell命令非常相似 二、常用命令 1、准备工作相关命令…

【VTKExamples::Rendering】第一期 TestAmbientSpheres(环境照明系数)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TestAmbientShperes,介绍环境照明系数对Actor颜色的影响,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动…

Qt模型视图代理之QListView使用的简单介绍

往期回顾&#xff1a; Qt绘图与图形视图之Graphics View坐标系的简单介绍_graphics view 坐标系-CSDN博客 Qt模型视图代理之MVD(模型-视图-代理)概念的简单介绍-CSDN博客 Qt模型视图代理之QTableView应用的简单介绍-CSDN博客 Qt模型视图代理之QListView使用的简单介绍 一、最…

视频监控平台:交通运输标准JTT808设备SDK接入源代码函数分享

目录 一、JT/T 808标准简介 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;协议特点 1、通信方式 2、鉴权机制 3、消息分类 &#xff08;三&#xff09;协议主要内容 1、位置信息 2、报警信息 3、车辆控制 4、数据转发 二、代码和解释 &#xff08;一…

电商核心技术揭秘53:社群营销的策略与实施

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

手机传输助手有哪些?如何快速互传文件?

手机已经成为我们生活和工作中不可或缺的一部分&#xff0c;而手机传输助手&#xff0c;作为一种帮助我们在不同设备之间快速、方便地共享文件的工具&#xff0c;其重要性不言而喻。无论是在工作中需要将文件从电脑传输到手机&#xff0c;还是在生活中想要与朋友分享美好的瞬间…

【智能算法】人工原生动物优化算法(APO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.获取代码 1.背景 2024年&#xff0c;X Wang受到自然界原生动物启发&#xff0c;提出了人工原生动物优化算法&#xff08; Artificial Protozoa Optimizer, APO&#xff09;。 2.算法原理 2.1算法思想 AP…

一文玩转Vue3参数传递——全栈开发之路--前端篇(8)

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

导弹追踪效果实现_unity基础开发教程

Unity开发中导弹追踪的原理与实现 前言原理逻辑实现导弹逻辑目标赋值 应用效果结语 前言 ⭕在之前的一个项目的开发中&#xff0c;需要加入一个导弹追踪的游戏功能&#xff0c;且还要实现不规则发射路径&#xff0c;但是这种功能是第一次做&#xff0c;经过查阅资料和询问做过的…

java io包

InputStream InputStream 是 Java I/O 中所有输入流的抽象基类&#xff0c;它定义了读取字节流的基本方法。InputStream 类提供了许多子类&#xff0c;用于从不同的数据源读取数据&#xff0c;如文件、网络连接、内存等。 InputStream 提供了以下常用的方法&#xff1a; int…

Magic Studio Eraser API使用教程

AI橡皮擦 - 使用网址 Magic Studio的AI橡皮擦功能非常好用&#xff0c;能去除图片中的杂物。但是网页版只支持低分辨率下载&#xff0c;想要原图就得开会员&#xff0c;价格不菲。 不过官网其实提供了API接入方式&#xff0c;并且有100次的免费试用机会 API接入网站 在这里可…

PyQt6--Python桌面开发(3.运行QTDesigner生成的ui文件程序)

运行QTDesigner生成的ui文件程序 用QTDesigner设计一个简单的UI 保存ui文件&#xff0c;放到项目里面去 通过pyqt6包里面的uic来加载ui文件 import sysfrom PyQt6.QtWidgets import QApplication from PyQt6 import uicif __name__ __main__:appQApplication(sys.argv)uiui…

C++对象引用作为函数参数

使用对象引用作为函数参数最常见&#xff0c;它不但有指针作为参数的优点&#xff0c;而且比指针作为参数更简单、更方便。 引用方式进行参数传递&#xff0c;形参对象就是实参对象的“别名”&#xff0c;对形参的操作其实就是对实参的操作。 例如:用对象引用进行参数传…

基于Springboot的校园悬赏任务平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园悬赏任务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

1010: 折半查找的实现

解法&#xff1a; #include<iostream> #include<vector> using namespace std; void solve() {int n;cin >> n;vector<int> vec(n);for (int& x : vec) cin >> x;int x;cin >> x;int l 0, r n-1, cnt 0;while (l < r) {cnt;int…