Android微信搶紅包外掛源碼
CodeBoy微信搶紅包外掛
效果預覽
源碼下載地址:https://github.com/lendylongli/qianghongbao
apk下載地址 : 下載最新版本
前言
Codeboy微信搶紅包是我在2015年春節過年期間編寫的一個開源的興趣項目,只要是將整個核心搶紅包的流程編寫出來,至于再復雜的一些操作就沒深入研究。當這個項目發布后,也是反應挺大的,很多網友也找到我了與交流,也有做淘寶的人給錢讓我去增加一些功能,當然我是拒絕的。
作者聲明
在這里,我聲明一下,我所做的是自己有興趣的事情,只是通過開源的方式讓大家去學習相關技術,并不是為了營利,而我也知道淘寶上有人直接拿我的應用去售賣,這些都是沒經過我的允許,我也沒有半點收益,我留下聯系方式是為了方便開發者之間的討論與學習,所以請商業合作的與小白不要加我QQ,謝謝。
技術詳述
一開始大家都會覺得做一個Android外掛會汲取很多東西或者底層的東西,但當發現Android里有一個叫AccessibilityService的服務時,一切都變得很簡單。
關于AccessibilityService
先看看官網的介紹Accessibility
Many Android users have different abilities that require them to interact with their Android devices in different ways. These include users who have visual, physical or age-related limitations that prevent them from fully seeing or using a touchscreen, and users with hearing loss who may not be able to perceive audible information and alerts...
上面大概的意思就是Accessibility是一個輔助服務,主要是面向一些使用Android手機的用戶有相關障礙(年齡、視覺、聽力、身體等),這個功能可以更容易使用手機,可以幫用戶在點擊屏幕或者顯示方面得到幫助等等。接下來就是查找相關API,看能做到哪個地步。
當然accessibility除了可以輔助點擊界面的事件外,還可以用作自動化測試,或者一鍵返回,是一個非常強大與實用的功能,具體實例可以看我另一個App虛擬按鍵助手 請往下載 GooglePlay市場 或 應用寶。
關于搶紅包的流程
在有以上的一些關于輔助服務的基礎知識后,我們就可以分析怎樣自動化搶紅包。 大家使用過微信都知道,如果不是在微信的可見界面范圍(在桌面或者在使用其它應用時),在收到新的消息,就會在通知欄提醒用戶。而在微信的消息列表界面,就不會彈出通知欄,所以可以區分這兩種情況。然后抓取相關關鍵字作進一步處理。
1、在非微信消息列表界面,收到通知消息的事件,判斷通知欄里的文本是否有[微信紅包]的關鍵字,有則可以判斷為用戶收到紅包的消息(當然,你可以故意發一條包括這個關鍵字的文本消息去整蠱你的朋友)。然后,我們就自動化觸發這個消息的意圖事件(Intent);
2、在通知欄跳進微信界面后,是去到com.tencent.mm.ui.LauncherUI這個Activity界面。我們知道,紅包的消息上,包括了關鍵字領取紅包或者View的id,那我們就根據這個關鍵字找到相應的View,然后再觸發ACTION_CLICK(點擊事件);
3、在點擊紅包后,會跳到com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI這個拆紅包的Activity,當然老方法,找關鍵字拆紅包或id,然后觸發自動化點擊事件。
這樣就可以完成整個自動化完成搶紅包的流程了,所以核心就是找關鍵字,然后模擬用戶點擊事件,就這么簡單。以下詳細說一下代碼的實現。
以下是通過DDMS工具里的Dump View Hierarchy For UI Automator 去分析微信UI結構。
使用AccessibilityService去一步步監聽微信的動作
1、新建一個繼承AccessibilityService的類,如QiangHongBaoService,然后在AndroidManifest.xml里聲明組件,如下
<service
android:label="@string/app_name"
android:name=".QiangHongBaoService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/qianghongbao_service_config"/>
</service> 在meta-data里聲明的是輔助配置,這個是Android4.0之后才支持的寫法,在4.0之前的系統要在代碼里聲明。
2、在res/xml目錄下生成輔助服務的配置文件qianghongbao_service_config.xml
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/accessibility_description" android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged" android:packageNames="com.tencent.mm" android:accessibilityFeedbackType="feedbackGeneric" android:notificationTimeout="100" android:accessibilityFlags="" android:canRetrieveWindowContent="true"/>
android:description 這個是設置服務的描述,在用戶授權的界面可以看到。
android:accessibilityEventTypes 這個是配置要監聽的輔助事件,我們只需要用到typeNotificationStateChanged(通知變化事件)、typeWindowStateChanged(界面變化事件)
android:packageNames 這個是要監聽應用的包名,如果要監聽多個應用,則用,去分隔,這里我們只需要監聽微信的就可以了
android:accessibilityFeedbackType 這個是設置反饋方式
| FeedbackType | 描述 |
|---|---|
| feedbackSpoken | 語音反饋 |
| feedbackHaptic | 觸感反饋 |
| feedbackAudible | 表示聲音(不是語音)反饋 |
| feedbackVisual | 視覺反饋 |
| feedbackGeneric | 通用反饋 |
| feedbackAllMask | 所有以上的反饋 |
詳細看AccessibilityServiceInfo類文檔描述
3、在以上都配置好后,我們就可以在QiangHongBaoService這個服務里進行編碼了,要做的就是將整個UI跳轉流程與邏輯串聯起來。
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
//接收事件,如觸發了通知欄變化、界面變化等
}
@Override
protected boolean onKeyEvent(KeyEvent event) {
//接收按鍵事件
return super.onKeyEvent(event);
}
@Override
public void onInterrupt() {
//服務中斷,如授權關閉或者將服務殺死
}
@Override
protected void onServiceConnected() {
super.onServiceConnected();
//連接服務后,一般是在授權成功后會接收到
} 具體內容請看源碼
其它
如何防止外掛
在了解整個核心后,獲取事件不外乎就是通過文本與id判斷,那么就可以將文本改為圖標方式,將id改為動態id(每次顯示都是隨機生成),這樣一來就可以提高外掛的門檻。
如何發紅包會安全點
現在搶紅包就看誰的外掛工具反應夠快,如何去干擾這些外掛,其實也有點小技巧,就是在發紅包前,發送文本[微信紅包],可以導致部分外掛工具失效。
版本歸作者所有,轉載請注明出處:http://www.happycodeboy.com/index.php/archives/10/關于作者
英文名:Leon
個人博客:http://www.happycodeboy.com
Email:codeboy2013@gmail.com
QQ:730395591
項目地址: https://github.com/lendylongli/qianghongbao



