/// <summary> /// 单个手机发群消息 /// </summary> /// <param name="viewModel"></param> /// <param name="wmPoint"></param> public void SendMessageToGroup(WXActionViewModel viewModel) { //获取当前手机的分辨率 var wmPoint = _baseAction.GetWMSize(viewModel.Device); _baseAction.UnlockSingleScreen(viewModel.Device); OpenWX(viewModel.Device); ////右边的加号 _baseAction.actionDirectStr(viewModel.Device, 700, 100, wmPoint); ///点击发起群聊 _baseAction.actionDirectStr(viewModel.Device, 680, 200, wmPoint); //检测是否进入发起群聊 会一直检测 _baseAction.CircleDetection("SelectContactUI", viewModel.Device, false); ///点击选择一个群 _baseAction.actionDirectStr(viewModel.Device, 400, 360, wmPoint); //检测是否进入选择群聊界面 会一直检测 _baseAction.CircleDetection("GroupCardSelectUI", viewModel.Device, false); ///分析页面布局 _baseAction.CreatUIXML(new WXActionViewModel() { Device = viewModel.Device, XMLName = "groupChatList" }, (o, doc) => { return(AnalysisGroupChatList(o, doc)); }); }
public void FromDetailPageToValidatePage(WXActionViewModel viewModel, Action <bool> currentAction = null, WMPoint wmPoint = null) { var isSuccess = true; ///可以执行下去 if (!viewModel.IsGoOn) { return; } ///点击添加到通讯录按钮 或者 验证通过按钮 _baseAction.InitProcessWithTaskState(viewModel.Device, string.Format("shell input tap {0} {1}", (viewModel.LeftWidth + viewModel.RightWidth) / 2, (viewModel.TopHeight + viewModel.BottomHeight) / 2)); ///检测是直接变成好友 还是进入验证页面 var isContinueing = true; while (isContinueing) { var list = _baseAction.InitProcessWithTaskState(viewModel.Device, " shell dumpsys window | grep mCurrentFocus", true); if (null == list || list.Count == 0) { isSuccess = false; isContinueing = false; } ///检测是否进入验证页面 if (string.Join("|", list).Contains("SayHiWithSnsPermissionUI")) { isSuccess = true; isContinueing = false; } ///检测是否直接变成 发送消息 else { var returnData = _baseAction.CreatUIXML(viewModel, (o, doc) => { return(CheckIsTurnDirectlyNewFriend(doc)); }); ///表示 就是直接变成发消息 不用验证 if (returnData.IsValidatedState) { isSuccess = false; isContinueing = false; } } } if (isSuccess) { ///进入的是打招呼界面 isSuccess = EnterSayHelloActivity(viewModel, wmPoint); if (null != currentAction) { currentAction.Invoke(isSuccess); } } }
/// <summary> /// 查看当天打过招呼的好友的状态 /// </summary> public WXActionViewModel DeleteFriend(WXActionViewModel viewModel) { var model = _baseAction.CreatUIXML(viewModel, (o, doc) => { ///表示添加 或者 接受 按钮 var currentModel1280 = doc.SelectSingleNode("//node[contains(@bounds,'[584,383][704,443]')]"); var currentModel1920 = doc.SelectSingleNode("//node[contains(@bounds,'[876,559][1056,649]')]"); var innerXml = string.Empty; Action <string> func = (xml) => { if (xml.Contains("添加") || xml.Contains("接受")) { o.IsValidatedState = true; } else { var firstIndex = innerXml.IndexOf("?"); var lastIndex = innerXml.LastIndexOf("?"); if ((lastIndex - firstIndex) == 1) { o.IsValidatedState = true; } } }; if (currentModel1280 != null) { innerXml = currentModel1280.InnerXml; func(innerXml); } else if (currentModel1920 != null) { innerXml = currentModel1920.InnerXml; func(innerXml); } else { o.IsValidatedState = false; } return(o); }); return(model); }
/// <summary> /// 单个加好友 /// </summary> public void SingleAddFriend(WXActionViewModel viewModel) { //获取当前手机的分辨率 var wmPoint = _baseAction.GetWMSize(viewModel.Device); EnterNewFriendPageAction(viewModel, wmPoint); ///搜索 if (viewModel.IsSearch) { AddFriendWithSearch(viewModel, wmPoint); } else { AddFriendWithContracts(viewModel, wmPoint); } }
/// <summary> /// 检测设备中是否有新朋友 /// </summary> public IList <string> CheckEquipmentIsHaveNewsFriend() { var devices = _baseAction.Devices; var equipmentDevices = new Lazy <List <string> >(); var taskList = new Lazy <List <Task> >(); if (null == devices || devices.Count == 0) { return(default(List <string>)); } foreach (var device in devices) { var task = Task.Factory.StartNew(() => { var currentViewModel = new WXActionViewModel() { Device = device }; var wmPoint = _baseAction.GetWMSize(device); EnterNewFriendPageAction(new WXActionViewModel() { Device = device }, wmPoint); currentViewModel = IsHaveNewFriend(currentViewModel); if (currentViewModel.IsValidatedState) { equipmentDevices.Value.Add(device); } }); taskList.Value.Add(task); } Task.WaitAll(taskList.Value.ToArray()); return(equipmentDevices.Value); }
/// <summary> /// 分析 打招呼页面 XML文档 /// </summary> public WXActionViewModel ValiDateSayHelloPage(XmlDocument doc, WXActionViewModel viewModel) { var node = doc.SelectSingleNode("//node[contains(@bounds,'[24,146][696,228]')]"); var node1920 = doc.SelectSingleNode("//node[contains(@bounds,'[36,204][1044,326]')]"); var bounds = string.Empty; if (null == node && node1920 == null) { viewModel.IsValidatedState = false; return(viewModel); } if (node == null) { node = node1920; } ///验证申请 设置备注 填入备注 XmlNodeList nodeList = node.ParentNode.ParentNode.ChildNodes; var text = node.Attributes["text"].Value; ///打招呼 if (text.Length == 15) { viewModel.IsValidatedState = true; bounds = nodeList[2].ChildNodes[0].Attributes["bounds"].Value; } else { viewModel.IsValidatedState = false; bounds = nodeList[1].ChildNodes[0].Attributes["bounds"].Value; } viewModel = _baseAction.GetStartBoundsWithEndBounds <WXActionViewModel>(viewModel, bounds, (o) => { return(o); }); return(viewModel); }
/// <summary> /// 单条判断通讯录是否有好友 /// </summary> /// <returns></returns> public WXActionViewModel IsHaveNewFriend(WXActionViewModel viewModel) { viewModel.XMLName = "isHaveNewFriend"; var model = _baseAction.CreatUIXML(viewModel, (o, doc) => { Func <XmlNode> _pointFunc = () => { return(doc.SelectSingleNode("//node[contains(@bounds,'[116,539][340,583]')]")); }; Func <XmlNode> _textFunc = () => { return(doc.SelectSingleNode("//node[@text='添加手机联系人']")); }; if (null != _pointFunc.Invoke() || null != _textFunc.Invoke()) { o.IsValidatedState = false; } else { o.IsValidatedState = true; } return(o); }); ///记录设备新朋友状态 Task.Factory.StartNew(() => { SingleHepler <NewFriendStateBLL> .Instance.SaveChange(new NewFriendStateViewModel() { Device = viewModel.Device, IsImportContracts = false, IsHaveNewFriend = model.IsValidatedState }); }); return(model); }
/// <summary> /// 添加好友添加纪录 /// </summary> /// <param name="doc"></param> /// <param name="viewModel"></param> public void AddFriendInfoRecord(WXActionViewModel viewModel) { Task.Factory.StartNew(() => { //XmlNode nickNode = doc.SelectSingleNode("//node[contains(@bounds,'[204,214]') and contains(@resource-id,'com.tencent.mm:id')]"); var nick = string.Empty; SingleHepler <AddFriendInfoRecordBLL> .Instance.Insert(new AddFriendInfoRecord() { CreateDate = DateTime.Now, DataSource = viewModel.RemarkContent, Nick = nick, Sex = Convert.ToInt32(viewModel.Sex), Device = viewModel.Device }); }); }
//进入新朋友页面 public void EnterNewFriendPageAction(WXActionViewModel viewModel, WMPoint wmPoint = null) { _baseAction.UnlockSingleScreen(viewModel.Device); OpenWX(viewModel.Device, wmPoint); //viewModel.PullNativePath = string.Format(@"{0}\{1}", SingleHepler<ConfigInfo>.Instance.CutImageFileUrl, viewModel.Device); ////通讯录 _baseAction.actionDirectStr(viewModel.Device, 300, 1180, wmPoint); Thread.Sleep(2000); ////新朋友 _baseAction.actionDirectStr(viewModel.Device, 100, 230, wmPoint); //检测是否进入新的朋友界面 var isSuccess = _baseAction.CircleDetection("FMessageConversationUI", viewModel.Device); if (!isSuccess) { return; } }
/// <summary> /// 加好友之前 进行检测 /// </summary> /// <param name="doc"></param> /// <param name="viewModel"></param> /// <returns></returns> public WXActionViewModel BeforeAddFriendWithValidate(XmlDocument doc, WXActionViewModel viewModel) { #region 进行检测 var sex = EnumCheckSexType.Other; XmlNodeList nodeList = doc.SelectNodes("//node[@class='android.widget.Button']"); XmlNode clickBtn = null; if (null != nodeList && nodeList.Count > 0) { var currenNode = nodeList[0]; var textValue = currenNode.Attributes["text"].Value; ///回复 if (textValue.Length == 2) { var secondNode = nodeList[1]; textValue = secondNode.Attributes["text"].Value; ///通过验证 if (textValue.Length == 4) { clickBtn = secondNode; } } ///通过验证 添加到通讯录 else if (textValue.Length == 4 || textValue.Length == 6) { clickBtn = currenNode; } } XmlNode sexNode = doc.FirstChild; if (viewModel.Sex != EnumCheckSexType.Other) { // resource-id="com.tencent.mm:id/ad_" class="android.widget.ImageView" var personInfoNode = doc.SelectSingleNode("//node[contains(@bounds,'[204,214]')]"); if (null != personInfoNode) { sexNode = personInfoNode.LastChild; var text = sexNode.Attributes["content-desc"].Value; var bounds = sexNode.Attributes["bounds"].Value; ///表示不是乱码 if (!text.Equals("?")) { sex = text.Equals("男") ? EnumCheckSexType.Man : (text.Equals("女") ? EnumCheckSexType.Woman : EnumCheckSexType.NoSex); } else { var currentModel = ValidateSexWithColorPoint(viewModel.Device, bounds); sex = currentModel.Sex; } } //只加男的 并且 当前好有也是男的 或者 ///只加女的 并且当前好友也是女的 if (!(viewModel.Sex == EnumCheckSexType.Man && sex == EnumCheckSexType.Man) && !(viewModel.Sex == EnumCheckSexType.Woman && sex == EnumCheckSexType.Woman) && !(viewModel.Sex == EnumCheckSexType.NoMan && (sex == EnumCheckSexType.NoSex || sex == EnumCheckSexType.Woman)) && !(viewModel.Sex == EnumCheckSexType.NoWoman && (sex == EnumCheckSexType.NoSex || sex == EnumCheckSexType.Man)) ) { sexNode = null; } } ///记录添加新朋友记录 if (null != clickBtn) { AddFriendInfoRecord(new WXActionViewModel() { Device = viewModel.Device, RemarkContent = viewModel.RemarkContent, Sex = (EnumCheckSexType)sex }); } ///别人有回复 则放弃这个朋友 if (null == sexNode || null == clickBtn) { viewModel.IsGoOn = false; } else { var strValue = clickBtn.Attributes["bounds"].Value; viewModel = _baseAction.GetStartBoundsWithEndBounds <WXActionViewModel>(viewModel, strValue, (o) => { return(o); }); } return(viewModel); #endregion }
/// <summary> /// 统计粉丝数 /// </summary> /// <param name="viewModel"></param> public void StatisticsFriendCount(WXActionViewModel viewModel, WMPoint wmPoint) { _baseAction.UnlockSingleScreen(viewModel.Device); OpenWX(viewModel.Device); ////通讯录 _baseAction.actionDirectStr(viewModel.Device, 300, 1180, wmPoint); ///点击 # var y = 1060; if (!string.IsNullOrEmpty(viewModel.Device) && viewModel.Device.Length <= 8) { y += _baseAction.DValue; } _baseAction.actionDirectStr(viewModel.Device, 700, y, wmPoint); //viewModel.PullNativePath = string.Format(@"{0}\{1}", SingleHepler<ConfigInfo>.Instance.CutImageFileUrl, viewModel.Device); viewModel.XMLName = "recordUI"; while (string.IsNullOrEmpty(viewModel.FriendCountStr)) { ///滑动进入到页面最低端 _baseAction.InitProcessWithTaskState(viewModel.Device, "shell input swipe 100 1000 100 -10000"); ///获取通讯录页面的XML文档 viewModel = _baseAction.CreatUIXML(viewModel, (o, doc) => { XmlNode callOnNode1 = doc.SelectSingleNode("//node[contains(@bounds,'[0,1060]')]"); XmlNode callOnNode2 = doc.SelectSingleNode("//node[contains(@text,'位联系人')]"); if (callOnNode1 != null) { callOnNode1 = callOnNode1.LastChild; o.FriendCountStr = GetFansCountByStr(callOnNode1.InnerXml); } else if (null != callOnNode2) { var value = callOnNode2.Attributes["text"].Value; if (!string.IsNullOrEmpty(value)) { o.FriendCountStr = Regex.Match(value, @"(\d+)").Value; } } return(o); }); Thread.Sleep(500); } Task.Factory.StartNew(() => { SingleHepler <DeviceToNickNameBLL> .Instance.UpDateFriendCount(new DeviceToNickNameViewModel() { Device = viewModel.Device, FriendCount = int.Parse(viewModel.FriendCountStr) }); }); }
/// <summary> /// 通过联系人加好友 /// </summary> /// <param name="viewModel"></param> public void AddFriendWithContracts(WXActionViewModel viewModel, WMPoint wmPoint) { var y = 443; var i = 1; var isValidate = false; var stateStr = string.Empty; var isSuccess = false; viewModel.XMLName = "deleteAddedFriend"; while (i <= viewModel.AddCount) { ///检测设备是否处于连接状态 if (_baseAction.CheckEquipmentIsConnecting(viewModel.Device)) { return; } stateStr = string.Empty; isSuccess = false; var returnModel = IsHaveNewFriend(viewModel); if (!returnModel.IsValidatedState) { return; } returnModel = DeleteFriend(viewModel); if (!returnModel.IsValidatedState) { ///长按当前新朋友 _baseAction.actionDirectSwipStr(viewModel.Device, 100, y, 100, y, wmPoint); ///删除当前新朋友 _baseAction.actionDirectStr(viewModel.Device, 360, 640, wmPoint); } else { #region 加好友 _baseAction.actionDirectStr(viewModel.Device, 100, y, wmPoint); //检测是否进入详细资料 isSuccess = _baseAction.CircleDetection("ContactInfoUI", viewModel.Device); if (!isSuccess) { return; } viewModel.IsGoOn = true; viewModel.XMLName = "DetailUI"; viewModel = _baseAction.CreatUIXML(viewModel, (o, doc) => { return(BeforeAddFriendWithValidate(doc, o)); }); ///页面过渡的时候检测 FromDetailPageToValidatePage(viewModel, (o) => { if (o) { i++; } }, wmPoint); //点击去除不必要的弹框 // _baseAction.InitProcessWithTaskState(viewModel.Device, "shell input tap 360 100"); //返回到新朋友 _baseAction.actionDirectStr(viewModel.Device, 50, 100, wmPoint); //检测是否进入新朋友界面 isSuccess = _baseAction.CircleDetection("FMessageConversationUI", viewModel.Device); if (isSuccess) { ///长按当前新朋友 _baseAction.actionDirectSwipStr(viewModel.Device, 100, y, 100, y, wmPoint); ///删除当前新朋友 _baseAction.actionDirectStr(viewModel.Device, 360, 640, wmPoint); } #endregion } } }
/// <summary> /// 通过搜索加好友 /// </summary> /// <param name="viewModel"></param> public void AddFriendWithSearch(WXActionViewModel viewModel, WMPoint wmPoint) { var searchContentList = viewModel.SearchContents; if (null == searchContentList || searchContentList.Count == 0) { return; } ///点击添加朋友 _baseAction.actionDirectStr(viewModel.Device, 700, 100, wmPoint); ///是否进入添加朋友界面 var isSuccess = _baseAction.CircleDetection("AddMoreFriendsUI", viewModel.Device); if (!isSuccess) { return; } //点击搜索框 _baseAction.actionDirectStr(viewModel.Device, 360, 250, wmPoint); ///是否进入搜索界面 isSuccess = _baseAction.CircleDetection("FTSAddFriendUI", viewModel.Device); if (!isSuccess) { return; } foreach (var searchContent in searchContentList) { viewModel.IsGoOn = true; viewModel.XMLName = "DetailUI"; ///检测设备是否处于连接状态 if (_baseAction.CheckEquipmentIsConnecting(viewModel.Device)) { break; } ///清空输入框 _baseAction.actionDirectStr(viewModel.Device, 700, 100, wmPoint); ///输入搜索内容 _baseAction.InitProcessWithTaskState(viewModel.Device, "shell am broadcast -a ADB_INPUT_TEXT --es msg '" + searchContent + "'"); ///点击搜索按钮 _baseAction.actionDirectStr(viewModel.Device, 360, 200, wmPoint); //检测是否进入详细资料 isSuccess = _baseAction.CircleDetection("ContactInfoUI", viewModel.Device); if (!isSuccess) { continue; } viewModel = _baseAction.CreatUIXML(viewModel, (o, doc) => { return(BeforeAddFriendWithValidate(doc, o)); }); FromDetailPageToValidatePage(viewModel, wmPoint: wmPoint); //返回 _baseAction.actionDirectStr(viewModel.Device, 50, 100, wmPoint); } }
/// <summary> /// 分析群聊中的群列表面 /// </summary> /// <param name="viewModel"></param> /// <param name="doc"></param> /// <returns></returns> public WXActionViewModel AnalysisGroupChatList(WXActionViewModel viewModel, XmlDocument doc) { XmlNodeList nodeList = doc.SelectNodes("//node[@class='android.widget.TextView'][@index='1']"); return(new WXActionViewModel()); }
/// <summary> /// 进入打招呼页面 /// </summary> public bool EnterSayHelloActivity(WXActionViewModel viewModel, WMPoint wmPoint = null) { #region 分析 打招呼页面 XML文档 viewModel.XMLName = "SayHelloPage"; Action <int, int> _currentAction = (x, y) => { _baseAction.actionDirectStr(viewModel.Device, x, y, wmPoint); }; Action <string> _currentInputContentAction = (content) => { _baseAction.InitProcessWithTaskState(viewModel.Device, "shell am broadcast -a ADB_INPUT_TEXT --es msg '" + content + "'"); }; //_currentAction.Invoke(650, 240); _currentAction.Invoke(650, 240); var currentViewModel = _baseAction.CreatUIXML(viewModel, (o, doc) => { return(ValiDateSayHelloPage(doc, o)); }); ///表示是要发送验证申请的 if (currentViewModel.IsValidatedState) { _currentInputContentAction(viewModel.SayHiContent); ///设置备注文本框获取焦点 _currentAction.Invoke(650, 465); //删除默认备注 _currentAction.Invoke(650, 465); } if (!string.IsNullOrEmpty(viewModel.RemarkContent)) { ///输入备注 _currentInputContentAction(viewModel.RemarkContent); } else { ///点击 填入 按钮 输入备注 _currentAction.Invoke(viewModel.RightWidth - 30, viewModel.BottomHeight - 15); } #endregion ///向上滑动 防止出现通知 _baseAction.InitProcessWithTaskState(viewModel.Device, " shell input swipe 100 100 600 100"); //发送 _baseAction.actionDirectStr(viewModel.Device, 700, 100, wmPoint); //检测是否进入详细资料 有可能对方删除或者拉黑了我 会出现验证失败 不会自动返回详细资料页面 var isSuccess = _baseAction.CircleDetection("ContactInfoUI", viewModel.Device, false); if (!isSuccess) { //返回 _baseAction.actionDirectStr(viewModel.Device, 50, 100, wmPoint); } return(isSuccess); }