(26)微信检查联系人和清粉(针对删除和拉黑)-微信UI自动化(.Net+C#)

 

整理 | 小耕家的喵大仙

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

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

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

👆😀以上文章是以往使用自动化方案操作微信的一些案例!如有兴趣请点击浏览!

因为文章可能无法满足读者要求,如需源码和支持请联系本人 QQ 978124155 

本篇目的

      最近很多小伙伴跟我反馈能不能做一个检测微信联系人是否将自己删除和拉黑的功能,其实这个本来是一个很低频的行为,但是很多销售类岗位在工作中使用微信作为工具来进行营销或者客户关系维护,日积月累过程中就会出现对方将您删除或者拉黑的情况,同时这类客户也将占用我们微信联系人的名额,而且我们是不知道谁删除或者拉黑了我们了,所以本文使用自动化RPA技术来帮助您自动检测对方是否将您删除或者拉黑,如果检测到对方删除或者拉黑您,RPA服务也将自动将对方删除。当然市面上的产品也不再少数,但是基于RPA的实现还是很少的!所以本文从技术角度出发一探微信清粉的流程。

软件视频和部分截图

本文的截图都是基于本人构建的成熟产品,如果有感兴趣的朋友可以联系我免费使用!

第一步:新建清粉任务(设置名称和选择需要清理的微信)

第二步:配置清粉任务(选择需要检测的联系人和清粉时发送的内容)

第三步:执行任务,等待清粉完毕

各位朋友如果时间允许可观看视频直观感受清粉的流程

微信清粉操作

 实现思路
  1. 在清粉之前,我们需要采集到某个需要清粉微信的联系人详细信息,采集联系人可以参考 采集微信联系人
  2. 向指定的联系人发送一条自定义微信消息,等待几秒后如果出现“开启了朋友验证,你还不是他(她)朋友。请先发送朋友验证请求,对方验证通过后,才能聊天。发送朋友验证”,代表对方将你删除,如果出现“消息已发出,但被对方拒收了。”,代表对方将你拉黑。参考发送图文消息
  3. 检测到对方将你拉黑或者删除后,接下来我们需要点击聊天面板的"聊天信息"按钮,展开信息面板,点击对方头像后继续点击“更多”按钮,选择“删除联系人”菜单项执行点击后,弹出“是否删除确认框”,点击确定按钮即可完成清理操作。
 技术实现

获取联系人和发送消息的实现在其它文字中已经描述,这里就不重复!

检查对方是否将您拉黑或者删除

public class VaildContractDelete
{public UI_WX_Window CurrentUIAuto { get; set; }//private bool isVaild { get; set; } = false;//private bool deleteResult = false;/// <summary>/// 对方是否删除了你(一个实例只允许验证一次 提高性能)/// </summary>/// <returns></returns>public bool QueryDelete(WeChatContractEntity contract){//if(isVaild)return deleteResult;Thread.Sleep(3000);var chatList = CurrentUIAuto.Find("/Pane/Pane[2]/Pane/Pane/Pane/Pane/Pane[2]/Pane[1]/Pane/List");if (chatList == null)return false;var childs = chatList.FindAllChildren();if (childs.Length > 0){var last = childs[childs.Length - 1];if (last != null){if (last.Name.Contains("开启了朋友验证,你还不是他(她)朋友。请先发送朋友验证请求,对方验证通过后,才能聊天。发送朋友验证")){contract.IsDelete = true;contract.Save();return true;}if (last.Name.Contains("消息已发出,但被对方拒收了。")){contract.IsBlacklist = true;contract.Save();return true;}}}return false;}
}

如果检测到了删除或者拉黑执行删除操作

public class UI_WX_Delete_Friend_Task : UI_WX_Search_Element_Operate
{ /// <summary>/// 验证是否在好友中/// </summary>public List<ClearTaskContractDBEntity> DeleteSource { get; set; }public ClearTaskDBEntity CurrentClearTask { get; set; }/// <summary>///  删除/// </summary>public bool Delete(){if (State == TaskState.Stop)State = TaskState.Runing;elsereturn false;if (DeleteSource == null || DeleteSource.Count <= 0) { return false; }base.Execute();foreach (var current in DeleteSource){if (State != TaskState.Runing)break;var getTaskWeChat = WeChatWindowSourceManager.Main.GetWeChatInName(current.TaskWeChat);CurrentUIAuto = UI_WX_Window_Factory.Instance(getTaskWeChat);CurrentUIAuto.AddMouseRandomMoveTrack = CurrentClearTask.Check == true ? false : true;var contract = current.GetContract();var searchValue = AIWeContractName.AI(contract);try{CheckPanel();if (!FindContract(searchValue)){SaveError(current, "未找到该联系人");continue;}RandomSleep(500, 1000);if (!ClickChatHistory()){SaveError(current, "打开聊天信息面板失败");continue;}RandomSleep(500, 1000);if (!ClickPopupContractHeader(searchValue)){SaveError(current, "点击联系人头像失败");continue;}RandomSleep(500, 1000);if (!ClickPopupMenu(contract)){SaveError(current, "点击更多弹出菜单失败");continue;}RandomSleep(500, 1000);if (!ClickDeleteMenuItem()){SaveError(current, "点击删除联系人菜单项失败");continue;}RandomSleep(500, 1000);if (!ClickConfirmDelete()){SaveError(current, "点击删除联系人确定按钮失败");continue;}RandomSleep(500, 1000);//将弹出的面板通过双击隐藏ClickChatButton();RandomSleep(300,500);ClickChatButton();SaveSuccess(current);}catch (Exception ex){SaveError(current, "执行删除失败"+ex.Message);LogService.Error("检查【" + searchValue.SearchValue + "】失败" + ex.Message);LogService.RemoteLog("检查【" + searchValue.SearchValue + "】失败" + ex.Message + ex.StackTrace);}}TaskExecuteCompleted();Stop();return true;}private void SaveSuccess(ClearTaskContractDBEntity current){var task = new ClearTaskRepository().GetById(current.ClearTaskId);if (task != null){if (current.Result == ClearContractResult.Black)task.SaveBlackDelete(current);if (current.Result == ClearContractResult.Remove)task.SaveRemoveDelete(current);var contract = current.GetContract();contract.IsEnable = false;contract.Save();}}private void SaveError(ClearTaskContractDBEntity current,string log){var task = new ClearTaskRepository().GetById(current.ClearTaskId);if (task != null){task.SaveError(current, log);}}/// <summary>/// 点击【更多】按钮弹出菜单/// </summary>/// <param name="weChatContract"></param>/// <returns></returns>private bool ClickPopupMenu(WeChatContractEntity weChatContract) {var sendMsgBtn1 = CurrentUIAuto.Window.FindFirstByXPath("/Pane[1]/Pane[1]/Pane[2]/Pane/Pane/Pane/Pane[5]/Pane[2]/Button[1]");//企业微信用户var sendMsgBtn2 = CurrentUIAuto.Window.FindFirstByXPath("/Pane[1]/Pane[1]/Pane[2]/Pane/Pane/Pane/Pane[4]/Pane[2]/Button[1]");//个人微信用户var name = sendMsgBtn1?.Name;var name1 = sendMsgBtn2?.Name;if (name == "发消息" || name1 == "发消息"){var s = new Contract_Detail_Panel().BuildInfo(CurrentUIAuto.Window.FindFirstByXPath("/Pane[1]/Pane[1]/Pane[2]/Pane/Pane"));//是好友可以执行删除var moreButton = CurrentUIAuto.Window.FindFirstByXPath("/Pane[1]/Pane[1]/Pane[2]/Pane/Pane/Pane/Pane[1]/Pane/Pane[1]/Button");if (moreButton == null){LogService.Error("联系人详情面板【更多】按钮元素为空,清除联系人失败", Log.Dto.LogBusinessType.ClearFriend);return false;}if (!string.IsNullOrEmpty(weChatContract.WeChatName)){if (weChatContract.WeChatName == s.WeChatName){LogService.Info("开始点击联系人详情面板【更多】按钮", Log.Dto.LogBusinessType.ClearFriend);MoveClick(moreButton);return true;}}else{if ((!string.IsNullOrEmpty(weChatContract.Name) &&( weChatContract.Name == s.Name || weChatContract.NickName == s.Name)) ||(!string.IsNullOrEmpty(weChatContract.Remark) && weChatContract.Remark == s.Remark) ||(!string.IsNullOrEmpty(weChatContract.NickName) && weChatContract.NickName == s.NickName)){LogService.Info("开始点击联系人详情面板【更多】按钮", Log.Dto.LogBusinessType.ClearFriend);MoveClick(moreButton);return true;}}LogService.Error("联系人详情面板信息跟当前要清理的联系人信息不一致,清除失败", Log.Dto.LogBusinessType.ClearFriend);}else{LogService.Error("该联系人【" + weChatContract.Name + "】无发送消息按钮,清除失败", Log.Dto.LogBusinessType.ClearFriend);}return false;}/// <summary>/// 点击删除联系人男/// </summary>/// <returns></returns>private bool ClickDeleteMenuItem() {var moreButton = CurrentUIAuto.Window.FindFirstByXPath("/Pane[1]/Pane[1]/Menu/Pane[2]/List[1]");var menuItems = moreButton.FindAllChildren().ToList();foreach (var item in menuItems){if (item.Name == "删除联系人"){LogService.Info("开始点击【删除联系人】菜单按钮", Log.Dto.LogBusinessType.ClearFriend);MoveClick(item);return true;}}LogService.Error("未找到【删除联系人】菜单按钮,清理失败", Log.Dto.LogBusinessType.ClearFriend);return false;}/// <summary>/// 点击确认删除按钮/// </summary>/// <returns></returns>private bool ClickConfirmDelete(){ var currentRPAUIElement = CurrentUIAuto.FindChatInfoPopupPanel("/Pane[1]/Pane[1]/Pane[2]/Pane[2]/Button[1]");if (currentRPAUIElement == null){LogService.Error("【确认删除】按钮元素为空,清除联系人失败", Log.Dto.LogBusinessType.ClearFriend);return false;}LogService.Info("开始点击【确认删除】按钮", Log.Dto.LogBusinessType.ClearFriend);MoveClick(currentRPAUIElement);return true;}/// <summary>/// 点击右侧弹出面板的用户头像/// </summary>/// <returns></returns>private bool ClickPopupContractHeader(AIWeChontractDto searchValue){var currentRPAUIElement = CurrentUIAuto.FindChatInfoPopupPanel("/Pane[2]/Pane/Pane/Pane/Pane/Pane/List/ListItem[1]");if (currentRPAUIElement == null){LogService.Error("【用户头像】元素为空,清除联系人失败", Log.Dto.LogBusinessType.ClearFriend);return false;}LogService.Info("开始点击【用户头像】,弹出用户详情面板", Log.Dto.LogBusinessType.ClearFriend);MoveClick(currentRPAUIElement);return true;}public override void Stop(){UserContext.Current.SetStopCheckContractPanel();base.Stop();}
}

因为文章可能无法满足读者要求,如需源码和支持请联系本人 QQ 978124155  

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UI自动化测试:遍历页面元素并获取文本的实践分享!

遍历读取元素的文本 在写UI自动化过程中还会遇到需要遍历读取元素的情况。下面分享以「稿定设计」网站为例&#xff0c;想要通过UI自动化读取素材内容的操作菜单列表&#xff0c;如下图&#xff1a; 代码片段和解释 # 获取菜单列表元素的文本信息&#xff0c;例如&#xff1a…

算法基础及例题

1、双指针 维护区间信息、子序列匹配、利用序列有序性、单项链表找环双指针 - OI Wiki (oi-wiki.org) 盛最多水的容器https://leetcode.cn/problems/container-with-most-water/ public class Solution {public int maxArea(int[] height) {int l 0, r height.length - 1;int…

泡泡玛特2024半年报发布:首度划分四大品类 手办收入占比首次低于60%

8月20日&#xff0c;泡泡玛特发布2024上半年业绩报告。报告显示&#xff0c;2024年上半年泡泡玛特国际集团实现营收45.6亿元&#xff08;人民币&#xff0c;下同&#xff09;&#xff0c;同比增长62.0%&#xff0c;经调整后净利10.2亿元&#xff0c;同比增长90.1%。 上半年泡泡…

MacOS升级ruby版本

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 升级Ruby版本在MacOS上相对简单&#xff0c;但需要一些基础的命令行知识。本文将详细介绍如何在MacOS上升级Ruby版本&#xff0c;包括使用常见的版本管理工具、解决可能遇到的问题、以及确保你的环境配置不会受到影响。…

第二百零九节 Java格式 - Java数字格式类

Java格式 - Java数字格式类 以下两个类可用于格式化和解析数字: java.text.NumberFormatjava.text.DecimalFormat NumberFormat 类可以格式化一个数字特定地区的预定义格式。 DecimalFormat 类可以格式化数字以特定区域设置的自定义格式。 NumberFormat类的 getXXXInstance…

宠物空气净化器怎么选?新手必看猫用除毛空气净化器热门品牌推荐

作为资深铲屎官来说&#xff0c;一到换毛季节&#xff0c;家里的猪咪经常会出现掉毛的情况&#xff0c;而且如果不勤打扫的话&#xff0c;粑粑的臭味也挺重的。如果长期不清理家里的浮毛&#xff0c;很容易就会得鼻炎。 看了身边好几个铲屎官都在用宠物空气净化器&#xff0c;…

什么牌子的开放式耳机性价比高?五款高口碑精品推荐!

由于传统入耳式耳机可能对耳道健康造成长期影响&#xff0c;许多人开始偏好选择开放式耳机的非侵入式设计。这种耳机有助于减少耳内湿润、细菌增长&#xff0c;以及耳道闷热的不适感。为了帮助大家在众多产品中挑选合适的开放式耳机&#xff0c;我将列举一些市场反馈良好的款式…

Android10.0 人脸解锁流程分析

人脸解锁概述 人脸解锁即用户通过注视设备的正面方便地解锁手机或平板。Android 10 为支持人脸解锁的设备在人脸认证期间添加了一个新的可以安全处理相机帧、保持隐私与安全的人脸认证栈的支持&#xff0c;也为安全合规地启用集成交易的应用&#xff08;网上银行或其他服务&am…

TikTok本土店海外仓发货总超时?EasyBoss ERP支持提前申请面单助力解决

近期有部分通过海外仓自发货的TikTok本土卖家表示&#xff1a;通过ERP推送订单至海外仓却无法立即出库&#xff0c;导致超出平台规定发货时间被平台处罚。 而出现这样的原因在于&#xff1a;通过ERP处理的TikTok订单&#xff0c;在使用认证的海外仓发货时&#xff0c;订单会先…

【C++ Primer Plus习题】2.2

问题: 解答: #include <iostream> using namespace std;#define LONG_TO_MA 220int main() {double distance 0;cout << "请输入距离(单位为long):";while (true){cin >> distance;if (cin.fail()){cout << "输入有误!请输入数字:&qu…

Redis 集群三主三从配置

1&#xff1a;安装 Redis安装Linux ubuntu_ubuntu离线安装redis7.2.5-CSDN博客 2&#xff1a;主从复制配置 参考 Redis主从同步配置-CSDN博客 3&#xff1a;哨兵配置 参考 Redis 哨兵模式配置-CSDN博客 4&#xff1a;集群配置 Redis 集群三主三从配置-CSDN博客 5&…

OpenCV与AI深度学习 | 使用OpenCV图像修复技术去除眩光

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;使用OpenCV图像修复技术去除眩光 眩光是一种因过度和不受控制的亮度而引起的视觉感觉。眩光可能会使人丧失能力或只是让人感到不舒服。眩光是一…

【一起学Rust | 框架篇 | Tauri2.0框架】tauri中rust和前端的相互调用(rust调用前端)

文章目录 前言1. rust中调用前端2. 如何向前端发送事件3. 前端监听事件4. 执行js代码 前言 近期Tauri 2.0 rc版本发布&#xff0c;2.0版本迎来第一个稳定版本&#xff0c;同时官方文档也进行了更新。Tauri是一个使用Rust构建的框架&#xff0c;可以让你使用前端技术来构建桌面…

Redis7基础篇(九)

springboot集成redis 目录 springboot集成redis 总体概述 java连接redis常见问题 集成jedis 集成lettuce 集成redistemplate 连接单机 ​编辑​编辑​编辑redis集群 总体概述 java要想连接mysql的话需要jdbc java想要连接redis也需要中间件 jedis是第一代 lettuce第…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第三篇:登录功能优化

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

钓鱼的常见几种方式

钓鱼的多种方式 office钓鱼攻击 宏与宏病毒 # 宏 宏是office自带的一种高级脚本特性&#xff0c;通过VBA代码&#xff0c;可以在office中去完成某项特定的任务&#xff0c;而不必再重复相同的动作&#xff0c;目的是让用户文档中一些任务自动化# 宏病毒 宏病毒是一种寄存在文…

linux笔记1

命令格式 命令行界面的提示符解析&#xff1a; [rootlocalhost ~]# root位置&#xff1a; 登录用户名 &#xff1a; 连接符号 localhost位置: 本机的主机名 ~位置: 当前的所在位置 #位置&#xff1a; 表示是超级管理员还是普通用户 超级管…

RPA自动化流程机器人助力企业财务数字化转型

在数字经济时代&#xff0c;企业需要快速响应市场变化&#xff0c;而财务数字化转型是企业适应现代商业环境、提升竞争力的必要步骤。财务数字化转型不仅涉及企业财务能力的提升&#xff0c;推动了财务管理与决策模式的转变。RPA自动化流程机器人因其能通过自动化技术帮助企业实…

超声波水表是什么?量程比又是什么?

一、超声波水表概述 1.定义&#xff1a; 超声波水表是一种利用超声波技术来测量水流速度&#xff0c;进而计算出流经管道的水体积流量的计量设备。它通过发送和接收超声波信号的时间差来确定水流的速度&#xff0c;从而精确地计量水的流量。 2.工作原理&#xff1a; 超声波…

Android 架构模式之 MVC

目录 架构设计的目的对 MVC 的理解Android 中 MVC 的问题试吃个小李子ModelViewController 大家好&#xff01; 作为 Android 程序猿&#xff0c;MVC 应该是我们第一个接触的架构吧&#xff0c;从开始接触 Android 那一刻起&#xff0c;我们就开始接触它&#xff0c;可还记得我…