往期知识回顾
(1)C#开启探索微信自动化之路-微信UI自动化
(2)C#创建微信窗体自动化实例-微信UI自动化
(3)C#针对系统热键管理-微信UI自动化
(4)C#采集微信通讯录和联系人-微信UI自动化
(5)C#实现针对微信窗体鼠标静默点击-微信UI自动化
(6)C#搜索微信通讯录联系人-微信UI自动化
(7)C#实现微信消息群发-微信UI自动化
(8)C#监控微信进程运行状态-微信UI自动化
(9)C#监控微信网络连接状态-微信UI自动化
(11)C#实现微信窗体尺寸跟随调整-微信UI自动化
(12)C#采集微信聊天记录及历史消息-微信UI自动化
(13)C#实现自动回复微信消息-微信UI自动化
(14)C#针对微信界面元素截图操作-微信UI自动化
(15)C#实现对微信窗体的行为管控-微信UI自动化
(16)C#实现微信多开-微信UI自动化
(17)C#实现微信聊天文件接收及下载-微信UI自动化
👆😀以上文章是以往使用自动化方案操作微信的一些案例!如有兴趣请点击浏览!
因为文章可能无法满足读者要求,如需源码和支持请联系本人 QQ 978124155
本篇目的
近日一位同行,他对象是做保险业务的,经常需要大量添加微信好友来做业务扩展,非常枯燥,他说他对象经过半个月的手工添加感觉非常累,还有几千上万个的微信号需要添加,后续还会陆续新增,工作量巨大,他说他在博客园上看到了我的文章,说想实现基于UI自动化批量添加微信好友功能。
我经过沟通整理的需求如下,通过微信的添加朋友按钮切换搜索微信号界面,自动填写需要搜索微信号,如果存在账号,则点击“添加到通讯录”,弹出申请添加朋友界面,自动填写“发送添加朋友申请”,“备注名”,“标签”这些常规信息后点击确认按钮完成申请好友的操作。
经过对微信窗体的研究,发现是可行的,所以完成了该功能,并交付给他。
经过半个月的磨合和速度调整,已经彻底解放了他对象的双手。实现全自动化操作。
软件视频及截图
各位朋友如果时间允许可观看视频感受下软件添加微信好友的执行过程,更加直观清晰,本人将自动化速度调节的慢些,以便更加清晰的感受到自动化带来的魅力。
先模拟添加两位微信好友,点击确定将会根据构造的信息自动执行添加好友的任务。
自动化程序会将申请信息填写至对应的微信窗体UI元素中,并点击确定发送申请。
执行添加好友任务完毕后会有相对应的结果反馈,如果出现微信号不存在,操作频率过高,UI自动化元素操作失败等也会出现对应的日志提示,供后期排查和完善。
实现思路
- 执行微信主面板“通讯录”按钮点击事件,切换到微信通讯录面板。
- 切换到通讯录后,寻找“添加朋友”按钮,执行点击事件。
- 继续寻找到“微信号/手机号”的文本搜索框,将需要添加的微信号或者手机号填写到搜索框中。
- 等待微信窗体的搜索结果列表出现,一般只会出现一个搜索结果项,执行该项的点击事件,等待微信结果的反馈。
- 根据点击该搜索项的结果判断是否存在该微信用户,如果不存在或者频率过快则终止本次好友添加或者本轮任务。
- 如果存在该微信号,则寻找微信号信息弹出面板(右边的弹出面板),如果发现面板中存在"添加至通讯录按钮"则代表该微信号不是你的好友,则可继续下一步,如果不存在该按钮,则代表该微信号已经存在你微信中,则终止本次好友添加。
- 执行“添加至通讯录”按钮点击事件,弹出“申请添加朋友”窗体。通过UI自动化对象找到该窗体,如果存在该窗体则执行下一步,不存在则终止本次好友添加。
- 在“申请添加朋友”窗体寻找到“发送添加朋友申请”,“备注名”,“标签”,“确定”等UI元素。
- “发送添加朋友申请”,“备注名”为文本框,直接设置文本值即可。
- “标签”为复选框集合面板,如果发现最后一个元素对象为Button,则代表有更多的标签,需要执行点击展开,展开后在复选框集合面板中寻找对应的标签控件,执行点击事件将该好友设置成对应的标签。
- 最后执行“确定”按钮点击事件,发送好友申请,执行下一轮等待操作后继续添加,因为不等待直接操作微信会提示操作频繁。
技术细节
以下代码都为实现思路中的核心代码,并不涉及到更多底层的实现。
查找对应微信号并执行搜索操作
/// <summary>
/// 查找好友
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public bool FindAddFriend(string name)
{
ClickContactsButton();
Thread.Sleep(200);
ClickAddFriendButton();
Thread.Sleep(200);
GetSearchElement();
if (Search != null)
{
SystemLog.Info("开始查找联系人【" + name + "】");
//设置搜索框的值
ClickSetInputValue(new WeChatInputMsgEntity { Info = name, Type = WXMessageType.Text }, Search);
//寻找搜索列表项目
var element = GetSearchFriendResultElement("搜索:"+name);
if (element != null)
{
SystemLog.Info("查找【" + name + "】成功,开始发送消息");
//执行好友添加点击操作
UI_WX_Window.Current.ClickElement(element);
return true;
}
else
{
SystemLog.Info("查找【" + name + "】失败");
return false;
}
}
return false;
}
在搜索成功后弹出微信信息面板中执行”添加至通讯录“的点击,弹出”申请添加朋友“窗体
private bool ExecuteClickAddFriendElement(AddWeChatFriendEntity newFriend)
{
var addPanel = UI_WX_Window.Current.ShowFriendInfoPanel();
if (addPanel != null)
{
var addButton = addPanel.FindFirstByXPath("/Pane[1]/Pane/Pane/Pane[1]/Pane[2]/Button");
if (addButton != null)
{
addButton.Click();
Thread.Sleep(400);
return SendAddFriendRequest(newFriend);
}
else
{
newFriend.Log = "添加至通讯录按钮不存在,该微信可能为您的好友已经";
}
}
else
{
newFriend.Log = "添加微信号至通讯录面板未找到";
}
return false;
}
控制"申请添加朋友"窗体的基类,设置“发送添加朋友申请”,“备注名”,“标签”,“确定”的值和点击事件
/// <summary>
/// 控制申请好友面板发送好友请求(添加好友和群添加好友)
/// </summary>
public abstract class UI_WX_SendFriendRequest_Task : UI_WX_Element_Base_Task
{
/// <summary>
/// 每个输入控制的休眠时间
/// </summary>
public int SleepTick { get { return 600; } }
/// <summary>
/// 发送好友请求
/// </summary>
/// <param name="newFriend"></param>
/// <returns></returns>
protected bool SendAddFriendRequest(AddWeChatFriendEntity newFriend)
{
var addFriendWindow = UI_WX_Window.Current.GetAddFriendWindow();
if (addFriendWindow != null)
{
#region 设置验证消息
if (!string.IsNullOrEmpty(newFriend.ValidText))
{
var vaildEdit = addFriendWindow.FindFirstByXPath("/Pane[2]/Pane[1]/Pane/Pane[1]/Pane/Edit");//验证文本框
if (vaildEdit != null)
{
DoubleClickSetInputValue(new WeChatInputMsgEntity
{
Type = WXMessageType.Text,
Info = newFriend.ValidText
}, vaildEdit, true);
}
Thread.Sleep(SleepTick);
}
#endregion
#region 设置备注名称
if (!string.IsNullOrEmpty(newFriend.RemarkName))
{
var remarkEdit = addFriendWindow.FindFirstByXPath("/Pane[2]/Pane[1]/Pane/Pane[2]/Pane/Edit");//备注名
if (remarkEdit != null)
{
DoubleClickSetInputValue(new WeChatInputMsgEntity
{
Type = WXMessageType.Text,
Info = newFriend.RemarkName
}, remarkEdit, true);
}
Thread.Sleep(SleepTick);
}
#endregion
#region 设置标签
if (!string.IsNullOrEmpty(newFriend.Label))
{
var labelElement = addFriendWindow.FindFirstByXPath("/Pane[2]/Pane[1]/Pane/Pane[3]/Pane[2]");//标签面板
if (labelElement != null)
{
var childCheckSource = labelElement.FindAllChildren();
var lastCheckElement = childCheckSource[childCheckSource.Length - 1];
if (lastCheckElement.ControlType == FlaUI.Core.Definitions.ControlType.Button)
{
//执行点击
lastCheckElement.Click();
Thread.Sleep(SleepTick);
}
childCheckSource = labelElement.FindAllChildren();
foreach (var child in childCheckSource)
{
if (child.Name == newFriend.Label)
{
child.Click();
Thread.Sleep(SleepTick);
break;
}
}
}
}
#endregion
#region 添加
var sumbitButton = addFriendWindow.FindFirstByXPath("/Pane[2]/Pane[1]/Button[1]");//确定
if (sumbitButton != null)
{
sumbitButton.Click();
Thread.Sleep(SleepTick);
return true;
}
else
{
newFriend.Log = "添加朋友请求面板确定按钮不存在,无法添加";
}
#endregion
}
else
{
newFriend.Log = "添加朋友请求面板不存在,请关闭多余微信窗体重试";
}
return false;
}
}
因为文章中很多基类和通用方法无法具体描述,如需源码和支持请联系本人 QQ 978124155
(18)C#采集微信群成员信息-微信UI自动化(.Net)https://blog.csdn.net/lichao19897314/article/details/136784971