微信怎么设置秒赞别人朋友圈可以自动点赞吗?

点赞,一种正能量的传递。回想你刚刚送出的一个赞,是怀着什么样的心情点下去的?可能是一种礼貌,我恰巧路过,你的动态恰巧入眼,点赞是“绅士风度”。可能是一种关注,简而言之,就是我在你的世界里刷的存在感。可能是一种问候,好久没联系了,点赞,就是我的关心,是我的“好久不见”“见赞如晤”。可能是一种认可,你传递的观点深得我意,你分享的事物我感兴趣,我用“赞”给你贴了一朵小红花。可能是一种欣赏,在你发布的朋友圈里,我看了理想生活的一瞬。可能是一种祝福,虽然山海相隔,但你的喜悦与幸福,我以点赞的方式见证,按下的是一个赞,升起的是一簇烘托喜乐氛围的烟花。可能是一种支持,我在以这种方式告诉你,“我挺你”“我理解你”“我站你这边”。所以,点赞,还是一种疗愈,一种陪伴,看看你情绪低落时更新的动态,那些赞,那些温暖的留言,像不像一个拥抱,一抹安抚?当然,在亲密关系中,点赞,就是我直白的喜欢,喜欢你发布的自拍,哪怕是抽疯一面;喜欢你分享的歌曲,哪怕在深夜;喜欢你镜头下的人间烟火,哪怕是街角一景……比起你发了什么,我在意的是你这个人,点赞,就是给你的“事事有回应”,秒赞,是我盲目而炽热的追随。“这个世界上,从来不缺值得赞美的事,只缺愿意赞美的人。”所以,请珍惜朋友圈给你点赞的人,他路过你的人生一瞬,没有无视你的吐露与分享,给了你回应,给了你情绪价值,让你懂,有人关注你,有人在意你,有人认可你,有人欣赏你,有人祝福你,有人支持你,有人喜欢你。用点赞给你能量的人,就像路过你窗台放了一朵花的人,不也是一种美德?点赞,一种不费力的社交方式。回想你刚刚收到的赞,给你点赞的人与你几分熟?喜欢的人给你点个赞,那简直开心一整天,谁也拦不住;领导、老师、前辈给你点个赞,被认可的感觉,总是暖的;哪怕是萍水相逢的人给你点个赞,也莫名有了“天涯若比邻”的亲近之感。点赞之交,让常常不擅表达的我们,多了一个不费力的情感联结方式。之于“社恐”,省去了面对面的不自在,避免了尴尬到“脚趾抠地”的场景,只需一赞,就能表达关注和关心。从点赞那里,他们得到一种解脱。之于不擅表达的人,省去了绞尽脑汁组织语言的环节,无需费心我该以何开场,也无需你费心该以何回复,一赞了之,既有温度又不失风度,点赞,让人与人的链接变得简单而清爽。之于远隔千里的朋友,见面不易,还好有“赞”维系感情。从未消失的赞,是我从未缺席你成长的明证。我以赞抚慰情绪低落的你,你以赞调侃我刚出的糗,空间上的缺憾情感上得到弥补,我们彼此用“频频回赞”行经了对方的生活,在对方的流年岁月中留下猫爪般温柔的印记。之于有缘分的人,点赞,就是我们变得亲近的开始,就是故事的开头。有些人,赞着赞着,就熟了;有些人,赞着赞着,就散了。时间和经历会为你筛出陪你走一程和陪你走一辈子的人。当然,如果你渴望与某人缓和紧张关系,没有找到合适时机开口,点赞,也可以表达一种示好,一种歉意,一种风度。至少,你为了修复一段关系主动迈出了一步。点赞,一种个性的展示。有人说,不用告诉我你是谁,光是看你赞过的帖子,我都能推断出你是怎样的人。因为看到你刚赞了“逢考必过”,所以知道你有一座人生之山要翻越。因为看到你刚赞了关爱流浪小猫小狗的帖子,所以感受到你柔软有爱心的一面。因为看到你刚赞了一段关于某部小众电影的影评,所以为你贴上不盲从有品味的标签。因为看到你常常点赞旅游帖子,所以晓得你心里住着诗与远方。因为看到你常常点赞做饭烧菜教程,所以懂你有一方热气腾腾要经营。因为看到你常常为某一人点赞,所以明白了那人在你心中的深浅,不言而喻。点赞,是一种自我的暴露,某种程度上说,你,就是你点赞之物的集合:你点赞的观点,你点赞的景色,你点赞的人,你点赞的种种替你诉说着你。点赞,还是一种鼓励,一种养成,一种栽培。如果你关于读书心得的分享,总是得到高赞,这种获得感、满足感,自然令你倾向多分享纸页翻飞的故事,在这种点赞给予的正向强化中,你开始遇见更棒的自己。不可否认,点赞,还是一种烦恼。或许来自过分追求点赞量的执念;或许来自七大姑八大姨隔三岔五的集赞轰炸;或许来自朋友的敏感质问“你为什么不给我点赞”;或许是跟风点赞带来的负担,大家都给领导点赞了,我不点会不会显得不合群?或许是私交甚浅的“大佬”发了朋友圈,赞还是不赞,会不会一赞就有被对方删好友的风险?或许是道过晚安之后,又被一个点赞暴露行踪的尴尬;或许是期望再一次落空,我发朋友圈就是为了你能看见,可你,甚至一个赞都没有留下。有过因“赞”而生的烦恼,你就会明白:点赞,也讲究时机,讲究“情商”。我们不要因为点赞简化了相处细节,就怠慢了相处之道。该有的社交礼仪和修养,在点赞之交面前,同样不该缺失。人与人相处,善良、真诚、懂得换位思考才是最大的技巧。赞与不赞,都不影响我心向真实,好好生活。你会发现,如何看待点赞,同样显现着一种生活态度。有人视“赞”平平,有人为“赞”辗转,有人无“赞”不欢,而当一个人只知用“赞与不赞”这样单一、浅层次的标准,来衡量社交质量、来掂量情感分量的时候,他已经被“点赞”拿捏了。衡量交往质量的一个简单考量是:你们彼此有没有因为这段关系,找到更佳状态、更优秀的自己?你有没有自内而外地被打开,变得越来越明朗越舒展,而不是越来越狭隘越偏执?点赞,只是社交中的一种反馈方式,并不左右你的生活,主导你的人生。再少的赞,也不会就此否定你存在的价值。再多的赞,也抵不过可全然托付的知己二三。我们努力,我们努力到无能为力,不是为了换赞几个;我们生活,我们生活的边边角角有趣有爱,不是“点赞”所能定义描画的。更新状态,是在分享生活享受生活;没更新状态的日子,是在感受生活努力生活。而真实的生活,深刻的人生,总是恒高于双眼所及,恒大于手机界面的。就这么愉快地决定了,赞与不赞,都不影响我心向真实,好好生活。▌来源:央视新闻微信公众号
有奖竞答扫描下方二维码}

当我们把辅助权限玩的比较熟悉 的时候,就可以释放我们的双手做一些有趣的事情了,例如之前网上流传的微信自动抢红包插件,就是使用的这个服务,不过我们今儿讲的是微信自动评论与点赞功能(抢红包的文章网上已经有比较多)。
一、悬浮窗配置关于悬浮窗的详细配置,请看我另一篇博文,这里不再赘述,「传送门」:Android 辅助权限与悬浮窗二、自动化逻辑代码实现
说明:我们通过 Monitor 工具,取到的节点 id ,在微信的每个版本是不一样的 (微信动态生成节点 id,我是通过服务器后台对不同的微信版本,维护一份 id 配置,根据请求的微信版本,返回对应得 id 值),所以本文以微信 v6.7.2 的版本作为例子,如下代码可作参考。
这里只是提供了微信自动点赞与自动评论的示例,当然本人也写了类似于微信自动加好友,自动加附近的人,检测死粉的功能,钉钉自动打卡... 这里只是抛转引玉,大家根据我提供的思路,去实现,由于源码涉及服务器相关操作,不太方便开源,{
"tasks": [
{
"nodes": [
{
"action": "scrllor",
"className": "android.widget.ListView",
"id": "com.tencent.mm:id/cno",
"key": "nearHumanList",
"text": "@附近的人列表"
},
{
"className": "android.widget.TextView",
"id": "com.tencent.mm:id/b3i",
"key": "nearHumanListName",
"text": "@附近的人列表名字"
},
{
"className": "android.widget.TextView",
"id": "com.tencent.mm:id/sm",
"key": "detailName",
"text": "@附近的人详情名字"
},
{
"className": "android.widget.ListView",
"id": "com.tencent.mm:id/bcs",
"key": "phoneHumanList",
"text": "@手机联系人列表"
},
{
"className": "android.widget.TextView",
"id": "com.tencent.mm:id/bgl",
"key": "phoneHumanListName",
"text": "@手机联系人列表名字"
},
{
"className": "android.widget.TextView",
"id": "com.tencent.mm:id/bgm",
"key": "phoneHumanListAccount",
"text": "@手机联系人列表昵称"
},
{
"className": "android.widget.TextView",
"id": "com.tencent.mm:id/sm",
"key": "phoneHumandetailName",
"text": "@手机联系人详情名字"
},
{
"className": "android.widget.ListView",
"id": "com.tencent.mm:id/doq",
"key": "momentList",
"text": "@朋友圈列表"
}
],
"pages": [ ],
"taskName": "微信脚本",
"version": "6.7.2"
}
]
}
复制代码1、微信朋友圈自动点赞效果如图(希望我朋友不会打我,这里就不视频打码了,┭┮﹏┭┮),这里面的悬浮窗可以有效阻挡用户操作,只有点击停止之后,才能操作微信界面。/**
* 朋友圈点赞
* Created by czc on 2018/8/23.
*/
public class LikeStrategy extends BaseStrategy {
@Override
protected boolean handleEvent() {
/**
* 匹配每个界面,根据当前界面执行相关操作
* 1、在微信首页点击【发现】按钮
* 2、然后点击【朋友圈】,进入朋友圈界面
* 3、滚动朋友圈【动态列表】,对每个动态进行点赞
*/
if (matchPage(Page.LauncherUI)
matchPage(Page.WxViewPager)) {
clickFindBtn(getRoot());
clickCommentTv(getRoot());
} else if (checkWxScroller(Page.SnsTimeLineUI)) {
scrollerList(getRoot());
} else if (matchPage(Page.BaseP)) {
} else {
return false;
}
return true;
}
private void clickFindBtn(AccessibilityNodeInfo root) {
NodeUtil.findNodeByTextAndClick(root, "发现");
}
private void clickCommentTv(AccessibilityNodeInfo root) {
NodeUtil.findNodeByTextAndClick(root, "朋友圈");
}
private void scrollerList(AccessibilityNodeInfo root) {
//这里的滚动控件对应于朋友圈动态的 ListView
AccessibilityNodeInfo scrollerNode = findNodeByTaskNode(root, getNode("momentList"));
if (scrollerNode == null) {
Log.e(TAG, "scroller is null");
return;
}
if (scrollerNode != null) {
final int count = scrollerNode.getChildCount();
for (int i = 0; i < count; i++) {
AccessibilityNodeInfo child = scrollerNode.getChild(i);
if (child != null && child.isVisibleToUser()) {
AccessibilityNodeInfo commentNode = NodeUtil.findNodeByFilter(child, new NodeUtil.NodeFilter() {
@Override
public String text() {
return "评论";
}
@Override
public boolean filter(AccessibilityNodeInfo node) {
return node.getClassName() != null && node.getClassName().equals(NodeUtil.IMAGE_VIEW)
&& node.getContentDescription() != null && node.getContentDescription().toString().equals("评论");
}
});
if (commentNode != null && commentNode.isVisibleToUser()) {
NodeUtil.performClick(commentNode);
NodeUtil.findNodeByFilterAndClick(root, new NodeUtil.NodeFilter() {
@Override
public String text() {
return "赞";
}
@Override
public boolean filter(AccessibilityNodeInfo node) {
return node.getClassName() != null && node.getClassName().equals(NodeUtil.TEXT_VIEW)
&& node.getText() != null && node.getText().toString().equals("赞");
}
});
}
}
//可见的最后一个 item
if (i == count - 1) {
//滚动控件是否可以滚动
if (scrollerNode.isScrollable()) {
NodeUtil.findNodeByFilterAndClick(root, new NodeUtil.NodeFilter() {
@Override
public String text() {
return "评论";
}
@Override
public boolean filter(AccessibilityNodeInfo node) {
return node.getClassName() != null && node.getClassName().equals(NodeUtil.TEXT_VIEW)
&& node.getText() != null && node.getText().toString().equals("评论");
}
});
//循环滚动
performScroll(scrollerNode);
}
}
}
}
}
}
复制代码2、微信朋友圈自动评论效果如图/**
* 朋友圈评论
* Created by czc on 2018/8/23.
*/
public class CommentStrategy extends BaseStrategy {
@Override
protected boolean handleEvent() {
/**
* 匹配每个界面,根据当前界面执行相关操作
* 1、在微信首页点击【发现】按钮
* 2、然后点击【朋友圈】,进入朋友圈界面
* 3、滚动朋友圈【动态列表】,对每个动态进行评论
*/
if (matchPage(Page.LauncherUI)
matchPage(Page.WxViewPager)) {
clickFindBtn(getRoot());
clickCommentTv(getRoot());
} else if (checkWxScroller(Page.SnsTimeLineUI)) {
scrollerList(getRoot());
} else if (matchPage(Page.BaseP)) {
} else {
return false;
}
return true;
}
private void clickFindBtn(AccessibilityNodeInfo root) {
NodeUtil.findNodeByTextAndClick(root, "发现");
}
private void clickCommentTv(AccessibilityNodeInfo root) {
NodeUtil.findNodeByTextAndClick(root, "朋友圈");
}
private void scrollerList(AccessibilityNodeInfo root) {
AccessibilityNodeInfo scrollerNode = findNodeByTaskNode(root, getNode("momentList"));
if (scrollerNode == null) {
Log.e(TAG, "scroller is null");
return;
}
if (scrollerNode != null) {
final int count = scrollerNode.getChildCount();
for (int i = 0; i < count; i++) {
AccessibilityNodeInfo child = scrollerNode.getChild(i);
if (child != null && child.isVisibleToUser()) {
AccessibilityNodeInfo commentNode = NodeUtil.findNodeByFilter(child, new NodeUtil.NodeFilter() {
@Override
public String text() {
return "评论";
}
@Override
public boolean filter(AccessibilityNodeInfo node) {
return node.getClassName() != null && node.getClassName().equals(NodeUtil.IMAGE_VIEW)
&& node.getContentDescription() != null && node.getContentDescription().toString().equals("评论");
}
});
if (commentNode != null && commentNode.isVisibleToUser()) {
NodeUtil.performClick(commentNode);
NodeUtil.findNodeByFilterAndClick(root, new NodeUtil.NodeFilter() {
@Override
public String text() {
return "评论";
}
@Override
public boolean filter(AccessibilityNodeInfo node) {
return node.getClassName() != null && node.getClassName().equals(NodeUtil.TEXT_VIEW)
&& node.getText() != null && node.getText().toString().equals("评论");
}
});
AccessibilityNodeInfo editNode = NodeUtil.findNodeByFilter(child, new NodeUtil.NodeFilter() {
@Override
public String text() {
return "评论";
}
@Override
public boolean filter(AccessibilityNodeInfo node) {
return node.getClassName() != null && node.getClassName().equals(NodeUtil.EDIT_TEXT)
&& node.getText() != null && node.getText().toString().equals("评论");
}
});
if (editNode == null) {
if (root != null) {
editNode = root.findFocus(AccessibilityNodeInfo.FOCUS_INPUT);
}
}
if (editNode != null) {
//输入自定义评论内容
NodeUtil.performPaste(editNode, "东西不错哦~");
//点击【发送】
NodeUtil.findNodeByTextAndClick(root, "发送");
}
}
}
if (i == count - 1) {
if (scrollerNode.isScrollable()) {
performScroll(scrollerNode);
}
}
}
}
}
}
复制代码3、相关工具类工具类里面的代码是自己封装的,不一定都适用,工具类可能存在不足与缺陷,为什么执行操作需要 Sleep 1s ,因为太快的话,有些界面的节点信息还没更新出来,会导致点击失败等情况:/**
* Created by czc on 2017/7/3.
*/
public class NodeUtil {
private static final String TAG = "NodeUtil";
private static final int millis = 1000;
public static final String LIST_VIEW = "android.widget.ListView";
public static final String ABS_LIST_VIEW = "android.widget.AbsListView";
public static final String SCROLL_VIEW = "android.widget.ScrollView";
public static final String TEXT_VIEW = "android.widget.TextView";
public static final String BUTTON = "android.widget.Button";
public static final String VIEW = "android.view.View";
public static final String IMAGE_VIEW = "android.widget.ImageView";
public static final String IMAGE_BUTTON = "android.widget.ImageButton";
public static final String GRID_VIEW = "android.widget.GridView";
public static final String EDIT_TEXT = "android.widget.EditText";
public static final String RELATIVE_LAYOUT = "android.widget.RelativeLayout";
public static final String LINEAR_LAYOUT = "android.widget.LinearLayout";
public static final String LINEAR_LAYOUT_COMPAT = "android.support.v7.widget.LinearLayoutCompat";
public static void sleep(long times) {
try {
Thread.sleep(times);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static boolean checkNodeText(AccessibilityNodeInfo nodeInfo) {
if (nodeInfo == null) {
return false;
}
return !StringUtil.isEmpty(nodeInfo.getText().toString());
}
public static boolean checkNodeDes(AccessibilityNodeInfo nodeInfo) {
if (nodeInfo == null) {
return false;
}
return !StringUtil.isEmpty(nodeInfo.getContentDescription());
}
public static boolean performClick(AccessibilityNodeInfo node) {
AccessibilityNodeInfo clickNode = node;
if (clickNode == null) {
return false;
}
while (clickNode != null
&& !clickNode.isClickable()) {
clickNode = clickNode.getParent();
}
if (clickNode != null) {
boolean result = clickNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
sleep();
return result;
}
Log.e(TAG, "clickNode is null");
return false;
}
// root下,通过 adb 命令执行点击
public static boolean performShellClick(AccessibilityNodeInfo node) {
AccessibilityNodeInfo clickNode = node;
if (clickNode == null) {
return false;
}
Rect r = new Rect();
node.getBoundsInScreen(r);
if (r.centerX() > ScreenUtils.getScreenWidth(OttUtil.get().getApp())
r.centerY() > ScreenUtils.getScreenHeight(OttUtil.get().getApp())
r.centerX() <= 0
r.centerY() <= 0) {
return false;
}
String cmd = String.format("input tap %d %d", r.centerX(), r.centerY());
ShellUtils.CommandResult commandResult = ShellUtils.execCmd(cmd, true);
sleep();
return commandResult.result != -1;
}
// root下,通过 adb 命令执行长按
public static boolean performShellLongClick(AccessibilityNodeInfo node, long time) {
AccessibilityNodeInfo clickNode = node;
if (clickNode == null) {
return false;
}
Rect r = new Rect();
clickNode.getBoundsInScreen(r);
int x = r.centerX();
int y = r.centerY();
String cmd = String.format("input swipe %d %d %d %d %d", x, y, x, y, time);
ShellUtils.CommandResult commandResult = ShellUtils.execCmd(cmd, true);
NodeUtil.sleep(time);
return commandResult.result != -1;
}
// root下,通过 adb 命令执行滚动
public static boolean performShellScroll() {
int screenWidth = ScreenUtils.getScreenWidth(OttUtil.get().getApp());
int screenHeight = ScreenUtils.getScreenHeight(OttUtil.get().getApp());
String cmd = String.format("input swipe %d %d %d %d %d", screenWidth / 2, (int) (screenHeight * (3 * 1.0f / 5)),screenWidth / 2, screenHeight / 5,
1500L);
ShellUtils.CommandResult commandResult = ShellUtils.execCmd(cmd, true);
NodeUtil.sleep(500);
return commandResult.result != -1;
}
public static boolean performScroll(AccessibilityNodeInfo scrollerNode) {
while (scrollerNode != null && !scrollerNode.isScrollable()) {
scrollerNode = scrollerNode.getParent();
}
if (scrollerNode != null) {
boolean result = scrollerNode.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
sleep();
return result;
}
Log.e(TAG, "scrollerNode is null");
return false;
}
public static boolean performScrollBack(AccessibilityNodeInfo scrollerNode) {
while (scrollerNode != null && !scrollerNode.isScrollable()) {
scrollerNode = scrollerNode.getParent();
}
if (scrollerNode != null) {
boolean result = scrollerNode.performAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
sleep();
return result;
}
return false;
}
/**
*
执行粘贴操作(注意:执行之后,会 sleep 1s)
* @param ct
* @param node
* @param text
* @return
*/
public static boolean performPaste(Context ct, AccessibilityNodeInfo node, String text) {
if (node == null
StringUtil.isEmpty(text)) {
return false;
}
boolean result;
if (Build.VERSION.SDK_INT >= 21) {
Bundle arguments = new Bundle();
arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);
result = node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
sleep();
return result;
} else {
ClipboardManager cm = (ClipboardManager) ct.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData mClipData = ClipData.newPlainText("text", text);
cm.setPrimaryClip(mClipData);
result = node.performAction(AccessibilityNodeInfo.ACTION_PASTE);
sleep();
return result;
}
}
public static boolean hasNode(AccessibilityNodeInfo root, String text) {
if (root == null
StringUtil.isEmpty(text)) {
return false;
}
List<AccessibilityNodeInfo> nodeList = root.findAccessibilityNodeInfosByText(text);
if (nodeList == null
nodeList.isEmpty()) {
return false;
}
return true;
}
public static AccessibilityNodeInfo findNodeByFilter(AccessibilityNodeInfo root, String text, NodeFilter filter) {
if (root == null
StringUtil.isEmpty(text)) {
return null;
}
List<AccessibilityNodeInfo> nodeList = root.findAccessibilityNodeInfosByText(text);
if (nodeList == null
nodeList.isEmpty()) {
return null;
}
AccessibilityNodeInfo clickNode = null;
for (AccessibilityNodeInfo nodeInfo : nodeList) {
if (filter.filter(nodeInfo)) {
clickNode = nodeInfo;
break;
}
}
return clickNode;
}
public static AccessibilityNodeInfo findNodeByFilter(AccessibilityNodeInfo root, NodeTextFilter filter) {
if (root == null
filter == null
StringUtil.isEmpty(filter.fiterText())) {
return null;
}
List<AccessibilityNodeInfo> nodeList = root.findAccessibilityNodeInfosByText(filter.fiterText());
if (nodeList == null
nodeList.isEmpty()) {
return null;
}
AccessibilityNodeInfo clickNode = null;
for (AccessibilityNodeInfo nodeInfo : nodeList) {
if (filter.filter(nodeInfo)) {
clickNode = nodeInfo;
break;
}
}
return clickNode;
}
public static AccessibilityNodeInfo findNodeByFilter(AccessibilityNodeInfo root, NodeIdFilter filter) {
if (root == null
filter == null
StringUtil.isEmpty(filter.fiterViewId())) {
return null;
}
List<AccessibilityNodeInfo> nodeList = root.findAccessibilityNodeInfosByViewId(filter.fiterViewId());
if (nodeList == null
nodeList.isEmpty()) {
return null;
}
AccessibilityNodeInfo clickNode = null;
for (AccessibilityNodeInfo nodeInfo : nodeList) {
if (filter.filter(nodeInfo)) {
clickNode = nodeInfo;
break;
}
}
return clickNode;
}
public static AccessibilityNodeInfo findNodeByText(AccessibilityNodeInfo root, String text) {
if (root == null
StringUtil.isEmpty(text)) {
return null;
}
List<AccessibilityNodeInfo> nodeList = root.findAccessibilityNodeInfosByText(text);
if (nodeList == null
nodeList.isEmpty()) {
return null;
}
AccessibilityNodeInfo clickNode = null;
for (AccessibilityNodeInfo nodeInfo : nodeList) {
boolean eqText = nodeInfo.getText() != null && nodeInfo.getText().toString().equals(text);
boolean eqDesc = nodeInfo.getContentDescription() != null && nodeInfo.getContentDescription().toString().equals(text);
if (eqText
eqDesc) {
clickNode = nodeInfo;
break;
}
}
return clickNode;
}
public static AccessibilityNodeInfo findNodeContainsText(AccessibilityNodeInfo root, String text) {
if (root == null
StringUtil.isEmpty(text)) {
return null;
}
List<AccessibilityNodeInfo> nodeList = root.findAccessibilityNodeInfosByText(text);
if (nodeList == null
nodeList.isEmpty()) {
return null;
}
AccessibilityNodeInfo clickNode = null;
for (AccessibilityNodeInfo nodeInfo : nodeList) {
boolean eqText = nodeInfo.getText() != null && nodeInfo.getText().toString().contains(text);
boolean eqDesc = nodeInfo.getContentDescription() != null && nodeInfo.getContentDescription().toString().contains(text);
if (eqText
eqDesc) {
clickNode = nodeInfo;
break;
}
}
return clickNode;
}
public static boolean findNodeByTextAndClick(AccessibilityNodeInfo root, String text) {
if (root == null
StringUtil.isEmpty(text)) {
return false;
}
List<AccessibilityNodeInfo> nodeList = root.findAccessibilityNodeInfosByText(text);
if (nodeList == null
nodeList.isEmpty()) {
return false;
}
AccessibilityNodeInfo clickNode = null;
for (AccessibilityNodeInfo nodeInfo : nodeList) {
boolean eqText = nodeInfo.getText() != null && nodeInfo.getText().toString().equals(text);
boolean eqDesc = nodeInfo.getContentDescription() != null && nodeInfo.getContentDescription().toString().equals(text);
if (eqText
eqDesc) {
clickNode = nodeInfo;
break;
}
}
return performClick(clickNode);
}
public static boolean findNodeByIdAndClick(AccessibilityNodeInfo root, String id) {
if (root == null
StringUtil.isEmpty(id)) {
return false;
}
List<AccessibilityNodeInfo> nodeList = root.findAccessibilityNodeInfosByViewId(id);
if (nodeList == null
nodeList.isEmpty()) {
return false;
}
return performClick(nodeList.get(0));
}
public static boolean findNodeContainsTextAndClick(AccessibilityNodeInfo root, String text) {
if (root == null
StringUtil.isEmpty(text)) {
return false;
}
List<AccessibilityNodeInfo> nodeList = root.findAccessibilityNodeInfosByText(text);
if (nodeList == null
nodeList.isEmpty()) {
return false;
}
AccessibilityNodeInfo clickNode = null;
for (AccessibilityNodeInfo nodeInfo : nodeList) {
boolean eqText = nodeInfo.getText() != null && nodeInfo.getText().toString().contains(text);
boolean eqDesc = nodeInfo.getContentDescription() != null && nodeInfo.getContentDescription().toString().contains(text);
if (eqText
eqDesc) {
clickNode = nodeInfo;
break;
}
}
Log.i(TAG, "点击:"+text+"!");
return performClick(clickNode);
}
public static boolean findNodeByIdTextAndClick(AccessibilityNodeInfo root, String id, String text, boolean isNewPage) {
AccessibilityNodeInfo clickNode = findNodeByIdAndText(root, id, text);
if (clickNode == null) {
return false;
}
return performClick(clickNode);
}
public static boolean findNodeByIdClassAndClick(AccessibilityNodeInfo root, String id, String className, boolean isNewPage) {
AccessibilityNodeInfo clickNode = findNodeByIdAndClassName(root, id, className);
if (clickNode == null) {
return false;
}
return performClick(clickNode);
}
public static AccessibilityNodeInfo findNodeByIdAndClassName(AccessibilityNodeInfo root, String id, String className) {
if (root == null) {
return null;
}
List<AccessibilityNodeInfo> idNodeInfoList = root.findAccessibilityNodeInfosByViewId(id);
if (idNodeInfoList == null
idNodeInfoList.isEmpty()) {
return null;
}
for (int i = 0; i < idNodeInfoList.size(); i++) {
AccessibilityNodeInfo nodeInfo = idNodeInfoList.get(i);
if (nodeInfo == null) {
continue;
}
//根据className过滤
if (!StringUtil.isEmpty(className)) {
if (className.equals(nodeInfo.getClassName())) {
return nodeInfo;
}
}
}
return null;
}
public static AccessibilityNodeInfo findNodeByTextAndClass(AccessibilityNodeInfo root, String text, String clazz) {
if (root == null) {
return null;
}
List<AccessibilityNodeInfo> idNodeInfoList = root.findAccessibilityNodeInfosByText(text);
if (idNodeInfoList == null
idNodeInfoList.isEmpty()) {
return null;
}
AccessibilityNodeInfo clickNode = null;
for (int i = 0; i < idNodeInfoList.size(); i++) {
AccessibilityNodeInfo nodeInfo = idNodeInfoList.get(i);
if (nodeInfo == null) {
continue;
}
//根据class过滤
if (!StringUtil.isEmpty(clazz)) {
if (clazz.equals(nodeInfo.getClassName().toString())) {
clickNode = nodeInfo;
break;
}
}
}
if (clickNode == null) {
return null;
}
return clickNode;
}
public static AccessibilityNodeInfo findNodeByIdAndText(AccessibilityNodeInfo root, String id, String text) {
if (root == null) {
return null;
}
List<AccessibilityNodeInfo> idNodeInfoList = root.findAccessibilityNodeInfosByViewId(id);
if (idNodeInfoList == null
idNodeInfoList.isEmpty()) {
return null;
}
AccessibilityNodeInfo clickNode = null;
for (int i = 0; i < idNodeInfoList.size(); i++) {
AccessibilityNodeInfo nodeInfo = idNodeInfoList.get(i);
if (nodeInfo == null) {
continue;
}
//根据text过滤
if (!StringUtil.isEmpty(nodeInfo.getText())
&& !StringUtil.isEmpty(text)) {
if (text.equals(nodeInfo.getText())) {
clickNode = nodeInfo;
break;
}
}
}
if (clickNode == null) {
return null;
}
return clickNode;
}
/**
* @param root
* @param id
* @param className
* @return
*/
public static List<AccessibilityNodeInfo> findNodeByIdAndClassNameList(AccessibilityNodeInfo root, String id, String className) {
if (root == null) {
return null;
}
List<AccessibilityNodeInfo> resultList = new ArrayList<>();
List<AccessibilityNodeInfo> idNodeInfoList = root.findAccessibilityNodeInfosByViewId(id);
if (idNodeInfoList == null
idNodeInfoList.isEmpty()) {
return null;
}
for (int i = 0; i < idNodeInfoList.size(); i++) {
AccessibilityNodeInfo nodeInfo = idNodeInfoList.get(i);
if (nodeInfo == null) {
continue;
}
//根据className过滤
if (!StringUtil.isEmpty(className)) {
if (className.equals(nodeInfo.getClassName())) {
resultList.add(nodeInfo);
}
}
}
return resultList;
}
public static AccessibilityNodeInfo findNodeByClass(AccessibilityNodeInfo root, String className) {
if (TextUtils.isEmpty(className)
root == null) {
return null;
}
int childCount = root.getChildCount();
for (int i = 0; i < childCount; i++) {
AccessibilityNodeInfo rootChild = root.getChild(i);
if (rootChild != null) {
if (className.equals(rootChild.getClassName().toString().trim())) {
return rootChild;
}
}
}
return null;
}
public static List<AccessibilityNodeInfo> findNodeByClassList(AccessibilityNodeInfo root, String className) {
List<AccessibilityNodeInfo> list = new ArrayList<>();
if (TextUtils.isEmpty(className)
root == null) {
return Collections.EMPTY_LIST;
}
int childCount = root.getChildCount();
for (int i = 0; i < childCount; i++) {
AccessibilityNodeInfo rootChild = root.getChild(i);
if (rootChild != null) {
if (className.equals(rootChild.getClassName().toString().trim())) {
list.add(rootChild);
}
}
}
return list;
}
public static List<AccessibilityNodeInfo> traverseNodefilterByDesc(AccessibilityNodeInfo root, final String desc) {
if (TextUtils.isEmpty(desc)
root == null) {
return null;
}
List<AccessibilityNodeInfo> list = new ArrayList<>();
traverseNodeClassToList(root, list, new NodeFilter() {
@Override
public boolean filter(AccessibilityNodeInfo node) {
return node.getContentDescription() != null && desc.equals(node.getContentDescription().toString());
}
});
return list;
}
public static List<AccessibilityNodeInfo> traverseNodeByClassName(AccessibilityNodeInfo root, final String className) {
if (TextUtils.isEmpty(className)
root == null) {
return Collections.EMPTY_LIST;
}
List<AccessibilityNodeInfo> list = new ArrayList<>();
traverseNodeClassToList(root, list, new NodeFilter() {
@Override
public boolean filter(AccessibilityNodeInfo node) {
return node.getClassName() != null && className.equals(node.getClassName().toString());
}
});
return list;
}
private static void traverseNodeClassToList(AccessibilityNodeInfo node, List<AccessibilityNodeInfo> list, NodeFilter filter) {
if (node == null
node.getChildCount() == 0) {
return;
}
for (int i = 0; i < node.getChildCount(); i++) {
AccessibilityNodeInfo child = node.getChild(i);
if (child != null) {
if (filter.filter(child)) {
list.add(child);
}
if (child.getChildCount() > 0) {
traverseNodeClassToList(child, list, filter);
}
}
}
}
public interface NodeFilter {
boolean filter(AccessibilityNodeInfo node);
}
public interface NodeTextFilter extends NodeFilter {
String fiterText();
}
public interface NodeIdFilter extends NodeFilter {
String fiterViewId();
}
}
复制代码在部分 Root 的手机,我们可以通过辅助权限找到该节点在屏幕上的位置,并获取中心点:Rect r = new Rect();
node.getBoundsInScreen(r);
if (r.centerX() > ScreenUtils.getScreenWidth(OttUtil.get().getApp())
r.centerY() > ScreenUtils.getScreenHeight(OttUtil.get().getApp())
r.centerX() <= 0
r.centerY() <= 0) {
return false;
}
String cmd = String.format("input tap %d %d", r.centerX(), r.centerY());
复制代码再去执行相关操作:ShellUtils.CommandResult commandResult = ShellUtils.execCmd(cmd, true);
复制代码更多技术分享,请加微信公众号——码农茅草屋:}

我要回帖

更多关于 微信怎么设置秒赞别人朋友圈 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信