(19)批量添加微信好友-微信UI自动化(.Net+C#)

整理 | 小耕家的喵大仙

出品 | CSDN(ID:lichao19897314)

Q Q | 978124155

关联源码及工具下载icon-default.png?t=O83Ahttps://download.csdn.net/download/lichao19897314/90096681
往期知识回顾

(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自动化元素操作失败等也会出现对应的日志提示,供后期排查和完善。

实现思路
  1. 执行微信主面板“通讯录”按钮点击事件,切换到微信通讯录面板。
  2. 切换到通讯录后,寻找“添加朋友”按钮,执行点击事件。
  3. 继续寻找到“微信号/手机号”的文本搜索框,将需要添加的微信号或者手机号填写到搜索框中。
  4. 等待微信窗体的搜索结果列表出现,一般只会出现一个搜索结果项,执行该项的点击事件,等待微信结果的反馈。
  5. 根据点击该搜索项的结果判断是否存在该微信用户,如果不存在或者频率过快则终止本次好友添加或者本轮任务。
  6. 如果存在该微信号,则寻找微信号信息弹出面板(右边的弹出面板),如果发现面板中存在"添加至通讯录按钮"则代表该微信号不是你的好友,则可继续下一步,如果不存在该按钮,则代表该微信号已经存在你微信中,则终止本次好友添加。
  7. 执行“添加至通讯录”按钮点击事件,弹出“申请添加朋友”窗体。通过UI自动化对象找到该窗体,如果存在该窗体则执行下一步,不存在则终止本次好友添加。
  8. 在“申请添加朋友”窗体寻找到“发送添加朋友申请”,“备注名”,“标签”,“确定”等UI元素。
  9. “发送添加朋友申请”,“备注名”为文本框,直接设置文本值即可。
  10. “标签”为复选框集合面板,如果发现最后一个元素对象为Button,则代表有更多的标签,需要执行点击展开,展开后在复选框集合面板中寻找对应的标签控件,执行点击事件将该好友设置成对应的标签。
  11. 最后执行“确定”按钮点击事件,发送好友申请,执行下一轮等待操作后继续添加,因为不等待直接操作微信会提示操作频繁。
技术细节

以下代码都为实现思路中的核心代码,并不涉及到更多底层的实现。

查找对应微信号并执行搜索操作

		/// <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)icon-default.png?t=O83Ahttps://blog.csdn.net/lichao19897314/article/details/136784971

下一篇 (20)C#添加微信群成员为好友-微信UI自动化(.Net)icon-default.png?t=O83Ahttps://blog.csdn.net/lichao19897314/article/details/136938649

C#中实现UI自动化控制微信发送文件通常涉及到Windows API、WPF或UWP框架,以及第三方库如AutoIt、IronGUI等辅助工具,因为微信窗口不是标准控件,而是由原生窗口组成。这里提供一种基本的思路: 1. **安装必要的库**: 首先,你需要安装像`AutoIt.NET`这样的API,它允许编写脚本来操控非标准化的Windows界面。 2. **获取微信窗口句柄**: 使用AutoIt或其他类似工具,通过搜索窗口标题(比如“微信”)来获取到微信应用程序的主窗口句柄。 3. **定位发送按钮和文件选择框**: 然后,找到发送按钮和文件选择区域(可能是通过查找特定控件的坐标或名称),这需要了解微信UI布局。 4. **模拟用户操作**: 利用`AutoIt.NET`提供的函数,如`ControlSend`或`WinActivate`,可以模拟鼠标点击或键盘输入,模拟用户选择文件并点击发送按钮。 5. **发送文件**: 选择文件后,如果微信支持直接拖放或者有相应的发送文件功能,你可以尝试通过模拟拖拽文件到发送区域。 ```csharp using AutoIt; ... // 获取微信窗口句柄 IntPtr hWnd = Process.GetProcessesByName("WeChat")[0].MainWindowHandle; // 定位发送按钮和文件选择框 Control controlButton = Control.GetControlByTitle(hWnd, "发送"); Control controlFile = Control.GetControlByCoord(hWnd, /* 文件选择框坐标 */); // 模拟点击发送按钮 controlButton.Click(); // 模拟选择文件 string filePath = "路径_to_your_file"; ControlSend(hWnd, controlFile.Name, "{F6}", filePath); // 这里假设F6键用于打开文件浏览器 // 等待发送完成(如果需要) Sleep(2000); // 休眠一段时间等待发送过程结束 ``` 注意:以上代码仅为示例,实际操作可能会因微信版本更新或UI变化而有所不同。并且自动化微信发送文件可能涉及隐私和法律问题,务必谨慎使用,并遵守微信的服务条款。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QQ978124155

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值