相信很多人都写过vx机器人,有基于ui界面进行操作的,还有基于协议。今天为大家分享的是我以前写的可以从v微信x界面
分析某人分享的链接或者发布的文字内容。
开发工具auto.js4.x;
下面先为大家介绍一下实现思路,上图
看红框处,分析可以看出来,AA发布的内容,是在UIobject里面(android.widget.LinearLayout);
理论上,我只要遍历(android.widget.LinearLayout)的子集就可以找到文本内容,进行分析了
——————下面给大家上代码,代码写的时间比较久了,大家可以做优化,此处只是实现功能
[Java] 纯文本查看 复制代码 let _index = 0;//当前索引
/**所有人员姓名 */
let allBodyName = new Array();
//发言人:内容模块:包含发言人姓名,发言内容;
let OneYuan = className("android.widget.LinearLayout").depth(12).find();
if (!OneYuan.empty()) {
for (let obj of OneYuan) {
//id序号,TalkName发言人,TalkContent发言内容,LinkTitle发布的标题,LinkDesc简介,
var str = { "id": "", "TalkName": "", "TalkContent": "", "LinkTitle": "", "LinkDesc": "", "LinkSource": "" };
//log("[obj]=>" + obj.className() );
obj.children().forEach(function (child) {
log("【01.child】" + child.className()+" text? "+child.text());//+" = "+ child.id()
if ("android.widget.TextView" == child.className()) {
log(" <发言人>" + child.text() );//+ " id " + child.id()
str.TalkName = child.text();
str.id = _index++;
}
if ("android.view.View" == child.className() && "com.tencent.mm:id/ala" == child.id()) {
log("View.id>>【双击打开】:" + child.id());
click(child.bounds().centerX(), child.bounds().centerY());
sleep(50);
click(child.bounds().centerX(), child.bounds().centerY());
sleep(3000);
let getText = className("android.widget.TextView").depth(9).findOne(500);
if (getText) {
log("《发言》" + getText.text());
str.TalkContent = getText.text();
// //存储
// allBodyName.push(str);
}
sleep(2000);
back();
sleep(2000);
}
if ("android.widget.LinearLayout" == child.className()) {
log("LinearLayout>>find超链接集合,简介+来源 = [text] " + child.text());
child.children().forEach(function (item) {
if ("android.widget.LinearLayout" == item.className()) {
log("[item text] " + item.text());
item.children().forEach(function (next0) {
log("[next0 text] " + next0.text());
next0.children().forEach(function (next1) {
log("[next1 text] " + next1.text());
next1.children().forEach(function (next2) {
log("[next2 text] " + next2.text());
next2.children().forEach(function (next3) {
log("[next3 text] " + next3.text());
if ("android.widget.TextView" == next3.className()) {
log("next3【链接标题】:" + next3.text());
str.LinkTitle = next3.text();
}
if ("android.widget.LinearLayout" == next3.className()) {
next3.children().forEach(function (next4) {
if ("android.widget.LinearLayout" == next4.className()) {
next4.children().forEach(function (next5) {
if ("android.widget.LinearLayout" == next5.className()) {
next5.children().forEach(function (next50) {
log("next50《简介》:" + next50.className() + " = " + next50.text());
str.LinkDesc = next50.text();
});
}
if ("android.widget.RelativeLayout" == next5.className()) {
next5.children().forEach(function (next51) {
if ("android.widget.TextView" == next51.className()) {
log("next51《来源》: = " + next51.text() + "--" + next51.className());
//有的没有来源
str.LinkSource = next51.text();
}
});
}
//找到'小程序'标签
if("android.widget.TextView" == next5.className()){
//log("小程序>>"+next5.text());
str.LinkSource = next5.text()
}
})
}//next4
});
}
});//next2
});//next1
});
});
}
});
}
});
///log("==="+ str.TalkName);
// //有的没有【来源】
// //存储
if(str.TalkName!=null && str.TalkName!=""){
allBodyName.push(str);
}
// if (str && str.TalkName != "") {
// log("保存完成,一次循环,记录提取的数据!!>>记得查看数据>>>");
// }
sleep(2000);
}
}
else {
log("没找到'发言元素'");
}
log("lens->" + allBodyName.length);
for (let k = 0; k < allBodyName.length; k++) {
log("PPPPP "+JSON.stringify(allBodyName[k]));
}
提示:如果是用户发送的文本内容, 需要双击之后,才能提取到,上面也已经实现了。大家可以看代码测试。
可以把对话保存成json格式,输出或者保存。
————代码是以前写的,运行没问题。大家自行调试。比起调用协议,这种实现方式有些复杂,好处是兼容性好,不会因为官方更新接口导致失效。
我现在写的vx机器人是调用协议,思路都差不多,供大家参考
觉得好的,给个好评啊!!!
|