自主开发不刷机 无ROOT微信云控系统源码

  现在市场上各种各样的云控系统都是需要刷机获取ROOT权限然后进行各种操作。而我今天要讲的是我们自主研发的不root,不刷机,不安装xposed的,完全正常的手机环境下进行自动化操作,实现各种的微信云控系统,在开发和技术实现过程中经过不断测试,最终得到的实现方式有两种:

    1. 通过adb调用uiautomator,可以实现不刷机,不root。代码具体实现为:

if(clickFlag==0)
xx5=mDevice.findObject(new UiSelector().resourceId("com.tencent.mm:id/c5q").instance(j));
else
xx5=mDevice.findObject(new UiSelector().resourceId("com.tencent.mm:id/a8v").instance(j));
if(!xx5.exists())
{
i--;
break;
}
String name=xx5.getText();
if(addGroupList.contains(name))
continue;
addGroupList.add(xx5.getText());
xx5.clickAndWaitForNewWindow();

UiObject xx7=mDevice.findObject(new UiSelector().textContains("添加到通讯录"));
if(xx7.exists())
xx7.clickAndWaitForNewWindow();
else
{
mDevice.pressBack();
continue;
}
SystemClock.sleep(1000);
UiObject xx8=mDevice.findObject(new UiSelector().text("发消息"));
if(xx8.exists())
{
mDevice.pressBack();
}else

  1. 另一种实现方式就是AccessibilityService。这种方式是借助Android自带的辅助功能实现模拟点击,模拟输入,模拟滑动等等操作。在开发和测试过程中发现这种方式有一定的限制性,具体如何要在使用过程中体现,需要源码和定制开发加威信16620839974代码的具体实现为:

if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && event.getClassName().equals("com.tencent.mm.ui.LauncherUI")) {
//记录打招呼人数置零
i = 0;
//当前在微信聊天页就点开发现
openNext("发现");
//然后跳转到附近的人
openDelay(1000, "附近的人");
} else if (event.getClassName().equals("com.tencent.mm.plugin.nearby.ui.NearbyFriendsUI") && eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
prepos = 0;
//当前在附近的人界面就点选人打招呼
AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("米以内");
Log.d("name", "附近的人列表人数: " + list.size());
if (i < (list.size() page)) {
list.get(i % list.size()).performAction(AccessibilityNodeInfo.ACTION_CLICK);
list.get(i % list.size()).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
} else if (i == list.size()
page) {
//本页已全部打招呼,所以下滑列表加载下一页,每次下滑的距离是一屏
for (int i = 0; i < nodeInfo.getChild(0).getChildCount(); i++) {
if (nodeInfo.getChild(0).getChild(i).getClassName().equals("android.widget.ListView")) {
AccessibilityNodeInfo node_lsv = nodeInfo.getChild(0).getChild(i);
node_lsv.performAction(AccessibilityNodeInfo.ACTION_SCROLLFORWARD);
page++;
new Thread(new Runnable() {br/>@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException mE) {
mE.printStackTrace();
}
AccessibilityNodeInfo nodeInfo
= getRootInActiveWindow();
//nodeInfo.findFocus();
List<AccessibilityNodeInfo> list
= nodeInfo.findAccessibilityNodeInfosByText("米以内");
Log.d("name", "列表人数: " + list
.size());
//滑动之后,上一页的最后一个item为当前的第一个item,所以从第二个开始打招呼
// list.get(1).
list
.get(1).performAction(AccessibilityNodeInfo.ACTIONCLICK);
list
.get(1).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);

猜你喜欢

转载自blog.51cto.com/13912425/2155687