前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RPA之基于FlaUI的微信发送消息给某人

RPA之基于FlaUI的微信发送消息给某人

作者头像
沙漠尽头的狼
发布于 2022-06-13 04:42:31
发布于 2022-06-13 04:42:31
1.3K00
代码可运行
举报
文章被收录于专栏:Dotnet9Dotnet9
运行总次数:0
代码可运行

本文由网友蓝创精英团队投稿,欢迎转载、分享 原文作者:蓝创精英团队 原文链接:https://kesshei.blog.csdn.net/article/details/124955177


目的

一直想实现微信的群发功能,但是,没有实现,原因有一条是怕违法,记得某某公司因为破解了微信的接口巴拉巴拉,然后,被告了。罚了N多钱。

这个时候,我想,如果我基于RPA技术,那么,就不会对微信有任何影响啊,毕竟,我只是模拟我的电脑操作,微信公司也识别不到我的行为是非法的。

那么,这个行为可能就是基于安全的方式的技术了。

所以,我就尝试了一下,同时也借鉴了网络上的资料,给我了一些启发


一、FlaUI是什么?

FlaUI 是一个基于微软 UIAutomation 技术 从Windows Vista开始推出的一套全新UI自动化测试技术, 简称UIA。在最新的Windows SDK中,UIA和MSAA等其它支持UI自动化技术的组件放在一起发布,叫做Windows Automation API

UIA定义了全新的、针对UI自动化的接口和模式。分别是支持对UI元素进行遍历和条件化查询的TreeWalker/FindAll。定义了读写UI元素属性的UIA Property, 包括Name、 ID、Type、ClassName、Location、 Visibility等等。定义了UI元素行为的UIA Pattern, 比如Select、Expand、Resize、 Check、Value等等。还引入了UIA Event接口,可以让测试程序在某些事件发生后得到通知,比如新窗口打开事件等

目前 FlaUI所用的为UIA2和UIA3两种技术。我这里主要用的是UIA3

二、使用步骤

1.引入Nuget包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Install-Package FlaUI.UIA3 -Version 3.2.0

2.实现一个简单的给指定人发送消息

代码如下(示例):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Process[] processes = Process.GetProcessesByName("WeChat");
if (processes.Count() != 1)
{
 Console.WriteLine("微信未启动或启动多个微信");
}
else
{
 //1.附加到微信进程
 using (var app = Application.Attach(processes.First().Id))
 {
  using (var automation = new UIA3Automation())
  {
   //2.获取主界面
   var mainWindow = app.GetMainWindow(automation);
   Console.WriteLine("获取主界面");
   //3.切换到通讯录
   var elements = mainWindow.FindAll(FlaUI.Core.Definitions.TreeScope.Subtree, TrueCondition.Default);
   var addressBook = mainWindow.FindFirstDescendant(cf => cf.ByName("通讯录"));
   addressBook.DrawHighlight(System.Drawing.Color.Red);
   var path = Debug.GetXPathToElement(addressBook);
   Console.WriteLine("点击通讯录");
   addressBook.Click();

   //4.搜索
   string target = "文件传输助手";
   var searchTextBox = mainWindow.FindFirstDescendant(cf => cf.ByName("搜索")).AsTextBox();
   searchTextBox.Click();
   Keyboard.Type(target);
   Keyboard.Type(VirtualKeyShort.RETURN);
   Console.WriteLine("搜索目标对象");

   //5.切换到对话框
   Thread.Sleep(500);

   var searchList = mainWindow.FindFirstDescendant(cf => cf.ByName("搜索结果"));
   if (searchList != null)
   {
    var searchItem = searchList.FindAllDescendants().FirstOrDefault(cf => cf.Name == target && cf.ControlType == FlaUI.Core.Definitions.ControlType.ListItem);
    searchItem?.DrawHighlight(System.Drawing.Color.Red);
    searchItem?.AsListBoxItem().Click();
   }
   else
   {
    Console.WriteLine("没有搜索到内容");
   }
   Thread.Sleep(500);
   //6.输入文本
   string sendMsg = "这个是我微信的输入信息:" + DateTime.Now.ToString();
   var msgInput = mainWindow.FindFirstDescendant(cf => cf.ByName("输入")).AsTextBox();
   msgInput?.Click();
   System.Windows.Forms.Clipboard.SetText(sendMsg);
   Keyboard.TypeSimultaneously(new[] { VirtualKeyShort.CONTROL, VirtualKeyShort.KEY_V });
   var sendBtn = mainWindow.FindFirstDescendant(cf => cf.ByName("sendBtn"));
   sendBtn?.DrawHighlight(System.Drawing.Color.Red);
   sendBtn?.Click();
  }
 }
}

代码有注释也容易理解。

就是搜索指定人,然后,发送指定信息给他。搞定。

图示效果如下:


3.实现一个获取会话列表批量发送消息

代码如下(示例):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Process[] processes = Process.GetProcessesByName("WeChat");
if (processes.Count() != 1)
{
 Console.WriteLine("微信未启动或启动多个微信");
}
else
{
 //1.附加到微信进程
 using (var app = Application.Attach(processes.First().Id))
 {
  using (var automation = new UIA3Automation())
  {
   //2.获取主界面
   var mainWindow = app.GetMainWindow(automation);
   Console.WriteLine("获取主界面");
   //3.切换到聊天目录
   var elements = mainWindow.FindAll(TreeScope.Subtree, TrueCondition.Default);
   var addressBook = mainWindow.FindFirstDescendant(cf => cf.ByName("聊天"));
   addressBook.DrawHighlight(System.Drawing.Color.Red);
   var path = Debug.GetXPathToElement(addressBook);
   addressBook.Click();
   Console.WriteLine("切换到聊天");
   Thread.Sleep(2000);
   //4.获取聊天列表
   //只发前六个
   var count = 0;
   var searchTextBox = mainWindow.FindFirstDescendant(cf => cf.ByName("会话")).AsListBoxItem();
   while (searchTextBox != null)
   {
    var list = searchTextBox.FindAllChildren();
    foreach (var item in list)
    {
     count++;
     var name = item.Name;
     item.Click();
     var type = item.ControlType;
     item.DrawHighlight(System.Drawing.Color.Red);
     var MsgSend = mainWindow.FindFirstDescendant(cf => cf.ByName("输入")).AsTextBox();
     var MsgSendButton = mainWindow.FindFirstDescendant(cf => cf.ByName("sendBtn"));
     if (MsgSend != null && MsgSendButton != null)
     {
      MsgSend.Click();
      System.Windows.Forms.Clipboard.SetText($"群发消息,请忽略:{DateTime.Now}");
      Keyboard.TypeSimultaneously(new[] { VirtualKeyShort.CONTROL, VirtualKeyShort.KEY_V });
      MsgSendButton.Click();
      Console.WriteLine($"发送信息:{name}");
      Thread.Sleep(500);
     }
     if (count == 6)
     {
      break;
     }
    }
    if (count == 6)
    {
     break;
    }
    for (int i = 0; i < list.Length; i++)
    {
     searchTextBox.Focus();
     Keyboard.Press(VirtualKeyShort.DOWN);
     Thread.Sleep(100);
    }
    searchTextBox = mainWindow.FindFirstDescendant(cf => cf.ByName("会话")).AsListBoxItem();
    Thread.Sleep(2000);
   }
  }
 }
}

这个代码重要是群发给了前6个人,如果会话没有发送按钮,就不会发送,避免影响更多人。

图示效果如下:

录了好几次。。最后还有人把我把我删掉了,尴尬。

4.FlaUI 如何获取页面的信息

打开这个FlaUinspect工具

FlaUInspect[1]

可以通过 以下看到 XPath地址

这个FlaUinspect项目是一个WPF项目,想深入研究的可以查看源码,跟踪调试一波。

这里主要的是可以通过以下两种方式来获取所需要的内容

第一种就像下面的一样,通过同一个页面独一无二的名字来获取到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var addressBook = mainWindow.FindFirstDescendant(cf => cf.ByName("聊天"));

第二种是这样的

可以通过 图上面的2的XPath地址来找到你想要的控件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var infoData = automationElement.FindAllByXPath("/Pane/Pane[1]");

总结

总的来说,这个技术还是很方便的,但是对于QQ这种底层是自绘技术的以及是使用QT,JAVA级的应用应该是实现不了。只能针对于微软的技术的产品WinFrom和WPF等。

大体来讲,还是降低了使用时候的难度的。

比如这个微信发送信息,你有功能了,你就可以自己扩展,比如,指定人发,群发,定时发,标签发送,实现完,对个人来讲,作用也是不错的。

参考资料

[1]

FlaUInspect: https://github.com/FlaUI/FlaUInspect

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Dotnet9 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FlaUI:.NET 自动化测试 Windows 应用的强大工具
FlaUI 是一个基于微软 UIAutomation 技术的 .NET 库,主要用于对 Windows 应用程序(如 Win32、WinForms、WPF 等)进行自动化 UI 测试。它提供了强大的元素查找和交互功能,支持多种框架,并且易于使用和定制。内部采用异步调用以提高效率,社区也非常活跃。
郑子铭
2025/03/10
2630
FlaUI:.NET 自动化测试 Windows 应用的强大工具
c# 温故而知新: 线程篇(一) 下
Abort 方法: 其实 Abort 方法并没有像字面上的那么简单,释放并终止调用线程,其实当一个线程调用 Abort方法时,会在调用此方法的线程上引发一个异常: ThreadAbortException ,让我们一步步深入下对这个方法的理解: 1 首先我们尝试对主线程终止释放 static void Main(string[] args) { try { Thread.CurrentThread.Abort
逸鹏
2018/04/10
6830
c# 温故而知新: 线程篇(一) 下
【愚公系列】2023年02月 .NET CORE工具案例-Lib.Harmony之AOP拦截
API拦截是指通过拦截某个应用程序编程接口(API)的调用,限制或控制程序的功能和行为。它通常是在应用程序和操作系统之间进行拦截,以防止应用程序访问某些操作系统功能或资源。
愚公搬代码
2023/03/16
6140
【愚公系列】2023年02月 .NET CORE工具案例-Lib.Harmony之AOP拦截
原 Expression Trees学习
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Windows.Forms; using System.Threading; namespace Expressionss
魂祭心
2018/05/17
8610
快学会这个技能-.NET API拦截技法
前言翻译自一个国外的文章,他写的更容易让人理解 - Hacking .NET – rewriting code you don’t control:
沙漠尽头的狼
2023/02/21
8790
快学会这个技能-.NET API拦截技法
基于windowsphone7的控制ppt播放 第一部分 服务器端
最近突然想起了一个学长的一个利用手机控制ppt播放的一个创意,并想将其在windows phone7上实现一下。 经过几天的努力已经可以控制ppt的播放,暂停,上一张,下一张了,并且电脑会将当前ppt的截图发送到手机端这里。 在代码的编写过程中,参考了IT黄老邪的Windows Phone开发(46):与Socket有个约会 进行服务端与wp客户端的socket通讯的编写,并加入了键盘消息模拟,服务端截屏,图片发送,与客户端的图片接受。 代码如下: WP客户端 1、新建Windows Phone应用程序项目
magicsoar
2018/02/06
9550
基于windowsphone7的控制ppt播放 第一部分 服务器端
CSharp通过Websocket传输图片在WEB端显示及传递鼠标事件
这个代码示例提供了三个按钮,分别用于模拟鼠标的移动、点击和拖拽操作。在 btnMove_Click 中,我们首先获取当前鼠标光标的位置,并将其向右下角移动 10 个像素,然后等待 500 毫秒,最后将鼠标光标移回原来的位置。在 btnClick_Click 中,我们模拟了鼠标左键按下和抬起的事件。在 btnDrag_Click 中,我们模拟了鼠标的拖拽事件。
码客说
2023/05/31
8250
SignalR第一节-在5分钟内完成通信连接和消息发送
首先声明,这又是一个小白从入门到进阶系列。 SignalR 这个项目我关注了很长时间,中间好像还看到过微软即将放弃该项目的消息,然后我也就没有持续关注了,目前的我项目中使用的是自己搭建的 WebSocket ,连接管理和消息推送都是统一维护;前段时间编写了 Asp.NETCore 轻松学系列,现在腾出了一点时间,抱着学习的心态,想把自己学习 SignalR 的过程写出来,就当笔记吧,再做笔记的过程中再加入实际的项目需求,一步一步的深入学习 SignalR ,正所谓技多不压身吧。有想要一起学习的同学,可以关注我,大家一起学习,一起进步。
梁规晓
2019/04/11
1.5K0
SignalR第一节-在5分钟内完成通信连接和消息发送
WPF桌面端开发-音视频录制、获取缩略图(使用OpenCvSharp)
音视频分开录制,音频如果麦克风和扬声器都录制的话,也要分开录制,最后再合并所有的流。
码客说
2023/07/11
1.8K0
mqttnet 详解_vs2017通过mqttnet创建mqtt服务端 客户端
public partial class MQTTNetService : ServiceBase
全栈程序员站长
2022/09/12
1.5K0
C# WinForm 界面控件
1.首先插入新的子窗体form1,并设置IsMdiContainer = True 属性。
王 瑞
2022/12/28
3.4K0
C# WinForm 界面控件
使用Html5多媒体实现微信语音功能
随着微信等社交App的兴起,语音聊天成为很多App必备功能,大到将语音聊天作为主要功能的社交App,小到电商App的语音客服、店小二功能,语音聊天成为了必不可少的方式。
前端大彬哥
2019/05/29
2.9K0
WPF开发-使用WebView2加载页面及页面交互
WebView2和CEF相比,在WPF中CEF相当于把渲染的界面生成图片再加载,而WebView2则没有这一步,性能有显著提升。
码客说
2022/06/12
10.2K0
WPF开发-使用WebView2加载页面及页面交互
dotnet 后台线程发送 X11 窗口消息
核心是通过 XSendEvent 发送消息,发送消息想要有反应需要另开 XOpenDisplay 获取 display 对象,最后再将其关闭才能发送出去
林德熙
2024/05/16
2040
1.5万字长文:从 C# 入门 Kafka(生产者)
在第三章中,我们学习到了 Kafka C# 客户端的一些使用方法,学习了如何编写生产者程序。
郑子铭
2023/02/12
1.3K0
1.5万字长文:从 C# 入门 Kafka(生产者)
.NET面试题系列[7] - 委托与事件
C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影。C#中如果没有了事件,那绝对是一场灾难,令开发者寸步难行。而委托又是事件的基础,可以说是C#的精髓,个人认为,其地位如同指针之于C语言。
s055523
2018/09/14
1.2K0
.NET面试题系列[7] - 委托与事件
.Net Core工作流WorkFlowCore
WorkFlowCore是一个针对.NetCore的轻量级的工作流引擎,提供了FluentAPI、多任务、持久化以及并行处理的功能,适合于小型工作流、责任链的需求开发。支持工作流长期运行,提供了各种持久化方式。
郑子铭
2023/09/19
5460
.Net Core工作流WorkFlowCore
使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream
Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的. description变量在每个子类里面都需要设置(表示对咖啡的描述).
solenovex
2022/05/10
5390
使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream
c#异步编程-Task(二)
大家好,本次继续分享自己的学习经历。本文主要分享Task异步编程内容,如果能帮助大家希望多多关注文章末尾的微信公众号和知乎三连。各位举手之劳是对我更新技术文章最大的支持。
JusterZhu
2022/12/07
2.6K0
c#异步编程-Task(二)
庖丁解牛——深入解析委托和事件
这篇博文我不讲委托和事件的概念,因为大段的文字概念没有任何意义。 具体想了解,委托和事件的概念可以MSDN查阅。 我这篇文章的主题思路是委托如何一步步进化成事件: 何为委托--->委托来实现事件--->用方法对委托的封装--->Event的 add,remove方法的引入--->标准事件写法--->反编译探究竟。 用几个例子以及Reflector反编译探究委托和事件的关系。不足之处,还望多多指教... 何为委托: 首先,委托是一种类型,是一种定义了方法签名的类型。 委托可以理解为函数指针(安全
用户1161731
2018/03/12
1.1K0
庖丁解牛——深入解析委托和事件
推荐阅读
相关推荐
FlaUI:.NET 自动化测试 Windows 应用的强大工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验