微信朋友圈自動(dòng)點(diǎn)贊

我一直都不太喜歡給別人點(diǎn)贊,某一年(貌似是17年)微信出了一次朋友圈年報(bào),那一整年我就點(diǎn)出去了幾個(gè)贊,要知道當(dāng)時(shí)我微信好友應(yīng)該有300+。我覺得這是我不喜歡參與社交活動(dòng)在網(wǎng)絡(luò)世界的一種體現(xiàn)吧。不給別人點(diǎn)贊也沒啥壞處,但你不評(píng)不贊,難免會(huì)讓你和好友之間有些疏遠(yuǎn),給別人點(diǎn)贊吧我又嫌麻煩,于是一直想著做個(gè)自動(dòng)點(diǎn)贊的東西,今天基本實(shí)現(xiàn)了,雖然諸多不完整和諸多限制,但還是決定分享出來,主要是我覺得還挺好玩的。

Autojs

先來介紹下Autojs,看github id貌似是個(gè)95后,真是年輕有為了。我這個(gè)朋友圈自動(dòng)點(diǎn)贊就是基于Autojs開發(fā)的,Autojs我的理解就是在Android用來操控手機(jī)的平臺(tái),它提供了很多Android 系統(tǒng)API可以供你用Js調(diào)用,就是依賴Autojs這些Api我才能實(shí)現(xiàn)朋友圈自動(dòng)點(diǎn)贊,這里我只用到了很少幾個(gè)Api,其實(shí)還有好多很強(qiáng)大的Api可以參考下文檔。因?yàn)锳utojs只在Android平臺(tái)可以用,所以意味著我的自動(dòng)點(diǎn)贊也在Android手機(jī)用。

思路

在我知道Autojs并大概翻看了它的Api文檔之后,就差不多知道這東西能實(shí)現(xiàn)了。首先我我們來分析下如果人想給所有的朋友圈點(diǎn)贊會(huì)怎么做,為了直觀我直接上流程圖。


  看起來很簡(jiǎn)單,如果你想給你所有的朋友圈都點(diǎn)上贊,定時(shí)比如每隔一小時(shí)執(zhí)行下上面這個(gè)流程就可以了。 但是如何用程序自動(dòng)執(zhí)行,我在調(diào)試時(shí)遇到到了很多的問題,比如以下幾個(gè)問題。
  問題1:在第一步中,雖然可以Autojs可以直接打開某個(gè)App,也可以模擬點(diǎn)擊,而且朋友圈入口在微信主界面的位置很固定,但是你每次打開微信并不一定停留在主界面啊?。?br>   問題2:你如何定位點(diǎn)贊/評(píng)論按鈕?
  問題3:你如何判定一條朋友圈是否已經(jīng)被點(diǎn)贊過了?
  問題4:你每次滑動(dòng)要滑多少?
  針對(duì)這些問題來看看我的解決方案。

實(shí)現(xiàn)

啟動(dòng)微信后可能微信停留在上次使用后的頁面,沒有朋友圈入口,所以我們得先返回朋友圈主界面。這時(shí)候我們只需要連續(xù)點(diǎn)左上角的返回鍵,點(diǎn)按多次后一定返回微信主界面?!    ?br>   ![在這里插入圖片描述](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)

進(jìn)入朋友圈后可以適當(dāng)將屏幕上滑一部分,移開自己的封面,讓第一條朋友圈的點(diǎn)贊/評(píng)論按鈕一定能露出來,就像這樣(為了不泄露我朋友圈的隱私,恰好有條廣告做示例)。
  ![在這里插入圖片描述](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)
  接下來就是找點(diǎn)贊/評(píng)論按鈕的位置了,Autojs提供了截屏并獲取圖片中某個(gè)點(diǎn)ARGB值的Api,利用這兩個(gè)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)
  就拿評(píng)論點(diǎn)贊按鈕的第一個(gè)點(diǎn)做定位,上圖中的定位點(diǎn),其X坐標(biāo)是991,Y坐標(biāo)需要掃描,定位依據(jù)是該點(diǎn)的ARGB顏色值是-11048043,這個(gè)值是我調(diào)試好久才抓出來的。 接下來點(diǎn)擊這個(gè)點(diǎn)的坐標(biāo)就可以調(diào)出點(diǎn)贊和評(píng)論了。
  接下來就是如何區(qū)分出一條朋友圈是否已經(jīng)被點(diǎn)過贊了。
![在這里插入圖片描述](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)
  我直接說吧,點(diǎn)贊后這個(gè)愛心的位置會(huì)左移,只要判斷X坐標(biāo)是465那個(gè)位置的像素點(diǎn)是否是白色就能區(qū)分出是否點(diǎn)過贊。 還有個(gè)關(guān)于向上滑動(dòng)多少的問題,我們只需要互動(dòng)使上一個(gè)點(diǎn)過贊的朋友圈恰好不顯示就行了?!?br>   考慮到所有的細(xì)節(jié)后,代碼流程圖就這這樣了,是不是比人工點(diǎn)贊復(fù)雜多了?! ?br>   


  圖里有個(gè)循環(huán)上文沒說到,因?yàn)橛行┨厥馇闆r會(huì)導(dǎo)致點(diǎn)贊失敗,明明還有好多沒點(diǎn)贊就退出,所以我加了個(gè)重試機(jī)制,只有連續(xù)三次點(diǎn)贊失敗才退出。

代碼

源代碼我放在github.com/xindoo/autojs,會(huì)持續(xù)更新。這里我也貼一份出來。

function enterWechatMoment() {
    app.launch("com.tencent.mm");
    //確保返回到微信主界面
    sleep(200);
    click(692,2073);

    // 連續(xù)按多次返回,確?;氐骄W(wǎng)協(xié)主界面 
    for (var i = 0; i < 5; i++) {
        click(50,140);
        sleep(100);
    }

    sleep(50);
    // 點(diǎn)微信 發(fā)現(xiàn)
    click(692,2073);
    sleep(50);

    // 點(diǎn)朋友圈入口
    click(500,300);
    sleep(1000);
}

function registEvent() {
    //啟用按鍵監(jiān)聽
    events.observeKey();
    //監(jiān)聽音量上鍵按下
    events.onKeyDown("volume_down", function(event){
        toast("腳本手動(dòng)退出");
        exit();
    });
}

function prepare() {
    // 雙擊頂部更新朋友圈  
    click(500, 150);
    sleep(100);
    click(500, 150); 

    // 等2s 微信朋友圈更新完成 
    sleep(3000);

    // 向下滑至第一條朋友圈 
    swipe(550, 1200, 550, 200, 200);

    if(!requestScreenCapture()){
        tLog("請(qǐng)求截圖失敗");
        exit();
    }
    var image = captureScreen();
    sleep(2000);
}

function clickLike() {
    sleep(1000);
    var image = captureScreen();
    var arrs = [-1];
    var x = 991;
    var buttonColor = -11048043;

    // 函數(shù)返回此次點(diǎn)贊是否成功,如果沒找到點(diǎn)贊按鈕或者已點(diǎn)贊返回false,做法是否繼續(xù)的判斷
    var isSucceed = true;

    // 掃描出點(diǎn)贊評(píng)論按鈕的位置,兩個(gè)點(diǎn)的ARGB顏色為-11048043 
    for(var y = 250; y < 1920; y++) {
        var color = images.pixel(image, x, y);

        // 白色 背景色,跳過
        if (color == -1) {
            continue;
        }
        if (color == buttonColor) {
            // 按下評(píng)論點(diǎn)贊按鈕  
            click(x, y)
            sleep(1000);

            // 重新截圖,找到點(diǎn)贊心形按鈕的位置
            var clickimage = captureScreen();

            // 如果這個(gè)點(diǎn)的顏色是-1,表示這條朋友圈已經(jīng)點(diǎn)過贊了,返回點(diǎn)贊失敗false
            if (images.pixel(clickimage, 465, y) != -1) {
                // 點(diǎn)贊
                click(523, y);
            } else {
                isSucceed = false;
            }
            sleep(2000);
            // 往下滑動(dòng)到下一條朋友圈的位置  
            swipe(550, y+200, 550, 150, 200);
            return isSucceed;
        }
    }

    // 如果執(zhí)行到這,可能是某條朋友圈評(píng)論太多,一屏里沒有點(diǎn)贊評(píng)論按鈕,就滑動(dòng)大半屏再試一次
    swipe(550, 1600, 550, 150, 200);
    return false;
}

//程序主入口
function start(){
    //注冊(cè)音量鍵上被按下時(shí)退出腳本的執(zhí)行  
    registEvent();

    // 確保進(jìn)入微信朋友圈
    enterWechatMoment();
    prepare();
    
    var retry = 3;
    var cnt = 0;
    // 連續(xù)失敗三次就退出  
    while(retry > 0) {
        // 如果是false,表示已經(jīng)點(diǎn)過贊了 
        if (clickLike() == false) {
            retry--;
        } else {
            retry = 3;
            cnt++;
        }
    }
    
    toast("本次總共點(diǎn)贊" + cnt + "條");
    // 返回微信主界面
    click(50,140);
    exit();
}
start();

問題

雖然大體上實(shí)現(xiàn)了朋友圈點(diǎn)贊的自動(dòng)化,但其實(shí)還是存在很多問題,有些是可以很簡(jiǎn)單解決的,但是我沒啥動(dòng)力解決。也有些是我沒想好怎么解決的,也有些是這種點(diǎn)贊方式下無解的。

  1. 上文所說,只限Android,部分同學(xué)是iOS就沒啥辦法了,我并不清楚iOS是否有類似Api。
  2. 因?yàn)槲沂诸^只有一臺(tái)1080*2160分辨率的手機(jī),所以實(shí)現(xiàn)是以此為標(biāo)準(zhǔn)的,其他分辨率的手機(jī)并不一定能用。
  3. 非全自動(dòng)化,目前需要手動(dòng)觸發(fā),也需要手動(dòng)賦予截屏權(quán)限(額外點(diǎn)幾下),應(yīng)該是可以設(shè)置定時(shí)執(zhí)行的,我沒再繼續(xù)嘗試。
  4. 點(diǎn)贊過程中不能干擾,也不能暫停(但可中斷),建議點(diǎn)贊過程中不要使用手機(jī)(點(diǎn)贊操作和用戶操作會(huì)相互干擾),實(shí)在要用就按音量上鍵中斷點(diǎn)贊。
  5. 最重要一條,不是所有的朋友圈都能點(diǎn)贊的,不是所有的人都能忍受你給他每條朋友圈都點(diǎn)贊的。舉個(gè)例子,有天我看見朋友圈有人發(fā)他親人去世………

微信朋友圈自動(dòng)點(diǎn)贊的實(shí)現(xiàn)大致都是這樣了,有問題可以在下面留言或者在github.com/xindoo/autojs提issue,github上代碼還是方便更新的。 下一個(gè)類似的腳本我打算做個(gè) 支付寶自動(dòng)偷能量 雖然網(wǎng)上已經(jīng)有類似的實(shí)現(xiàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容