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来触发米家中的场景。可以愉快的玩耍了!!!

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