4

微信朋友圈自动点赞

 2 years ago
source link: https://zxs.io/article/1446
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

  我一直都不太喜欢给别人点赞,某一年(貌似是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:你每次滑动要滑多少?
  针对这些问题来看看我的解决方案。 

  启动微信后可能微信停留在上次使用后的页面,没有朋友圈入口,所以我们得先返回朋友圈主界面。这时候我们只需要连续点左上角的返回键,点按多次后一定返回微信主界面。     
  ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190310104505122.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly94aW5kb28uYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70 =300x)

  进入朋友圈后可以适当将屏幕上滑一部分,移开自己的封面,让第一条朋友圈的点赞/评论按钮一定能露出来,就像这样(为了不泄露我朋友圈的隐私,恰好有条广告做示例)。
  ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190310095104335.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly94aW5kb28uYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70 =300x)
  接下来就是找点赞/评论按钮的位置了,Autojs提供了截屏并获取图片中某个点ARGB值的Api,利用这两个Api,我们就可以很轻易定位到按钮的位置了。
  ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190310095629592.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly94aW5kb28uYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70 =300x)
  就拿评论点赞按钮的第一个点做定位,上图中的定位点,其X坐标是991,Y坐标需要扫描,定位依据是该点的ARGB颜色值是-11048043,这个值是我调试好久才抓出来的。 接下来点击这个点的坐标就可以调出点赞和评论了。
  接下来就是如何区分出一条朋友圈是否已经被点过赞了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190310100814287.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly94aW5kb28uYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70 =600x)
  我直接说吧,点赞后这个爱心的位置会左移,只要判断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上代码还是方便更新的。 下一个类似的脚本我打算做个 支付宝自动偷能量 虽然网上已经有类似的实现。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK