整理 | 小耕家的喵大仙
出品 | CSDN(ID:lichao19897314)
Q Q | 978124155
往期知识回顾
(19)C#添加微信好友(可批量添加)--微信UI自动化(.Net)
(20)将微信群成员添加为好友-微信UI自动化(.Net+C#)
👆😀以上文章是以往使用自动化方案操作微信的一些案例!如有兴趣请点击浏览!
因为文章可能无法满足读者要求,如需源码和支持请联系本人 QQ 978124155
本篇目的
今天一位做跨境电商行业朋友联系我,说他想将【微信通讯录】中的【微信群】和【微信好友】信息采集并导出到Excel中存档,防止客户数据丢失,其中【微信群】需要群名称和群成员数量,【微信好友】需要如下“昵称”,“微信名称”,“电话”,"标签","备注","朋友权限","来源","个性签名","地区"信息,通过分析微信窗体发现是能够采集并实现。
软件视频及截图
各位朋友如果时间允许可观看视频直观感受下添加微信群成员为好友的执行过程,更加直观清晰,本人将自动化速度调节的慢些,以便更加清晰的感受到自动化带来的魅力。
采集的【微信群】
采集的【微信好友】包括“昵称”,“微信名称”,“电话”,"标签","备注","朋友权限","来源","个性签名","地区"信息
实现思路
通过对微信UI分析,微信好友的详情信息在【通讯录面板】右边的【详情】中可采集到所有的信息,如何区分是【微信好友】还是【微信群】呢?我们通过对比发现两个面板中都有【发消息】的按钮,但是【发消息】按钮的位置是不一样的,通过这个可以区分我们当前选中的联系人是【微信好友】还是【微信群】。
-
执行点击微信主面板的【通讯录】按钮,切换窗体状态到通讯录
- 判断【通讯录列表】是否存在滚动条,如果存在滚动条则将滚动条位置设置到初始状态也就是最顶部的状态。
- 选中可视区域内的【通讯录列表】第一个项目,执行点击事件,将焦点设置到列表中。
- 执行键盘【Down】模拟按键发送,则【通讯录列表】中的选中联系人会随着按键发送而改变。
- 对右边【通讯录详情面板】做数据分析。
- 第一步先分析当前选中联系人是【微信群】还是【微信好友】,如果是其他类型则忽略。
- 如果是【微信群】则获取群名称和群人数。
- 如果是【微信好友】则获取对应的“昵称”,“微信名称”,“电话”,"标签","备注","朋友权限","来源","个性签名","地区"等信息。
- 如果当前信息不存在采集的缓存中,则继续模拟发送【Down】按键执行,如果当前信息存在采集的缓存中则代表有人为操作或者采集完毕,退出采集任务即可。
技术细节
定义微信联系人DTO对象
public class WeChatContractDetailDto
{
/// <summary>
/// 群组类型
/// </summary>
public WeChatContractType Type { get; set; }
/// <summary>
/// 联系人或者群组名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 群数量
/// </summary>
public int GroupNumber { get; set; }
/// <summary>
/// 微信号
/// </summary>
public string WeChatName { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string NickName { get; set; }
/// <summary>
/// 电话
/// </summary>
public string Mobile { get; set; }
/// <summary>
/// 标签
/// </summary>
public string Label { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 朋友权限
/// </summary>
public string Authority { get; set; }
/// <summary>
/// 来源
/// </summary>
public string Source { get; set; }
/// <summary>
/// 个性签名
/// </summary>
public string Sign { get; set; }
/// <summary>
/// 地区
/// </summary>
public string Address { get; set; }
}
public enum WeChatContractType
{
/// <summary>
/// 群组
/// </summary>
Group = 0,
/// <summary>
/// 联系人
/// </summary>
Contract = 1
}
采集【通讯录列表】
private void CollectionNew()
{
CurrentUIAuto.Focus();
ClickContacts();
var contractList = CurrentUIAuto.Find("/Pane/Pane[1]/Pane[2]/Pane/List");
if (contractList == null)
return;
contractList.Focus();
var child = contractList.FindAllChildren();
if (child.Count() <= 0)
return;
foreach (var item in child)
{
var wxName = item.Name;
if (!string.IsNullOrEmpty(wxName))
{
item.Click();
break;
}
}
Thread.Sleep(500);
int i = 0;
while (true)
{
contractList.Focus();
var current = AnalysisContract();
if (current != null)
{
if (current.Type == WeChatContractType.Group)
{
if (contacts.Count(item => item.Type == WeChatContractType.Group && item.Name == current.Name && item.GroupNumber == current.GroupNumber) > 0)
break;
}
if (current.Type == WeChatContractType.Contract)
{
if (contacts.Count(item => item.Type == WeChatContractType.Contract && item.Name == current.Name && item.WeChatName == current.WeChatName) > 0)
break;
}
contacts.Add(current);
}
i++;
if (i > 50)
{
break;
}
}
}
采集【通讯录联系人详情】
private WeChatContractDetailDto AnalysisContract()
{
var mainPanel = CurrentUIAuto.Find("/Pane/Pane[1]/Pane/Pane");
//群发送消息按钮
var groupSendMsgBtn = mainPanel.FindFirstByXPath("/Pane[2]/Button");
//联系人按钮
var contractSendMsgBtn = mainPanel.FindFirstByXPath(@"/Pane[2]/Button[1]");
WeChatContractDetailDto dto = null;
if (groupSendMsgBtn != null)
{
dto = new WeChatContractDetailDto() { Type = WeChatContractType.Group };
var title = mainPanel.FindFirstByXPath(@"/Pane[2]/Text")?.Name+"";
var index = title.LastIndexOf("(");
dto.Name=title.Substring(0,index);
var number=title.Substring(index,title.Length-index);
dto.GroupNumber =int.Parse( number.Replace("(", "").Replace(")", ""));
}
if (contractSendMsgBtn != null)
{
dto = new WeChatContractDetailDto() { Type = WeChatContractType.Contract };
var name = mainPanel.FindFirstByXPath(@"/Pane[2]/Pane[1]/Text");
dto.Name = name.Name;
#region 设置微信号 地区 昵称
var panel = mainPanel.FindFirstByXPath(@"/Pane[2]/Pane[2]");
foreach (var item in panel.FindAllChildren().ToList())
{
var type = item.FindFirstByXPath("/Pane/Text[1]").Name;
var value = item.FindFirstByXPath("/Pane/Text[2]").Name;
switch(type) {
case "微信号:":dto.WeChatName = value; break;
case "地区:": dto.Address= value; break;
case "昵称:": dto.NickName= value; break;
}
}
#endregion
#region 设置备注 标签 电话 朋友权限
var panel1 = mainPanel.FindFirstByXPath(@"/Pane/Pane[2]");
foreach (var item in panel1.FindAllChildren().ToList())
{
var type = item.FindFirstByXPath("/Text[1]").Name;
var value = item.FindFirstByXPath("/Text[2]").Name;
switch (type)
{
case "标签": dto.Label = value; break;
case "备注": dto.Remark = value; break;
case "电弧": dto.Mobile = value; break;
case "朋友权限": dto.Authority = value; break;
}
}
#endregion
#region 设置个性签名 来源
var panel2 = mainPanel.FindFirstByXPath(@"/Pane[3]");
foreach (var item in panel2.FindAllChildren().ToList())
{
var type = item.FindFirstByXPath("/Pane/Text[1]").Name;
var value = item.FindFirstByXPath("/Pane/Text[2]").Name;
switch (type)
{
case "个性签名": dto.Sign= value; break;
case "来源": dto.Source = value; break;
}
}
#endregion
}
return dto;
}
因为文章可能无法满足读者要求,如需源码和支持请联系本人 QQ 978124155
(21)批量删除微信联系人-微信UI自动化(.Net+C#)https://blog.csdn.net/lichao19897314/article/details/138169603