整理 | 小耕家的喵大仙
出品 | 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#)
(17)自动采集微信聊天信息中的文件-微信UI自动化(.Net+C#)
(18)采集微信群成员信息-微信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的实现还是很少的!所以本文从技术角度出发一探微信清粉的流程。
软件视频和部分截图
本文的截图都是基于本人构建的成熟产品,如果有感兴趣的朋友可以联系我免费使用!
第一步:新建清粉任务(设置名称和选择需要清理的微信)
第二步:配置清粉任务(选择需要检测的联系人和清粉时发送的内容)
第三步:执行任务,等待清粉完毕
各位朋友如果时间允许可观看视频直观感受清粉的流程
微信清粉操作
实现思路
- 在清粉之前,我们需要采集到某个需要清粉微信的联系人详细信息,采集联系人可以参考 采集微信联系人
- 向指定的联系人发送一条自定义微信消息,等待几秒后如果出现“开启了朋友验证,你还不是他(她)朋友。请先发送朋友验证请求,对方验证通过后,才能聊天。发送朋友验证”,代表对方将你删除,如果出现“消息已发出,但被对方拒收了。”,代表对方将你拉黑。参考发送图文消息
- 检测到对方将你拉黑或者删除后,接下来我们需要点击聊天面板的"聊天信息"按钮,展开信息面板,点击对方头像后继续点击“更多”按钮,选择“删除联系人”菜单项执行点击后,弹出“是否删除确认框”,点击确定按钮即可完成清理操作。
技术实现
获取联系人和发送消息的实现在其它文字中已经描述,这里就不重复!
检查对方是否将您拉黑或者删除
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;
else
return 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