精华内容
下载资源
问答
  • 请问下,我有一个文件,上边都是电话号码,我想让微信自动加文件上的好友,请问有源代码吗?Java的有吗
  • 原理其实比较简单,主要是通过地图SDK(百度,或者高德)获取对应位置经纬度,然后设置成当前位置(虚拟位置),在通过自动化测试工具自动去操作微信。需求:1 自定义当前位置2 微信搜索附近的人,自动打招呼3 可以自定义...

    周围朋友有做代购的想要自定义位置,并且能够搜索附近的人自动打招呼的功能。

    原理其实比较简单,主要是通过地图SDK(百度,或者高德)获取对应位置经纬度,然后设置成当前位置(虚拟位置),在通过自动化测试工具自动去操作微信。

    需求:

    1 自定义当前位置

    2 微信搜索附近的人,自动打招呼

    3 可以自定义消息内容

    需要的知识点:

    1百度地图SDK 获取位置 设置当前位置

    2robotium自动化测试库

    3 城市位置数据库

    程序框架:

    1启动界面--选择城市---启动微信--自动化操作

    技术预研

    1 模拟位置

    2 结合百度地图或者城市数据库进行位置选择

    3 自动化操作流程

    4 如何启动微信 进行中

    1模拟位置已经通过测试

    2百度地图SDK以前做,获取经纬度坐标 通过

    3启动微信startActivity(AcitivyLanchMM.this.getPackageManager().getLaunchIntentForPackage("com.tencent.mm"));

    4自动化操作正在进行。。。

    遇到的问题:

    Test run failed: Permission Denial: starting instrumentation ComponentInfo{com.jayway.test/android.test.InstrumentationTestRunner} from pid=27322, uid=27322 not allowed because package com.jayway.test does not have a signature matching the target com.tencent.mm

    解决方法:

    使用re-sign.jar 重签名apk

    使用adb install xx.apk进行安装

    注意:在自己的应用中启动自动测试时,使用 String cmd = "adb shell am instrument -e class com.robotium.test.NotePadTest -w com.jayway.test/android.test.InstrumentationTestRunner";

    Runtime.getRuntime().exec(cmd)打开测试用例 需要有root权限(),在没有root的情况下可以使用startInstrumentation(new ComponentName("com.jayway.test", "android.test.InstrumentationTestRunner"), null, null); 打开 参考链接点击打开链接

    自动化操作可以参考Demo:点击打开链接

    完整程序:

    1 GPS(这个是模拟位置的,经纬度可以通过百度地图获取到)

    2 WxRobot(微信6.0以上自动打招呼)

    启动GPS 然后再启动WxRobot 添加好友吧!

    展开全文
  • 微信加好友利器!GPS自动循环定位,自动添加附近的人为好友,完全实现自动化!内附“使用说明”,内附所需全套软件,如,模拟器、微信apk。 资源是我买来的,分享只为赚积分!全网独此一家,看到请珍惜,不要错过!...
  • 妙用AccessibilityService黑科技实现微信自动好友拉人进群聊 标签: 2018 引言: ...小猪的Python学习之旅 —— 19.Python微信自动好友验证,自动回复,发送群聊链接 通过把脚本挂到服务器上...

    妙用AccessibilityService黑科技实现微信自动加好友拉人进群聊

    标签: 2018


    引言

    在上上周的周六和周日,我发了两篇利用itchat实现微信机器人的文章(Python):

    通过把脚本挂到服务器上,自此告别手动挡,不用去手动转发小宇宙,
    不用手动加好友,然后把别人一个个拉到我的Py交易群里。正当我
    暗自窃喜的时候,微信并没有放过我这只小猫咪。

    我还记得那天早上,我兴高采烈早早来到公司,更新了一波代码准备为
    我的机器人添砖加瓦的时候,当我关闭了阿里云上的脚本,这时候意外来了,
    我的机器人小号,再也无法通过微信网页端的接口登录了!!!
    扫描完二维码,永远提示的都是下面这样一句话:

    <error><ret>1203</ret><message>当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。
    你可以通过Windows微信、Mac微信或者手机客户端微信登录。</message></error>

    是的,就是这样一句话,找不到申诉渠道,也不知道何时才可能会解封。(客户端任可正常使用)
    而现在另外新申请的微信小号是无法登录微信网页端的,其实这是微信在慢慢关停网页版登录,
    最主要的原因就是机器人泛滥!

    没有了网页版微信,日子还是要过的,难道只能回归手动档么?几种解决方案:

    • 1.研究客户端协议(这个成本巨高,而且官方稍微改点东西,够你哭的)
    • 2.APP逆向,利用Xposed框架,hook相关的方法,也是有些研究成本的;
    • 3.利用类似与按键精灵的东西,编写脚本让他自动点点点,自动化测试
      工具或者本节讲的这个无障碍服务——AccessibilityService

    AccessibilityService其实不是一个新的东西了,老久之前就有了,
    官方原意:优化残障人士的使用体验的,而在我大天朝:

    抢红包,自动安装,一键XXX等等,可谓欣欣向荣。

    使用AccessibilityService也非常Easy,核心要点就是:

    通过UI Automator找到节点,通过resource-id,text,content-desc等
    唯一特征定位到具体的节点,接着执行各种模拟操作,点,滚动,填充,
    用法比较简单的,大部分时间会花在试错和逻辑调整上

    来一发通过AccessibilityService实现的自动加好友以及拉人进群聊的Gif体验下:

    Gif加速了一点,不过完成加好友以及拉人总共也就耗时15s,是相当客观的啦。
    下面就来介绍下AccessibilityService这个玩意怎么用吧~


    AccessibilityService用法简介

    1.自定义Service继承AccessibilityService

    如题,自定义一个AccessibilityService类,重写两个主要方法:

    onInterrupt( ):辅助功能中断的回调,基本不用理,核心还是
    onAccessibilityEvent(AccessibilityEvent event) 上。

    当界面发生了什么事情,比如顶部Notification,界面更新,内容变化等,
    会触发这个方法,你可以根据不同的事件响应不同的操作,比如小猪这个
    就是当顶部出现加好友的Notification的event时,跳转到加好友页。
    点开AccessibilityEvent类可以看到一堆的事件类型~

    事件类型 描述
    TYPE_VIEW_CLICKED View被点击
    TYPE_VIEW_LONG_CLICKED View被长按
    TYPE_VIEW_SELECTED View被选中
    TYPE_VIEW_FOCUSED View获得焦点
    TYPE_VIEW_TEXT_CHANGED View文本变化
    TYPE_WINDOW_STATE_CHANGED 打开了一个PopupWindow,Menu或Dialog
    TYPE_NOTIFICATION_STATE_CHANGED Notification变化
    TYPE_VIEW_HOVER_ENTER 一个View进入悬停
    TYPE_VIEW_HOVER_EXIT 一个View退出悬停
    TYPE_TOUCH_EXPLORATION_GESTURE_START 触摸浏览事件开始
    TYPE_TOUCH_EXPLORATION_GESTURE_END 触摸浏览事件完成
    TYPE_WINDOW_CONTENT_CHANGED 窗口的内容发生变化,或子树根布局发生变化
    TYPE_VIEW_SCROLLED View滚动
    TYPE_VIEW_TEXT_SELECTION_CHANGED Edittext文字选中发生改变事件
    TYPE_ANNOUNCEMENT 应用产生一个通知事件
    TYPE_VIEW_ACCESSIBILITY_FOCUSED 获得无障碍焦点事件
    TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED 无障碍焦点事件清除
    TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY 在给定的移动粒度下遍历视图文本的事件
    TYPE_GESTURE_DETECTION_START 开始手势监测
    TYPE_GESTURE_DETECTION_END 结束手势监测
    TYPE_TOUCH_INTERACTION_START 触摸屏幕事件开始
    TYPE_TOUCH_INTERACTION_END 触摸屏幕事件结束
    TYPE_WINDOWS_CHANGED 屏幕上的窗口变化事件,需要API 21+
    TYPE_VIEW_CONTEXT_CLICKED View中的上下文点击事件
    TYPE_ASSIST_READING_CONTEXT 辅助用户读取当前屏幕事件

    好吧,上面的表其实并没什么大用,我还是习惯直接把event.toString()给打印出来,
    然后自行去判断~

    如图就可以拿到event类型,以及产生对应事件的类名,核心是这两个,
    除此之外还有Text和ContentDescription等。

    比如我那个监听Notification跳转到添加好友页的:

    这里就是对事件类型做了下判断,然后获取contentIntent,跳转而已。
    简单点讲就是:

    你在这个方法里,去判断一波事件类型和className,
    然后再获取控件,做一些点击,滚动,填充文本等。


    2.服务的配置

    自定义完这个服务要想让他启用你还得执行下面的操作:

    Step 1:在res文件夹下创建xml文件夹,新建一个配置的xml文件(名字自己定)

    <?xml version="1.0" encoding="utf-8"?>
    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged|typeWindowContentChanged"
        android:accessibilityFeedbackType="feedbackGeneric"
        android:accessibilityFlags="flagDefault"
        android:canRetrieveWindowContent="true"
        android:notificationTimeout="100"
        android:packageNames="com.tencent.mm"
        android:settingsActivity="com.coderpig.wechathelper.MainActivity" />

    属性简介如下

    • accessibilityEventTypes:设置监听的事件种类,用|隔开,监听所有可以用typeAllMask;
    • accessibilityFeedbackType:服务提供的反馈类型,feedbackGeneric通用反馈;
    • accessibilityFlags:辅助功能附加的标志,flagDefault默认的配置
    • canRetrieveWindowContent:辅助功能服务是否能够取回活动窗口内容的属性
    • notificationTimeout:响应时间
    • packageNames:监听的应用包名,不填,默认监听所有应用的事件
    • settingsActivity:允许用户修改辅助功能的activity类名

    Step 2:接着AndroidManifest.xml文件中对该Service进行配置

    先是添加一个权限:

    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"  

    接着是Service的配置:

    这里是你那个配置文件xml文件的文件名,其他照抄。

    Step 3:安装到手机后,需要在手机设置的无障碍处开启服务

    一般在设置的辅助功能处能找到:

    如果Logcat那里能看到打印的LOG,说明服务正常运行,接下来要找控件节点


    3.找控件

    这里可以用到神器UI Automator来查看布局层次,打开Android Studio,
    Ctrl + alt + A,输入 monitor

    依次点击:选中设备 -> Dump View Hierarchy for UI Automator

    稍等一会,右侧就会出现当前页面的布局层次图,如图随手选中一个邀请的节点:

    右侧可以拿到对应的信息,一般比较常用的是这几个,有一点要注意!!!
    resource-id不一定是唯一的

    获得控件基本都会通过下述这个方法:

    getRootInActiveWindow( ):获取当前整个活动窗口的根节点
    返回的是一个AccessibilityNodeInfo类,代表View的状态信息,
    提供了下述几个非常实用的方法:

    • getParent:获取父节点。
    • getChild:获取子节点。
    • performAction:在节点上执行一个动作。
    • findAccessibilityNodeInfosByText:通过字符串查找节点元素。
    • findAccessibilityNodeInfosByViewId:通过视图id查找节点元素。

    后面的这两个方法会返回一个AccessibilityNodeInfo列表,一般操作是
    遍历,然后筛选特定节点,比如我程序里的,获得底部Tab节点为”通讯录”,
    然后点击,跳转后遍历,筛选”群聊”的节点,点击。

    另外,UI Automator有时并不可靠(实时问题),我建议写多一个遍历节点
    的方法,可以更清楚里面的控件情况:

    拿到控件,接着就到触发事件了。


    4.触发事件

    通过调用performAction()传入一个时间类型即可触发相应时间,比如点击,长按等
    事件就多了,自己点开AccessibilityNodeInfo类查看吧,这里介绍下最常用的几个事件:

    //点击
    performAction(AccessibilityNodeInfo.ACTION_CLICK);
    
    //长按
    performAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
    
    //滚动
    performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); //向下滚一下
    performAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); //向上滚一下
    
    //填充EditText(API版本需要>18可用方法1,API>21两种方法都可以使用)
    
    //方法1:
    ClipboardManager clipboard = (ClipboardManager)this.getSystemService(Context.CLIPBOARD_SERVICE);  
    ClipData clip = ClipData.newPlainText("text", "填充内容");  
    clipboard.setPrimaryClip(clip);  
    //获得焦点
    info.performAction(AccessibilityNodeInfo.ACTION_FOCUS);  
    粘贴进入内容  
    info.performAction(AccessibilityNodeInfo.ACTION_PASTE);  
    
    //方法2:
    Bundle arguments = new Bundle();  
    arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "填充内容");  
    info.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);  

    除了控件触发事件外,AccessibilityService提供了一个performGlobalAction(),用于执行
    一些通用的事件

    GLOBAL_ACTION_BACK    点击返回按钮
    GLOBAL_ACTION_HOME    点击home
    GLOBAL_ACTION_NOTIFICATIONS    打开通知
    GLOBAL_ACTION_RECENTS    打开最近应用
    GLOBAL_ACTION_QUICK_SETTINGS    打开快速设置
    GLOBAL_ACTION_POWER_DIALOG    打开长按电源键的弹框

    另外在实际开发中,直接调用这些全局方法又是并没有生效,
    我在调GLOBAL_ACTION_BACK的时候就发现有时不会回退,
    个人的解决方案是使用handler.postDelay()延时执行:

    除了这样玩以外,我还利用时间差,串行去执行几个任务,比如:

    上面的步骤是:

    进入群聊聊天信息页后,列表滚动两次,接着依次:

    • 1.延时1s后,找到添加成员按钮并点击;
    • 2.延时2.3s后,把名字填充到EditText里
    • 3.延时3s后,点击确定按钮

    就不用过于依赖onAccessibilityEvent方法,除了用handler.postDelay外,
    还可以用Thread.sleep(休眠时长),用到的点大概就这么多,其余的自行探究吧。


    小结

    本节讲解一波如何通过AccessibilityService来实现自动加好友以及拉人进群,
    之前是打算用xposed来写的,后面发现没我想像中简单,而且很多用安卓机的都
    不会搞机(基),root也不会,后来还是选择了AccessibilityService,简单易用,
    当然后面还是会研究一波xposed实现的,敬请期待~
    对了,还有,之前那个网页端的机器人被封原因估计是信息秒回,如果有还用
    itchat那个做机器人的,建议回复的时间可以稍微延长些;

    关于AccessibilityService更多内容可见


    附:关键代码(都可以在:https://github.com/coder-pig/WechatHelper 找到):
    代码有Bug的话正常,后续会优化下逻辑,感觉写得有点杂~

    package com.coderpig.wechathelper;
    
    import android.accessibilityservice.AccessibilityService;
    import android.app.Notification;
    import android.app.PendingIntent;
    import android.os.Bundle;
    import android.os.Handler;
    import android.util.Log;
    import android.view.accessibility.AccessibilityEvent;
    import android.view.accessibility.AccessibilityNodeInfo;
    
    import java.util.List;
    
    /**
     * 描述:微信监控服务类
     *
     * @author CoderPig on 2018/04/04 13:46.
     */
    
    public class HelperService extends AccessibilityService {
    
        private static final String TAG = "HelperService";
        private Handler handler = new Handler();
        private String userName = "123";
    
        @Override
        public void onAccessibilityEvent(AccessibilityEvent event) {
            int eventType = event.getEventType();
            CharSequence classNameChr = event.getClassName();
            String className = classNameChr.toString();
            Log.d(TAG, event.toString());
            switch (eventType) {
                case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
                    if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) {
                        Notification notification = (Notification) event.getParcelableData();
                        String content = notification.tickerText.toString();
                        if (content.contains("请求添加你为朋友")) {
                            PendingIntent pendingIntent = notification.contentIntent;
                            try {
                                pendingIntent.send();
                            } catch (PendingIntent.CanceledException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    break;
                case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
                    switch (className) {
                        case "com.tencent.mm.plugin.subapp.ui.friend.FMessageConversationUI":
                            addFriend();
                            break;
                        case "com.tencent.mm.plugin.profile.ui.SayHiWithSnsPermissionUI":
                            verifyFriend();
                            break;
                        case "com.tencent.mm.plugin.profile.ui.ContactInfoUI":
                            performBackClick();
                            break;
                        case "com.tencent.mm.ui.LauncherUI":
                            if (!userName.equals("123")) {
                                openGroup();
                            }
                            break;
                        case "com.tencent.mm.ui.contact.ChatroomContactUI":
                            if (!userName.equals("123")) {
                                inviteGroup();
                            }
                            break;
                        case "com.tencent.mm.ui.chatting.ChattingUI":
                            if (!userName.equals("123")) {
                                openGroupSetting();
                            }
                            break;
                        case "com.tencent.mm.plugin.chatroom.ui.ChatroomInfoUI":
                            if (userName.equals("123")) {
                                performBackClick();
                            } else {
                                addToGroup();
                            }
                            break;
                        case "com.tencent.mm.ui.base.i":
                            dialogClick();
                            break;
                    }
                    break;
                case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
    
            }
        }
    
        private void addFriend() {
            AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
            if (nodeInfo != null) {
                List<AccessibilityNodeInfo> list = nodeInfo
                        .findAccessibilityNodeInfosByText("接受");
                if (list != null && list.size() > 0) {
                    for (AccessibilityNodeInfo n : list) {
                        n.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    }
                } else {
                    performBackClick();
                }
            }
        }
    
        private void verifyFriend() {
            AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
            //获得用户名
            if (nodeInfo != null) {
                userName = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/d0n").get(0).getText().toString();
                AccessibilityNodeInfo finishNode = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/hd").get(0);
                finishNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
            }
        }
    
        private void openGroup() {
            AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
            if (nodeInfo != null) {
                List<AccessibilityNodeInfo> nodes = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/ca5");
                for (AccessibilityNodeInfo info : nodes) {
                    if (info.getText().toString().equals("通讯录")) {
                        info.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
                                if (nodeInfo != null) {
                                    List<AccessibilityNodeInfo> nodes = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/j5");
                                    for (AccessibilityNodeInfo info : nodes) {
                                        if (info.getText().toString().equals("群聊")) {
                                            info.getParent().getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
                                            break;
                                        }
                                    }
                                }
                            }
                        }, 500L);
                    }
                }
            }
        }
    
        private void inviteGroup() {
            AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
            if (nodeInfo != null) {
                List<AccessibilityNodeInfo> nodes = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/a9v");
                for (AccessibilityNodeInfo info : nodes) {
                    if (info.getText().toString().equals("小猪的Python学习交流群")) {
                        info.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
                        break;
                    }
                }
            }
        }
    
        private void openGroupSetting() {
            AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
            if (nodeInfo != null) {
                nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/he").get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
            }
        }
    
        private void addToGroup() {
            AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
            if (nodeInfo != null) {
                List<AccessibilityNodeInfo> listNodes = nodeInfo.findAccessibilityNodeInfosByViewId("android:id/list");
                if(listNodes != null && listNodes.size() > 0) {
                    AccessibilityNodeInfo listNode = listNodes.get(0);
                    listNode.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
                    listNode.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
                    final AccessibilityNodeInfo scrollNodeInfo = getRootInActiveWindow();
                    if (scrollNodeInfo != null) {
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                List<AccessibilityNodeInfo> nodes = scrollNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/d0b");
                                for (AccessibilityNodeInfo info : nodes) {
                                    if (info.getContentDescription().toString().equals("添加成员")) {
                                        info.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
                                        break;
                                    }
                                }
                            }
                        },1000L);
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                List<AccessibilityNodeInfo> editNodes = getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/arz");
                                if(editNodes != null && editNodes.size() > 0) {
                                    AccessibilityNodeInfo editNode = editNodes.get(0);
                                    Bundle arguments = new Bundle();
                                    arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, userName);
                                    editNode.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
                                }
                            }
                        }, 2300L);
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                List<AccessibilityNodeInfo> cbNodes = getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/kr");
                                if(cbNodes != null) {
                                    AccessibilityNodeInfo cbNode = null;
                                    if(cbNodes.size() == 1) {
                                        cbNode = cbNodes.get(0);
                                    } else if(cbNodes.size() == 2) {
                                        cbNode = cbNodes.get(1);
                                    }
                                    if (cbNode != null) {
                                        cbNode.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
                                        AccessibilityNodeInfo sureNode = getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/hd").get(0);
                                        sureNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                                    }
                                }
                            }
                        }, 3000L);
                    }
                }
    
            }
    
        }
    
        private void dialogClick() {
            AccessibilityNodeInfo inviteNode = getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/aln").get(0);
            inviteNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
            userName = "123";
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    List<AccessibilityNodeInfo> sureNodes = getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/aln");
                    if(sureNodes != null && sureNodes.size() > 0) {
                        AccessibilityNodeInfo sureNode = sureNodes.get(0);
                        sureNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    }
    
                }
            },1000L);
        }
    
        private void performBackClick() {
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
                }
            }, 300L);
        }
    
        //遍历控件的方法
        public void recycle(AccessibilityNodeInfo info) {
            if (info.getChildCount() == 0) {
                Log.i(TAG, "child widget----------------------------" + info.getClassName().toString());
                Log.i(TAG, "showDialog:" + info.canOpenPopup());
                Log.i(TAG, "Text:" + info.getText());
                Log.i(TAG, "windowId:" + info.getWindowId());
                Log.i(TAG, "desc:" + info.getContentDescription());
            } else {
                for (int i = 0; i < info.getChildCount(); i++) {
                    if (info.getChild(i) != null) {
                        recycle(info.getChild(i));
                    }
                }
            }
        }
    
        @Override
        public void onInterrupt() {
    
        }
    
    
    }
    

    来啊,Py交易啊

    想加群一起学习Py的可以加下,智障机器人小Pig,验证信息里包含:
    PythonpythonpyPy加群交易屁眼 中的一个关键词即可通过;

    验证通过后回复 加群 即可获得加群链接(不要把机器人玩坏了!!!)~~~
    欢迎各种像我一样的Py初学者,Py大神加入,一起愉快地交流学♂习,van♂转py。


    展开全文
  • 本文会利用前三篇文章的知识点实现微信自动加好友跟着我们一起来作用例设计吧。 需求分析 要实现添加好友第一步:点击添加选择添加朋友 第二步:输入用户手机号并选择搜索 第三步:点击添加到通讯录,实现方式与...

    如果您已经看过了前三篇文章,恭喜您已经初步了解了JavaAppium。本文会利用前三篇文章的知识点实现微信自动加好友跟着我们一起来作用例设计吧。

    需求分析

    image.png
    要实现添加好友第一步:点击添加选择添加朋友 第二步:输入用户手机号并选择搜索 第三步:点击添加到通讯录,实现方式与抖音添加好友类似。

    需求设计方案

    搜索关键字存储在数据中心 https://test.igood.wang 编写三个界面,及三个控制器。

    微信号:CompanyAiHelper

    展开全文
  • 使用java生成微信随机加好友的链接

    千次阅读 2019-08-14 11:01:22
    微信PC复制会自动加空格把这个a标签破坏掉,所以用其他工具复制 朋友圈发不了,跟(2)一样 会自动加空格把a标签破坏掉,其他自测 先看一下效果 你看用微信复制的时候,a标签就被破坏了 要自己重新改一下 点击...
    1. Java写的,其他语言自己翻译,其实就是一个随机数生成
    2. 微信PC复制会自动加空格把这个a标签破坏掉,所以用其他工具复制
    3. 朋友圈发不了,跟(2)一样 会自动加空格把a标签破坏掉,其他自测

    先看一下效果
    在这里插入图片描述
    你看用微信复制的时候,a标签就被破坏了 要自己重新改一下
    在这里插入图片描述
    点击以后进去这个页面。但是这种应该是没有真人的,我没加好友,自行测试。

    首先是main

    public static void main(String[] args) {
            //12位数
            String str="<a href=\"weixin://contacts/profile/wxid_%s\">点击加好友%s</a>";
            boolean flag=true;
            int num=0;
            System.out.println("请输入一个大于0小于10000的正整数:");
            while (flag){
                Scanner scanner = new Scanner(System.in);
                try {
                    num = scanner.nextInt();
                    if(num<=0||num>=10000){
                        System.out.println("输入错误!请输入一个大于0小于10000的正整数:");
                    }else{
                        flag=false;
                    }
                }catch (Exception e){
                    System.out.println("输入错误!请输入一个大于0小于10000的正整数:");
                }
            }
    
            for (int i = 0; i <num ; i++) {
                //生成随机id
                String randomString= getRandomString(12);
                //format替换里面的参数
                System.out.println(String.format(str,randomString,i));
            }
        }
    

    然后是生成随机id的方法

     //生成随机数
        public static String getRandomString(int length){
            String str="abcdefghijklmnopqrstuvwxyz0123456789";
            StringBuffer sb = new StringBuffer();
            Random random = new Random();
            for (int i = 0; i < length; i++)
            {
                sb.append(str.charAt(random.nextInt(str.length())));
            }
            return sb.toString();
        }
    

    最后是控制台效果
    在这里插入图片描述

    展开全文
  • 微信自动添加好友软件打包下载

    千次阅读 2018-09-10 23:46:59
    因为需要添加大量的微信好友,所以专门编写了一个脚本来执行。解决了非常大的问题,让想要添加微信好友的人找到了非常方便的方法。 首先,来说一下解决思路:要识别微信里面的界面元素,所以要用到与测试有关的东西...
  • 实现了微信自动添加好友 后端使用python的django 框架实现了简单的登录、注册、名单下载、CDK授权、自动添加好友。 后期准备实现:名单上传、微信支付、数据同步、名单分地域、等功能。 } 软件架构 ROOM 使用说明 ...
  • 本帖最后由 hjw45611 于 2019-6-22 18:00 编辑严重声明本文的意图只有一个就是通过分析app...上篇文章仅仅做到自动查看联系人信息就结尾了,总感觉对不起这个帖子的题目,所以利用这几天的空闲时间就有了第二篇自动...
  • 检测微信自动删除好友

    千次阅读 2017-01-01 16:16:52
    目前只适配了6.3.32版本的,在android studio上导入,运行程序后点击开始检测,如果手机没有开启无障碍服务,则会调到设置页面进行打开无障碍服务,该app主要是用到了AccessibilityService 界面的ui控件的检测使用的...
  • 原理很简单:robot类模拟键盘输入,快捷键打开微信,搜索好友,把发送内容发送的粘贴板实现。 程序源码 package com.cloudansys.test; import java.awt.*; import java.awt.datatransfer.Clipboard; import java....
  • 摸鱼时写的一个程序,用的主要是java Robot.直接贴代码吧 import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.KeyEvent; import ...
  • ai 自动外呼 微信加好友Pwnagotchi is an A2C-based AI, powered by bettercap and running on a Raspberry Pi Zero W, that learns from its surrounding Wi-Fi environment to maximize crackable WPA key ...
  • 功能完成以后,就开始捣鼓AppleScript,发现微信并没有提供字典,我就尝试着进行了几个测试,看是否能通过特定的键盘操作实现找到好友,并给好友发送消息,接着尝试使用脚本来控制微信发消息,结果是成功的,相关...
  • 微信开发 自动转发朋友圈 自动添加好友等等

    万次阅读 热门讨论 2018-01-11 11:22:51
    本人有幸在上家公司做外包的时候接触了这个项目,专门针对微信做的一些功能,有自动删除僵尸粉,自动发朋友圈,自动添加好友自动同意添加等等很多功能。 这时候可能会有一些人会问:难道你有微信的源码吗?不然...
  • 主要作用,是统计微信每天有多少人你,并自动通过验证 /// /// 二维码发生变化事件 /// public event EventHandler QRCodeChangeEvent; /// <summary> /// 二维码状态发生改变事件 /// </summary>...
  • * 微信自动添加好友 * @author wechatno:tangjinjinwx * @blog http://www.wlkankan.cn */ @Async public void handleMsg(ChannelHandlerContext ctx ,TransportMessage vo, String ...
  • 一直都想实现个人智能微信,不需要自己操作就可以实现与好友的交流,实现微信的智能化。但是在实现过程中,发现已有大神封装了相应的API了,自己做简单调用就可实现了,组件的Git地址:...
  • 想查看微信好友撤回的消息?Python帮你搞定

    万次阅读 多人点赞 2019-12-01 13:50:59
    要说微信最让人恶心的发明,消息撤回绝对能上榜。 比如你现在正和女朋友用微信聊着天,或者跟自己喜欢的女孩子聊着天,一个不留神,你没注意到对方发的消息就被她及时撤回了,这时你很好奇,好奇她到底发了什么?...
  • net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.5.0</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId&...
  • //打开微信 Ctrl+Alt+W assert robot != null; robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_ALT); robot.keyPress(KeyEvent.VK_W); //释放Ctrl按键,像Ctrl,退格键,删除键这样的功能...
  • 微信自动发送消息

    万次阅读 2018-01-14 16:38:52
    于是乎,想到能不能自动去打广告~ 可以的~ 哈哈 方案: 最近在看api文档,就最先想到能不能java模拟发送信息,但是又没头绪(放弃) 然后百度了相关信息,得出 ①脚本精灵录制(直接趴,这不是自己编程该有...
  • 这个其实不光微信,QQ也是可以的,想一下平时如果想刷屏群聊,聊天不爽了想骂回去,惹女朋友生气了想不停的道歉,或者每天定时问候一下,这些如果都要自己手动操作也太麻烦了吧,还不如写一个程序解决了呢。...
  • 下面微信跳转的方式主要介绍了两种:微信分享给好友微信扫码跳转。 前提:从微信公众号那边获取appid,mchid,secret,grantType四个参数备用。 1、绑定域名 先登陆公众平台进入“公众号设置”的“功能设置”...
  • 无聊中,然后玩下微信自动回复吧 经过: 百度百度百度, cvcvcvcvcvcv from wxpy import * turing = Tuling(api_key='ea83ffc2ca*******0dec9828145')#机器人的ID bot=Bot() friend=bot.friends().search('指定好友') @...
  • 利用微信群管家可以帮助设置入群欢迎、广告T人,同意好友并拉入群、关键词自动回复、关键词入群、多群群发、定时群发任务等。二、微信群管家哪个好用?给大家简单分享一些比较好用的,大家可以根据自己的需要进行选择...
  • 微信自动发消息源码

    2016-08-26 15:44:40
    微信网页版发送消息源码,有问题留言问我

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,509
精华内容 2,203
关键字:

微信怎么自动加好友java

java 订阅