整理 | 小耕家的喵大仙
出品 | CSDN(ID:lichao19897314)
Q Q | 978124155
往期知识回顾
(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自动化
(18)C#采集微信群成员信息-微信UI自动化(.Net)
(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