Tasker控制米家App

原理

米家App可以創建桌面快捷方式。如果創建手動觸發的場景,例如關閉插座,然後將該場景發送到桌面快捷方式。點擊桌面快捷方式就會執行關閉插座的操作。

當我們點擊桌面快捷方式時,其實就是發送Intent(有Android開發經驗的應該會知道),也就是說米家會根據Intent中攜帶的數據來觸發相應的場景

通過Tasker構造與桌面快捷方式一樣的Intent,然後發送該Intent,就會觸發相應的場景,其效果與點擊桌面快捷方式一樣。

分析Intent具體傳輸的數據,並構造Tasker Intent任務

這裏就不展開說明。我就簡單說一下我的做法。

  1. 開啓手機全局調試(手機已root,並安裝了Magisk)
    adb shell "su -c 'magisk resetprop ro.debuggable 1'"
    adb shell "su -c 'stop'" && adb shell "su -c 'start'"   
    
  2. 使用AndroidStudio的Profile來跟蹤並記錄函數調用
    點擊開始記錄,然後點擊米家的桌面快捷方式,停止記錄。得到下圖的函數調用棧
    在這裏插入圖片描述
  3. 反編譯米家apk,根據上圖分析執行邏輯。重點查看intent處理
    我使用的是jadx-gui 導出 Gradle項目,直接用AndroidStudio來查看的。關鍵部分截圖
    在這裏插入圖片描述
    在這裏插入圖片描述
    然後使用AndroidStudio斷點調試onCreate函數(因爲反編譯的源碼與字節碼行號不匹配,所以直接斷點函數)。得到如下圖
    在這裏插入圖片描述
    這樣我們就知道Intent的組成了
    extra 部分有三個key value
    extra_scene_account=12xxxxxx,
    extra_scene_id=10xxxxxx,
    extra_str_scene_id=10xxxxxx
    action = com.xiaomi.smarthome.scene.smarthomelauncher
    分析後發現其實extra_scene_id已經不需要了,取而代之的是extra_str_scene_id
  4. 編寫Tasker任務
    在這裏插入圖片描述
    測試一下,完美觸發
    在這裏插入圖片描述

如何更加便捷的獲取extra_scene_account和 extra_str_scene_id?

雖然我們已經用Tasker觸發了場景,但是我們總不可能每次都這樣調試來獲取相關參數吧?當然不可能這樣來獲取了。這些數據我們完全可以通過抓包來獲取。如何抓包呢?這個就讓大家自己研究研究了。 這裏推薦使用HttpCanary。根據HttpCanary使用手冊來學習如何抓包吧。配合使用VirtualXposed可以在7.0以上的手機上避免因爲抓包軟件證書安裝在用戶目錄導致證書不被信任的問題,並且手機不需要root。 root的手機最一勞永逸的方法就是將證書從用戶證書目錄移動到系統證書目錄。

開啓抓包後,在米家App的 智能–>我的 頁面下拉刷新觸發場景拉取,然後停止抓包。在抓到包後查看下面的url的請求,我就不截圖了。

    POST /app/scene/list h2
    Host: api.io.mi.com

總結

好了,至此我們就實現了通過Tasker來觸發米家中的場景。可以愉快的玩耍了!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章