52Douyin 发表于 2020-7-17 21:11

auto.js分析微信VX界面,得到发言人、发言内容,输出json

相信很多人都写过vx机器人,有基于ui界面进行操作的,还有基于协议。今天为大家分享的是我以前写的可以从v微信x界面
分析某人分享的链接或者发布的文字内容。
开发工具auto.js4.x;
下面先为大家介绍一下实现思路,上图


看红框处,分析可以看出来,AA发布的内容,是在UIobject里面(android.widget.LinearLayout);
理论上,我只要遍历(android.widget.LinearLayout)的子集就可以找到文本内容,进行分析了
——————下面给大家上代码,代码写的时间比较久了,大家可以做优化,此处只是实现功能
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.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超链接集合,简介+来源 = " + child.text());
                child.children().forEach(function (item) {

                  if ("android.widget.LinearLayout" == item.className()) {
                        log(" " + item.text());
                        item.children().forEach(function (next0) {
                            log(" " + next0.text());
                            next0.children().forEach(function (next1) {
                              log(" " + next1.text());
                              next1.children().forEach(function (next2) {
                                    log(" " + next2.text());
                                    next2.children().forEach(function (next3) {
                                        log(" " + 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));
}

提示:如果是用户发送的文本内容, 需要双击之后,才能提取到,上面也已经实现了。大家可以看代码测试。



可以把对话保存成json格式,输出或者保存。

————代码是以前写的,运行没问题。大家自行调试。比起调用协议,这种实现方式有些复杂,好处是兼容性好,不会因为官方更新接口导致失效。
我现在写的vx机器人是调用协议,思路都差不多,供大家参考

觉得好的,给个好评啊!!!

52Douyin 发表于 2020-7-19 11:02

当时实现了功能,没有做优化;
用户的发言都是嵌套在"android.widget.LinearLayout"里面的。
所以在遍历子集的时候,做了判断。

takpap 发表于 2020-7-17 21:27

这循环地狱啊 {:301_971:}

sitiger 发表于 2020-7-17 21:36

刚接触,还没用上,关注一下

Xiao伟 发表于 2020-7-17 21:42

AUTO.JS 能实现自动回复功能吗? 就跟智能机器人那样

nulla2011 发表于 2020-7-17 22:32

这个看上去不错啊

whatskey 发表于 2020-7-17 22:48

Clearloveu 发表于 2020-7-18 00:11

收藏再说,感谢分享

52Douyin 发表于 2020-7-18 20:56

感谢各位同学的鼓励!!!!!!!!!!!!!!!!!

大侠在路上 发表于 2020-7-18 22:32

感谢楼主分享,帖子写得很棒,唯独的缺点就是if一套一套的,我看得头有点大了。{:301_1009:}
页: [1] 2
查看完整版本: auto.js分析微信VX界面,得到发言人、发言内容,输出json