精华内容
下载资源
问答
  • 目前微信营销行业主要有两大神器,云控和群控,对于群控大家可能多少有些了解。总所周知,群控就是一种通过系统,实现一台...通过对微信功能的开发,实现了微信智能对话,定时站街扫街加粉、自动加人发朋友圈等。 关...

    目前微信营销行业主要有两大神器,云控和群控,对于群控大家可能多少有些了解。总所周知,群控就是一种通过系统,实现一台PC控制百台手机微信的新媒体的一种营销软件,而云控系统核心功能与群控大致一样,主要区别是云控不需要物理连接。
    至于两者的优势相信大家也看到很多对比类的文章,总体来说两者都能使营销效率更快,节省人工成本。通过对微信功能的开发,实现了微信智能对话,定时站街扫街加粉、自动加人发朋友圈等。
    关于选择方面,主要看应用场景,云控更适合手机无需集中放置,不需要实时查看执行情况等应用场景,比较典型的是养号、连锁企业发朋友圈、加人等,而群控更适合试试双向控制手机类。因此大家在选择方面,关注自己使用的应用场景做出判断。

    在程序厂家方面,字节科技一直致力于研发群控、云控等手机营销软件,公司云控和群控系统绝非市面上破解版,客户可亲临公司考察,同时字节科技可满足用户定制化需求,只需花很少钱即可获得程序源代码,且提供全套技术文档、源代码及技术支持,相当于买几套产品的价格即可获得源代码,根据自己需求任意定制和销售,真正满足客户切身需求。源码咨询电话:壹伞二八000久六久久~~~~
    
    展开全文
  • 上一篇博客我给大家分享了运用appium+java+android实现自动微信的测试用例,今天我再给大家分享一下自动发朋友圈的测试用例吧,由于基本原理都一样,所以只把代码贴出来,如果有疑问的话,可以看看我的前一篇...

    上一篇博客我给大家分享了运用appium+java+android实现自动化发微信的测试用例,今天我再给大家分享一下自动化发朋友圈的测试用例吧,由于基本原理都一样,所以只把代码贴出来,如果有疑问的话,可以看看我的前一篇博客
    Appium +java+Android 三(使用appium实现自动化给朋友发微信的测试用例)

    以下是我的实现代码

    private AppiumDriver driver;
    
    @BeforeClass
    public void setUp() throws MalformedURLException {
    	DesiredCapabilities cap = new DesiredCapabilities();
    
    	cap.setCapability(CapabilityType.BROWSER_NAME, "");
    	cap.setCapability("PlatformName", "Android");
    	cap.setCapability("deviceName", "RSY5LZ89F67SJZYT");
    	cap.setCapability("platformversion", "5.1");
    	cap.setCapability("appPackage", "com.tencent.mm");
    	cap.setCapability("appActivity", "com.tencent.mm.ui.LauncherUI");
    	cap.setCapability("appWaitActivity", "com.tencent.mm.ui.LauncherUI");
    	cap.setCapability("unicodeKeyboard", "True");// 使用Unicode输入法,默认 false
    	cap.setCapability("resetKeyboard", "True");// 在使用了unicode输入法测试结束后,重置输入法到原有状态。如果单独使用,将会被忽略。默认值 false
    	// 每次启动时覆盖session,否则第二次后运行会报错不能新建session
    	cap.setCapability("sessionOverride", true);
    
    	driver = new AndroidDriver(new URL("http://10.10.1.111:4723/wd/hub"), cap);
    
    }
    
    @Test
    public void demo() throws InterruptedException {
    
    	try {
    		Thread.sleep(5000);
    		List<WebElement> list = driver.findElementsById("com.tencent.mm:id/c_x");// 通过驱动找元素
    
    		if (CollectionUtils.isNotEmpty(list)) {
    
    			// 找到第三个发现
    			WebElement target = list.get(2);// 发现
    			System.out.println(target.getText());
    			// WebElement target = getTarget(list);
    			if (target != null) {
    				target.click();// 点击发现
    				Thread.sleep(500);
    			}
    
    			List<WebElement> list1 = driver.findElementsById("android:id/title");
    			if (CollectionUtils.isNotEmpty(list1)) {
    				// 找到第2个框朋友圈
    				WebElement target1 = list1.get(1);// 朋友圈
    				System.out.println(target1.getText());
    				if (target1 != null) {
    					target1.click();// 点击进入朋友圈
    					Thread.sleep(500);
    
    				}
    
    			}
    
    			// 找到发朋友圈按钮
    			WebElement webElement3 = driver.findElementById("com.tencent.mm:id/g_");
    			if (webElement3 != null) {
    				System.out.println(webElement3.getText());
    				webElement3.click();// 点击相机的icon
    				Thread.sleep(500);
    			}
    
    			// 点击从相册选取
    			WebElement webElement4 = (WebElement) driver.findElementsById("com.tencent.mm:id/ga").get(1);
    			if (webElement4 != null) {
    				System.out.println(webElement4.getText());
    				webElement4.click();
    				Thread.sleep(500);
    			}
    			// 选择第一张照片
    			List<WebElement> list3 = driver.findElementsById("com.tencent.mm:id/bpl");
    			if (CollectionUtils.isNotEmpty(list3)) {
    				// WebElement target3 = list3.get(0);// 选择第一张照片
    
    			\\选择九张照片
    				for (int i = 0; i < 9; i++) {
    					WebElement target3 = list3.get(i);
    					if (target3 != null) {
    						System.out.println(target3.getText());
    						target3.click();// 点击选择照片
    
    					}
    				}
    
    			}
    			// 点击完成
    			WebElement webElement5 = driver.findElementById("com.tencent.mm:id/hd");
    			if (webElement5 != null) {
    				System.out.println(webElement5.getText());
    				webElement5.click();// 点击完成
    				Thread.sleep(500);
    			}
    			//这是朋友圈文字
    			driver.findElementById("com.tencent.mm:id/der").sendKeys("这是我的自动化脚本发送的第一条朋友圈,还是很开心");
    			Thread.sleep(500);
    			driver.findElementById("com.tencent.mm:id/hd").click();
    
    		}
    
    	} catch (Exception e) {
    		// TODO: handle exception
    		System.out.println(e.getStackTrace());
    	}
    
    }
    
    @AfterClass
    public void tearDown() throws InterruptedException {
    	Thread.sleep(5000);
    	driver.quit();
    
    }
    

    }

    展开全文
  • 基于Web微信API的框架 如 # wechaty 这里以这个举例是因为他有个付费版,可以自动发朋友圈,可以分享卡片,可以做群管理,很是方便快捷 ,但是太贵了,200块大洋一个月,你用了之后预计就甩不掉了。 基于xposed 插件...
    wechat

    背景

    要实现微信自动化,大致有这么几种办法

    1. 基于Web微信API的框架 如 # wechaty 这里以这个举例是因为他有个付费版,可以自动发朋友圈,可以分享卡片,可以做群管理,很是方便快捷 ,但是太贵了,200块大洋一个月,你用了之后预计就甩不掉了。
    2. 基于xposed 插件开发 ,通过广播方式和sdk 交互,只要发送广播就可以自动发送朋友圈,但是实现难度相对较高,需要逆向知识,还有被封号的风险,不可取。
    3. 基于AccessibilityService实现,有一个自动抢红包的功能就是通过他实现的,原本该功能是对那些由于视力、听力或其它身体原因导致不能方便使用Android智能手机的用户,Android提供了Accessibility功能和服务帮助这些用户更加简单地操作设备,包括文字转语音(不支持中文)、触觉反馈、手势操作、轨迹球和手柄操作等,到Android 4.1版本以后,系统辅助服务增加了与窗口元素的双向交互,此时可以通过辅助功能服务操作窗口元素,比如点击按钮、输入文本信息等功能,越来越方便。

    这些方法各有利弊,综合看来,第一种实现总会有一天微信说要关闭web服务,那岂不是很惨,第二种风险在于被封号,只有第三种目前看来最合适,想要自动发送朋友圈,AccessibilityService是最完美的实现。知其然知其所以然,我们要想用好AccessibilityService,就要明白其原理,这样能更好的理解每一步操作的含义,少走弯路,避免考虑不周导致成功率不足。

    自动化视频效果展示:

    在做的过程中,也遇到很多问题,例如经常拿不到
    AccessibilityNodeInfo实例,如果拿不到就无法操作当前界面的元素,等于是无法再执行下去了,这里有几个关键点需要注意的,只要注意这几个就可以完美拿到。卖个关子,下面会提到,请往下看。

    AccessibilityService原理

    先大致了解下原理,对你的使用更是事半功倍。
    类图源于 here

    AccessibilityService类图

    分析下这个类图。

    • AccessibilityService:最主要的onBind()、onAccessibilityEvent(event: AccessibilityEvent)、onInterrupt()三个函数,后面两个需要子类实现,onBind已经实现了,看下这个函数源码 直接return了一个静态内部类IAccessibilityServiceClientWrapper
    public final IBinder onBind(Intent intent) { return 
    new IAccessibilityServiceClientWrapper(this, getMainLooper(), new Callbacks() {
            }
    }
    
    • IAccessibilityServiceClientWrapper : 用于和system_server通信的匿名Binder服务,
    public static class IAccessibilityServiceClientWrapper extends IAccessibilityServiceClient.Stub
                implements HandlerCaller.Callback {
    

    该类又继承了IAccessibilityServiceClient.Stub,并实现了HandlerCaller.Callback接口。看到这分析出,这是一个跨进程通信Service,在IAccessibilityServiceClientWrapper构造函数中看到Callbacks 回调接口

       public interface Callbacks {
            void onAccessibilityEvent(AccessibilityEvent event);
            void onInterrupt();
            void onServiceConnected();
            void init(int connectionId, IBinder windowToken);
            boolean onGesture(int gestureId);
            boolean onKeyEvent(KeyEvent event);
            void onMagnificationChanged(@NonNull Region region,
                    float scale, float centerX, float centerY);
            void onSoftKeyboardShowModeChanged(int showMode);
            void onPerformGestureResult(int sequence, boolean completedSuccessfully);
            void onFingerprintCapturingGesturesChanged(boolean active);
            void onFingerprintGesture(int gesture);
            void onAccessibilityButtonClicked();
            void onAccessibilityButtonAvailabilityChanged(boolean available);
        }
    

    看到这里再回头看看onBind函数的具体实现如图


    看到了吧,AccessibilityService的AccessibilityEvent事件
    来源于IAccessibilityServiceClientWrapper,我们再看看IAccessibilityServiceClientWrapper是如何收到这个Event,再往下跟踪代码


    IAccessibilityServiceClientWrapper中executeMessage(Message message)函数调用mCallback.onAccessibilityEvent(event)传递给AccessibilityService,executeMessage函数是HandlerCaller.Callback接口的实现,那谁发送的这个Message呢,
    IAccessibilityServiceClientWrapper中同样的onAccessibilityEvent()函数如图


    而这个函数又是谁调的呢,这里就到了进程间通信的逻辑,看一下外部逻辑,上面是倒推逻辑,下面正推一下。

    AccessibilityService跟一个监控一样,界面的所有的事件都可以收到,那它的源头肯定在View上,肯定在View的事件处理上,跟着这个逻辑去找一下



    在performClick函数中发现有一个AccessibilityEvent事件传递,再往里面跟踪发现了这个有用的信息


    这里面可以清晰的看到,你收到的AccessibilityEvent事件所有的字段赋值逻辑就在这里。那它是如何发出去交给AccessibilityService呢,肯定是通过AIDL,进一步查找源码


    发现在sendAccessibilityEventUncheckedInternal函数中,调用了
    getParent().requestSendAccessibilityEvent(this, event),接着看看这个getParent()干了什么,找了一圈找到具体实现在哪,最终在ViewRootImpl中找到这个方法实现

       @Override
        public boolean requestSendAccessibilityEvent(View child, AccessibilityEvent event) {
            if (mView == null || mStopped || mPausedForTransition) {
                return false;
            }
    
            // Immediately flush pending content changed event (if any) to preserve event order
            if (event.getEventType() != AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED
                    && mSendWindowContentChangedAccessibilityEvent != null
                    && mSendWindowContentChangedAccessibilityEvent.mSource != null) {
                mSendWindowContentChangedAccessibilityEvent.removeCallbacksAndRun();
            }
    
            // Intercept accessibility focus events fired by virtual nodes to keep
            // track of accessibility focus position in such nodes.
            final int eventType = event.getEventType();
            switch (eventType) {
                case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: {
                    final long sourceNodeId = event.getSourceNodeId();
                    final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId(
                            sourceNodeId);
                    View source = mView.findViewByAccessibilityId(accessibilityViewId);
                    if (source != null) {
                        AccessibilityNodeProvider provider = source.getAccessibilityNodeProvider();
                        if (provider != null) {
                            final int virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId(
                                    sourceNodeId);
                            final AccessibilityNodeInfo node;
                            node = provider.createAccessibilityNodeInfo(virtualNodeId);
                            setAccessibilityFocus(source, node);
                        }
                    }
                } break;
                case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: {
                    final long sourceNodeId = event.getSourceNodeId();
                    final int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId(
                            sourceNodeId);
                    View source = mView.findViewByAccessibilityId(accessibilityViewId);
                    if (source != null) {
                        AccessibilityNodeProvider provider = source.getAccessibilityNodeProvider();
                        if (provider != null) {
                            setAccessibilityFocus(null, null);
                        }
                    }
                } break;
    
    
                case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED: {
                    handleWindowContentChangedEvent(event);
                } break;
            }
            mAccessibilityManager.sendAccessibilityEvent(event);
            return true;
        }
    

    可以看到是mAccessibilityManager.sendAccessibilityEvent 发出了事件,再看下这个函数的实现逻辑

     public void sendAccessibilityEvent(AccessibilityEvent event) {
            final IAccessibilityManager service;
            final int userId;
            synchronized (mLock) {
                service = getServiceLocked();
                if (service == null) {
                    return;
                }
                if (!mIsEnabled) {
                    Looper myLooper = Looper.myLooper();
                    if (myLooper == Looper.getMainLooper()) {
                        throw new IllegalStateException(
                                "Accessibility off. Did you forget to check that?");
                    } else {
                        // If we're not running on the thread with the main looper, it's possible for
                        // the state of accessibility to change between checking isEnabled and
                        // calling this method. So just log the error rather than throwing the
                        // exception.
                        Log.e(LOG_TAG, "AccessibilityEvent sent with accessibility disabled");
                        return;
                    }
                }
                if ((event.getEventType() & mRelevantEventTypes) == 0) {
                    if (DEBUG) {
                        Log.i(LOG_TAG, "Not dispatching irrelevant event: " + event
                                + " that is not among "
                                + AccessibilityEvent.eventTypeToString(mRelevantEventTypes));
                    }
                    return;
                }
                userId = mUserId;
            }
            try {
                event.setEventTime(SystemClock.uptimeMillis());
                // it is possible that this manager is in the same process as the service but
                // client using it is called through Binder from another process. Example: MMS
                // app adds a SMS notification and the NotificationManagerService calls this method
                long identityToken = Binder.clearCallingIdentity();
                service.sendAccessibilityEvent(event, userId);
                Binder.restoreCallingIdentity(identityToken);
                if (DEBUG) {
                    Log.i(LOG_TAG, event + " sent");
                }
            } catch (RemoteException re) {
                Log.e(LOG_TAG, "Error during sending " + event + " ", re);
            } finally {
                event.recycle();
            }
        }
    

    IAccessibilityManager 是个aidl接口,最终通过他发送给了服务


    看到这是不是明白了其中的原理。在AccessibilityService你还可以拿到Activity的一些信息,同样的道理,你在源码中肯定能找到那个实现,你可以试着自己去搜一下。

    AccessibilityService使用心得

    上面卖的关子,现在可以圆满了,在使用中遇到过很多种情况拿不到RootInActiveWindow 也就是AccessibilityNodeInfo(表示窗口内容的节点),当窗口能拿到这个节点时,你才能通过他去findView,所以你知道它的重要性了,但为什么很多时候拿不到呢

    • 第一个case,如图

    如果在TYPE_WINDOWS_CHANGED中就会拿不到

    • 第二个case,如图

    当你不在当前页面(com.tencent.mm.ui.LauncherUI是微信的主页)时同样也有可能获取不到,有可能是在其他页面。

    • 第三个case,没图,这种情况就很奇怪,在上面两个都避免了之后,还有拿不到的情况,怎么办了,偶然间我切回桌面,又回来,发现又有了,具体什么原理,目前没找到答案,好吧,总算有个解决办法,当拿不到这个界面的节点时,我切到任务管理状态,再点物理返回键,达到切换的效果,这时候还真的又拿到了,也许这是目前最有价值的一个case,希望你也能用它解决问题。

    总结

    读到这是不是想看如何实现呢,这里直接提供项目源码,并没有写如何使用的教程,推荐给你们几个写的特别详细的教程,希望对你有帮助,使用起来相对很简单的,看完这些文章基本够用
    Android自动化模拟操作开源库源码解析
    你真的理解AccessibilityService吗
    AccessibilityService分析与防御
    A complete guide to Accessibility Service Part 1 — Android
    A Complete Guide to Accessibility Service Part 2 — Android

    本项目源码完善中,功能上会加入

    • 自动分享小程序给好友
    • 自动拉好友进群
    • 自动踢人
      代码会提交到这里 I校长
      欢迎Star
    展开全文
  • 微信朋友圈自动点赞

    万次阅读 多人点赞 2019-03-10 10:36:13
    我一直都不太喜欢给别人点赞,某一年(貌似是17年)微信出了一次朋友圈年报,那一整年我就点出去了几个赞,要知道当时我微信好友应该有300+。我觉得这是我不喜欢参与社交活动在网络世界的一种体现吧。不给被人点赞也没...

    我一直都不太喜欢给别人点赞,某一年(貌似是17年)微信出了一次朋友圈年报,那一整年我就点出去了几个赞,要知道当时我微信好友应该有300+。我觉得这是我不喜欢参与社交活动在网络世界的一种体现吧。不给别人点赞也没啥坏处,但你不评不赞,难免会让你和好友之间有些疏远,给别人点赞吧我又嫌麻烦,于是一直想着做个自动点赞的东西,今天基本实现了,虽然诸多不完整和诸多限制,但还是决定分享出来,主要是我觉得还挺好玩的。

    Autojs

    先来介绍下Autojs,看github id貌似是个95后,真是年轻有为了。我这个朋友圈自动点赞就是基于Autojs开发的,Autojs我的理解就是在Android用来操控手机的平台,它提供了很多Android 系统API可以供你用Js调用,就是依赖Autojs这些Api我才能实现朋友圈自动点赞,这里我只用到了很少几个Api,其实还有好多很强大的Api可以参考下文档。因为Autojs只在Android平台可以用,所以意味着我的自动点赞也在Android手机用。

    思路

    在我知道Autojs并大概翻看了它的Api文档之后,就差不多知道这东西能实现了。首先我我们来分析下如果人想给所有的朋友圈点赞会怎么做,为了直观我直接上流程图。
    在这里插入图片描述
      看起来很简单,如果你想给你所有的朋友圈都点上赞,定时比如每隔一小时执行下上面这个流程就可以了。 但是如何用程序自动执行,我在调试时遇到到了很多的问题,比如以下几个问题。
      问题1:在第一步中,虽然可以Autojs可以直接打开某个App,也可以模拟点击,而且朋友圈入口在微信主界面的位置很固定,但是你每次打开微信并不一定停留在主界面啊!!
      问题2:你如何定位点赞/评论按钮?
      问题3:你如何判定一条朋友圈是否已经被点赞过了?
      问题4:你每次滑动要滑多少?
      针对这些问题来看看我的解决方案。

    实现

    启动微信后可能微信停留在上次使用后的页面,没有朋友圈入口,所以我们得先返回朋友圈主界面。这时候我们只需要连续点左上角的返回键,点按多次后一定返回微信主界面。     
      在这里插入图片描述

    进入朋友圈后可以适当将屏幕上滑一部分,移开自己的封面,让第一条朋友圈的点赞/评论按钮一定能露出来,就像这样(为了不泄露我朋友圈的隐私,恰好有条广告做示例)。
      在这里插入图片描述
      接下来就是找点赞/评论按钮的位置了,Autojs提供了截屏并获取图片中某个点ARGB值的Api,利用这两个Api,我们就可以很轻易定位到按钮的位置了。
      在这里插入图片描述
      就拿评论点赞按钮的第一个点做定位,上图中的定位点,其X坐标是991,Y坐标需要扫描,定位依据是该点的ARGB颜色值是-11048043,这个值是我调试好久才抓出来的。 接下来点击这个点的坐标就可以调出点赞和评论了。
      接下来就是如何区分出一条朋友圈是否已经被点过赞了。
    在这里插入图片描述
      我直接说吧,点赞后这个爱心的位置会左移,只要判断X坐标是465那个位置的像素点是否是白色就能区分出是否点过赞。 还有个关于向上滑动多少的问题,我们只需要互动使上一个点过赞的朋友圈恰好不显示就行了。 
      考虑到所有的细节后,代码流程图就这这样了,是不是比人工点赞复杂多了。  
      在这里插入图片描述
      图里有个循环上文没说到,因为有些特殊情况会导致点赞失败,明明还有好多没点赞就退出,所以我加了个重试机制,只有连续三次点赞失败才退出。

    代码

    源代码我放在github.com/xindoo/autojs,会持续更新。这里我也贴一份出来。

    function enterWechatMoment() {
        app.launch("com.tencent.mm");
        //确保返回到微信主界面
        sleep(200);
        click(692,2073);
    
        // 连续按多次返回,确保回到网协主界面 
        for (var i = 0; i < 5; i++) {
            click(50,140);
            sleep(100);
        }
    
        sleep(50);
        // 点微信 发现
        click(692,2073);
        sleep(50);
    
        // 点朋友圈入口
        click(500,300);
        sleep(1000);
    }
    
    function registEvent() {
        //启用按键监听
        events.observeKey();
        //监听音量上键按下
        events.onKeyDown("volume_down", function(event){
            toast("脚本手动退出");
            exit();
        });
    }
    
    function prepare() {
        // 双击顶部更新朋友圈  
        click(500, 150);
        sleep(100);
        click(500, 150); 
    
        // 等2s 微信朋友圈更新完成 
        sleep(3000);
    
        // 向下滑至第一条朋友圈 
        swipe(550, 1200, 550, 200, 200);
    
        if(!requestScreenCapture()){
            tLog("请求截图失败");
            exit();
        }
        var image = captureScreen();
        sleep(2000);
    }
    
    function clickLike() {
        sleep(1000);
        var image = captureScreen();
        var arrs = [-1];
        var x = 991;
        var buttonColor = -11048043;
    
        // 函数返回此次点赞是否成功,如果没找到点赞按钮或者已点赞返回false,做法是否继续的判断
        var isSucceed = true;
    
        // 扫描出点赞评论按钮的位置,两个点的ARGB颜色为-11048043 
        for(var y = 250; y < 1920; y++) {
            var color = images.pixel(image, x, y);
    
            // 白色 背景色,跳过
            if (color == -1) {
                continue;
            }
            if (color == buttonColor) {
                // 按下评论点赞按钮  
                click(x, y)
                sleep(1000);
    
                // 重新截图,找到点赞心形按钮的位置
                var clickimage = captureScreen();
    
                // 如果这个点的颜色是-1,表示这条朋友圈已经点过赞了,返回点赞失败false
                if (images.pixel(clickimage, 465, y) != -1) {
                    // 点赞
                    click(523, y);
                } else {
                    isSucceed = false;
                }
                sleep(2000);
                // 往下滑动到下一条朋友圈的位置  
                swipe(550, y+200, 550, 150, 200);
                return isSucceed;
            }
        }
    
        // 如果执行到这,可能是某条朋友圈评论太多,一屏里没有点赞评论按钮,就滑动大半屏再试一次
        swipe(550, 1600, 550, 150, 200);
        return false;
    }
    
    //程序主入口
    function start(){
        //注册音量键上被按下时退出脚本的执行  
        registEvent();
    
        // 确保进入微信朋友圈
        enterWechatMoment();
        prepare();
        
        var retry = 3;
        var cnt = 0;
        // 连续失败三次就退出  
        while(retry > 0) {
            // 如果是false,表示已经点过赞了 
            if (clickLike() == false) {
                retry--;
            } else {
                retry = 3;
                cnt++;
            }
        }
        
        toast("本次总共点赞" + cnt + "条");
        // 返回微信主界面
        click(50,140);
        exit();
    }
    start();
    

    问题

    虽然大体上实现了朋友圈点赞的自动化,但其实还是存在很多问题,有些是可以很简单解决的,但是我没啥动力解决。也有些是我没想好怎么解决的,也有些是这种点赞方式下无解的。

    1. 上文所说,只限Android,部分同学是iOS就没啥办法了,我并不清楚iOS是否有类似Api。
    2. 因为我手头只有一台1080*2160分辨率的手机,所以实现是以此为标准的,其他分辨率的手机并不一定能用。
    3. 非全自动化,目前需要手动触发,也需要手动赋予截屏权限(额外点几下),应该是可以设置定时执行的,我没再继续尝试。
    4. 点赞过程中不能干扰,也不能暂停(但可中断),建议点赞过程中不要使用手机(点赞操作和用户操作会相互干扰),实在要用就按音量上键中断点赞。
    5. 最重要一条,不是所有的朋友圈都能点赞的,不是所有的人都能忍受你给他每条朋友圈都点赞的。举个例子,有天我看见朋友圈有人发他亲人去世………

    微信朋友圈自动点赞的实现大致都是这样了,有问题可以在下面留言或者在github.com/xindoo/autojs提issue,github上代码还是方便更新的。 下一个类似的脚本我打算做个 支付宝自动偷能量 虽然网上已经有类似的实现。

    展开全文
  • 微信开发 自动转发朋友圈 自动添加好友等等

    万次阅读 热门讨论 2018-01-11 11:22:51
    本人有幸在上家公司做外包的时候接触了这个项目,专门针对微信做的一些功能,有自动删除僵尸粉,自动发朋友圈自动添加好友,自动同意添加等等很多功能。 这时候可能会有一些人会问:难道你有微信的源码吗?不然...
  • 今天推荐是一个比较骚气的工具,自动发朋友圈(不用root手机),对于一天10多条,甚至20条朋友圈的朋友,每次编辑比较麻烦。我之前也写过抢红包工具,当时上架应用市场时,...
  • 最近在研究Android自动化的功能,想了解下 编写Android应用实现微信自动发朋友圈自动点赞回复的功能大概是怎么实现的?涉及到Android的那些部分??
  • 不知道大家都回老家了没,不过我是没有回去,晚上吃完年夜饭看到很多人发朋友圈,为了增进和大家的友谊,于是就想着给大家点个赞,无奈内容太多了,就搞个自动化脚本,原理和前两天我写的30行代码实现蚂蚁森林自动偷...
  • 微信自动化工具—自动发送朋友圈(非root权限) 一、效果图 二、测试Android设备 我在这两款设备测试正常,其它设备如果有什么问题,欢迎给我反馈^_^ 夜神模拟器(Android 4.3)、华为荣耀8青春版...
  • 利用python、adb以及自动化工具androidviewclient,实现朋友圈自动点赞的功能
  • 微信朋友圈如何自动点赞

    千次阅读 2020-08-11 21:59:20
    我一直都不太喜欢给别人点赞,某一年(貌似是17年)微信出了一次朋友圈年报,那一整年我就点出去了几个赞,要知道当时我微信好友应该有300+。我觉得这是我不喜欢参与社交活动在网络世界的一种体现吧。不给别人点赞也没...
  • 自动点击特定元素 通过python调用adb命令实现用元素名称、id、class定位元素 http://blog.csdn.net/gb112211/article/details/33730221 方便查找对应元素特征 android sdk tools: uiautomatorviewer.bat 配置好...
  • react native 仿微信朋友圈的评论自动定位 constructor(props) { //es6 构造方法  super(props);  this.rowlayouts=[];   this.scrollview = null;  this.scrollview1 = null;  this.
  • 企业微信开放了客户朋友圈功能,企业员工可将活动信息、产品动态等内容发布到「客户朋友圈」,而客户可以在自己的微信朋友圈中看到这些内容,等于实现了企业微信和微信朋友圈的互通。 下面我们就来聊聊企业微信客户...
  • 求一个微信插件,能实现好友聊天内容文字自动转发朋友圈,非常感谢。
  • 微信发朋友圈测试用例

    千次阅读 2020-07-10 11:41:40
    安全: 1、发送朋友圈时,文本输入脚本代码,是否出现异常 界面: 1、是否是显示发朋友圈的人的昵称、头像、以及具体内容 2、是否按照发朋友圈的时间距离现在远近来排序 3、图片显示是否正确 4、是否显示自己的个人...
  • 如何自制微信小视频发朋友圈

    千次阅读 2017-04-03 11:00:58
    近期看朋友们在微信朋友圈发的视频都是自制的,觉得蛮有意思,也想发一个。 发现自己并不会,问了人也没回答我,趁放假没事,吃过饭便在网上开始百度。 用天天P图制作了视频后,和朋友圈格式正好匹配,还自带音效,...
  • 自动抢红包,点赞朋友圈,AccessibilityService解放你的双手 标签: 2018 引言: 其实这一篇本来不是写这个的,在周一开始想做的时候就想好了标题: 《Android与Python的巧妙结合抓取公众号所有历史文章》, ...
  • 大家都知道平时我们微信朋友圈视频,最多只能15秒的视频,有时候视频太长但是又不想剪辑怎么办呢?那么今天,我来教大家一个小技巧,不管你的视频是1分钟还是5分钟都可以朋友圈里。 方法非常的简单,首先...
  • 无法分享到微信,系统分享接口暂不支持分享多图至朋友圈。  2018年09月29日,微信更新之后多图分享不行了,立马拿起手机更新微信,果然是有 v6.7.3 的新版本,更新完成之后打开之前的多图分享功能,便出现了上面...
  • 最近闲来无事,随便看看各种UI实现...打开你的微信朋友圈,点击评论,你就会发现有一个小细节:文本输入框的高度恰好定位到这条信息的底部位置 这个实现起来其实很简单,咱们就来看看吧 最简单的RecyclerView...
  • 环境:安卓7以上,auto.js 4.1。 CODE: // 使得程序可以一直运行,向下滚动 while(true){ dianzan(); ... // 这里是需找到可以滚动的控件:ListView,className是不会改变的,这样写出来的程序会比较稳定 ...
  • 参考文章:仿微信朋友圈点击评论自动定位到相关行 一、思路: 1、在点击【评论】控件的时候弹出一个 dialog,dialog 上面为 ScrollView,下面为输入框,实现键盘弹出时把输入框顶上去的效果; 2.计算 ...
  • 考虑到微信朋友圈的折叠方案,有些方法严重走形,基本只能支持这几种折叠方案了。 随便拿张图,扔到白背景,拉到正方形。 3*3和2*2都是标准的正方形, 2*3不行,微信会自动缩图,正方形的要把图做成这样放里边会...
  • 我们发朋友圈时,特别是文字字数比较长的,一般都会在备忘录或者对话框写好,然后复制,再发朋友圈,因为发朋友圈的输入框只能看到四行,很不方便,而且写着写着,想去微信聊天记录看看内容,或者回复微信,都很不...
  • 很多人应该都遇到这个问题,就是看到朋友朋友圈想复制后转发,或者微信里的消息想复制转发,可有些时候会被压缩成一行,有的人为了解决这个问题,只好在这条朋友圈下面自己回复一下同一样的内容。 那有没有办法...
  • 这次尝试的网站是脉脉,实现的效果是,自动登录后,爬取“发现”页面返回的其他人的状态。然后自动评论。评论的时候,先看看有没有最热评论,如果有最热评论,就复制内容,自己也一条一样的。如果没有,就随便...
  • Android插件:屏蔽微信7.0.5WIFI下自动播放视频插件开发过程详解 本文将会详细介绍怎么开发一个屏蔽微信(7.0.5)WIFI下自动播放视频插件 背景介绍 周五下班在地铁上刷微信时看到一个新闻,说是微信更新后在WIFI下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,487
精华内容 21,794
关键字:

自动跟发朋友圈