我一直都不太喜歡給別人點贊棚点,某一年(貌似是17年)微信出了一次朋友圈年報,那一整年我就點出去了幾個贊县踢,要知道當時我微信好友應該有300+瘸彤。我覺得這是我不喜歡參與社交活動在網(wǎng)絡世界的一種體現(xiàn)吧。不給別人點贊也沒啥壞處徊哑,但你不評不贊袜刷,難免會讓你和好友之間有些疏遠,給別人點贊吧我又嫌麻煩莺丑,于是一直想著做個自動點贊的東西著蟹,今天基本實現(xiàn)了墩蔓,雖然諸多不完整和諸多限制,但還是決定分享出來萧豆,主要是我覺得還挺好玩的奸披。
Autojs
先來介紹下Autojs,看github id貌似是個95后涮雷,真是年輕有為了阵面。我這個朋友圈自動點贊就是基于Autojs開發(fā)的,Autojs我的理解就是在Android用來操控手機的平臺洪鸭,它提供了很多Android 系統(tǒng)API可以供你用Js調(diào)用样刷,就是依賴Autojs這些Api我才能實現(xiàn)朋友圈自動點贊,這里我只用到了很少幾個Api卿嘲,其實還有好多很強大的Api可以參考下文檔颂斜。因為Autojs只在Android平臺可以用,所以意味著我的自動點贊也在Android手機用拾枣。
思路
在我知道Autojs并大概翻看了它的Api文檔之后沃疮,就差不多知道這東西能實現(xiàn)了。首先我我們來分析下如果人想給所有的朋友圈點贊會怎么做梅肤,為了直觀我直接上流程圖司蔬。
看起來很簡單,如果你想給你所有的朋友圈都點上贊姨蝴,定時比如每隔一小時執(zhí)行下上面這個流程就可以了俊啼。 但是如何用程序自動執(zhí)行,我在調(diào)試時遇到到了很多的問題左医,比如以下幾個問題授帕。
問題1:在第一步中,雖然可以Autojs可以直接打開某個App浮梢,也可以模擬點擊跛十,而且朋友圈入口在微信主界面的位置很固定,但是你每次打開微信并不一定停留在主界面帮跸酢=嬗场!
問題2:你如何定位點贊/評論按鈕远豺?
問題3:你如何判定一條朋友圈是否已經(jīng)被點贊過了奈偏?
問題4:你每次滑動要滑多少?
針對這些問題來看看我的解決方案躯护。
實現(xiàn)
啟動微信后可能微信停留在上次使用后的頁面惊来,沒有朋友圈入口,所以我們得先返回朋友圈主界面棺滞。這時候我們只需要連續(xù)點左上角的返回鍵唁盏,點按多次后一定返回微信主界面内狸。
![在這里插入圖片描述](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坐標需要掃描崎弃,定位依據(jù)是該點的ARGB顏色值是-11048043甘晤,這個值是我調(diào)試好久才抓出來的。 接下來點擊這個點的坐標就可以調(diào)出點贊和評論了饲做。
接下來就是如何區(qū)分出一條朋友圈是否已經(jīng)被點過贊了线婚。
![在這里插入圖片描述](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那個位置的像素點是否是白色就能區(qū)分出是否點過贊塞弊。 還有個關于向上滑動多少的問題,我們只需要互動使上一個點過贊的朋友圈恰好不顯示就行了泪姨∮窝兀
考慮到所有的細節(jié)后,代碼流程圖就這這樣了肮砾,是不是比人工點贊復雜多了诀黍。
圖里有個循環(huán)上文沒說到唇敞,因為有些特殊情況會導致點贊失敗蔗草,明明還有好多沒點贊就退出咒彤,所以我加了個重試機制疆柔,只有連續(xù)三次點贊失敗才退出。
代碼
源代碼我放在github.com/xindoo/autojs镶柱,會持續(xù)更新旷档。這里我也貼一份出來。
function enterWechatMoment() {
app.launch("com.tencent.mm");
//確保返回到微信主界面
sleep(200);
click(692,2073);
// 連續(xù)按多次返回歇拆,確毙回到網(wǎng)協(xié)主界面
for (var i = 0; i < 5; i++) {
click(50,140);
sleep(100);
}
sleep(50);
// 點微信 發(fā)現(xiàn)
click(692,2073);
sleep(50);
// 點朋友圈入口
click(500,300);
sleep(1000);
}
function registEvent() {
//啟用按鍵監(jiān)聽
events.observeKey();
//監(jiān)聽音量上鍵按下
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;
// 函數(shù)返回此次點贊是否成功范咨,如果沒找到點贊按鈕或者已點贊返回false,做法是否繼續(xù)的判斷
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权旷,表示這條朋友圈已經(jīng)點過贊了替蛉,返回點贊失敗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;
}
}
// 如果執(zhí)行到這,可能是某條朋友圈評論太多拄氯,一屏里沒有點贊評論按鈕躲查,就滑動大半屏再試一次
swipe(550, 1600, 550, 150, 200);
return false;
}
//程序主入口
function start(){
//注冊音量鍵上被按下時退出腳本的執(zhí)行
registEvent();
// 確保進入微信朋友圈
enterWechatMoment();
prepare();
var retry = 3;
var cnt = 0;
// 連續(xù)失敗三次就退出
while(retry > 0) {
// 如果是false,表示已經(jīng)點過贊了
if (clickLike() == false) {
retry--;
} else {
retry = 3;
cnt++;
}
}
toast("本次總共點贊" + cnt + "條");
// 返回微信主界面
click(50,140);
exit();
}
start();
問題
雖然大體上實現(xiàn)了朋友圈點贊的自動化译柏,但其實還是存在很多問題镣煮,有些是可以很簡單解決的,但是我沒啥動力解決鄙麦。也有些是我沒想好怎么解決的典唇,也有些是這種點贊方式下無解的。
- 上文所說黔衡,只限Android蚓聘,部分同學是iOS就沒啥辦法了,我并不清楚iOS是否有類似Api盟劫。
- 因為我手頭只有一臺1080*2160分辨率的手機夜牡,所以實現(xiàn)是以此為標準的,其他分辨率的手機并不一定能用侣签。
- 非全自動化塘装,目前需要手動觸發(fā),也需要手動賦予截屏權限(額外點幾下)影所,應該是可以設置定時執(zhí)行的蹦肴,我沒再繼續(xù)嘗試。
- 點贊過程中不能干擾猴娩,也不能暫停(但可中斷)阴幌,建議點贊過程中不要使用手機(點贊操作和用戶操作會相互干擾),實在要用就按音量上鍵中斷點贊卷中。
- 最重要一條矛双,不是所有的朋友圈都能點贊的,不是所有的人都能忍受你給他每條朋友圈都點贊的蟆豫。舉個例子议忽,有天我看見朋友圈有人發(fā)他親人去世………
微信朋友圈自動點贊的實現(xiàn)大致都是這樣了,有問題可以在下面留言或者在github.com/xindoo/autojs提issue十减,github上代碼還是方便更新的栈幸。 下一個類似的腳本我打算做個 支付寶自動偷能量 雖然網(wǎng)上已經(jīng)有類似的實現(xiàn)愤估。