自制AirTag定位器成品使用教程(支持安卓/鸿蒙/iOS/PC等所有系统查看定位器的位置)
2025年5月26日重要更新:
苹果上周改变了获取位置报告的机制,现在一次请求最多只能取到20~40条报告。
若一次性使用太多公钥去请求,可能会出现取不到最新位置的情况。
docker和脚本已经适配,多个公钥改为分批获取(所以速度比以前慢一点)。
1、macless-haystack-gitee镜像已更新,需重新下载docker镜像 详细步骤:docker rm -f macless-haystack-gitee docker rmi lovelyelfpop/macless-haystack-gitee docker run -d --restart unless-stopped --name macless-haystack-gitee -p 6176:6176 --volume mh_data:/app/endpoint/data --network mh-network lovelyelfpop/macless-haystack-gitee #立即开启另一个终端,执行下面命令重新启动服务器 docker restart macless-haystack-gitee
2、
request_reports.py
也已更新
需要pip3 install -r requirements.txt
重新装下依赖
由于已保留上次的登录状态,所以一般不需要重新登录AppleID。
目录
- 成品使用教程
- 先决条件
- 服务器设置
- 1. 创建一个 docker 网络
- 2. 运行 Anisette Server
- 3. 运行 Macless Haystack 服务
- 4. 另开终端重启 Macless Haystack
- 前端应用程序
- Home Assistant 集成
- 新方法只用 cloud_gps 集成
- 旧方法 OwnTracks + MQTT
成品使用教程
自制的定位标签有几个特点:
- 无蜂鸣器
- 隐匿性。苹果手机不会弹通知"发现正在跟随您移动的物品"
先决条件
- 有 Linux 服务器(任意Linux均可,比如nas、树莓派、云服务器,能运行docker即可)。
- 已启用 2FA (双重认证)的 Apple ID。
强烈建议不要使用个人常用的 Apple ID,而是注册一个新的 Apple ID 用于实验目的。
没有 Apple ID 的 可以找朋友借用一下苹果设备(iPad、Macbook、iPhone),注册一个。- 仅支持短信方式作为双重认证!
- 如果有苹果设备登录着该 Apple ID,最好退出,否则有可能收不到短信验证码。
- 您需要在苹果设备上登录过该帐户才可以(获得了 iCloud 的 5G 免费空间或登录过 Apple Music 才是有效的 Apple ID)。仅在 iCloud 网页上注册的 Apple ID 权限不足。
- Linux 已安装 Docker。
- 如果你有 Home Assistant 集成的需求(不知道是啥的就不用看这段了),有2种集成方式
- 新方法只用 dscao/cloud_gps 集成;
- 旧方法 OwnTracks + MQTT,步骤复杂一点:
- Home Assistant 安装 OwnTracks 集成,MQTT 集成 和 Mosquitto broker 加载项。
- Linux 已安装 Python3 和 pip3
- 下载或克隆 本仓库 到 Linux 的
~/macless-haystack/
(~
代表 home 目录),并执行pip3 install -r requirements.txt
命令用于安装依赖包。 - 创建
keys/
目录
然后把mkdir ~/macless-haystack/keys/
XXXXXX.keys
文件放到此目录下
服务器设置
1. 创建一个 docker 网络
在终端中执行以下命令,创建一个新的docker网络
docker network create mh-network
2. 运行 Anisette Server
docker run -d --restart always --name anisette -p 6969:6969 --volume anisette-v3_data:/home/Alcoholic/.config/anisette-v3/ --network mh-network dadoum/anisette-v3-server
注意:首次执行该命令会自动从 docker 官方仓库拉取镜像,因国内网络环境的原因,需要设置镜像仓库。如下修改 docker 的配置文件/etc/docker/daemon.json
(不存在就新建),增加 registry-mirrors
:
{
"registry-mirrors": [
"https://docker.hpcloud.cloud",
"https://docker.m.daocloud.io",
"https://docker.unsee.tech",
"https://docker.1panel.live",
"http://mirrors.ustc.edu.cn",
"https://docker.chenby.cn",
"http://mirror.azure.cn",
"https://dockerpull.org",
"https://dockerhub.icu",
"https://hub.rat.dev"
]
}
之后运行如下命令重启 docker 服务:
systemctl restart docker
# 或者
service docker restart
此时,镜像源应该生效了。可以用 docker info
命令验证,如果输出末尾有如下Registry Mirrors
,说明镜像源配置成功了:
Registry Mirrors:
https://docker.hpcloud.cloud/
https://docker.m.daocloud.io/
https://docker.unsee.tech/
......
如果配置未生效,拉取docker镜像还是出错,可能的原因:
1、Ubuntu 可能是因为你的docker是snap安装的,解决方法请移步 https://blog.csdn.net/lovelyelfpop/article/details/146802408
2、群晖 配置方法请移步 https://post.smzdm.com/p/ag82opxd/ 或 https://blog.csdn.net/Falleaves_Yu/article/details/120316411 或 https://wiki.slarker.me/basic/docker_mirrors.html
3、有些nas系统是有设置界面可以增加自定义镜像源的,在那里添加即可
镜像源配置生效后,继续执行上面安装 Anisette Server 的命令。
要检测 Anisette 是否正常运行,可以浏览器打开 http://服务器ip:6969
,如果能访问就说明正常;或者执行命令 curl http://服务器ip:6969
,如果有输出{"X-Apple-I-Client-Time":"202......
则正常。
如果 anisette 服务起不来,一直显示 restarting,docker 日志报错 Permission denied
,特别是在一些 nas 系统上比较常见。解决办法:把当前docker用户设为 /var/lib/docker/volumes/anisette-v3_data
这个目录的拥有者(或者加可读写权限比如775)。详见 Permission denied error
如果你没有在安卓手机或网页端查看 Tag 标签定位的需求,就不用看下面的3、4步骤了。
3. 运行 Macless Haystack 服务
运行下面命令启动 macless-haystack 服务:
docker run -it --restart unless-stopped --name macless-haystack-gitee -p 6176:6176 --volume mh_data:/app/endpoint/data --network mh-network lovelyelfpop/macless-haystack-gitee
启动服务时,系统会要求您输入 Apple ID、密码和两步验证短信验证码(注意如果 AppleID 是大陆手机号,前面要加上 +86)。
如果您看到命令行显示 serving at port 6176 over HTTP
则所有设置均正确。
要检测 Macless Haystack 服务是否正常运行,可以浏览器打开 http://服务器ip:6176
,如果页面显示Nothing to see here
就说明正常;或者执行命令 curl http://服务器ip:6176
,如果有输出Nothing to see here
则正常。
4. 另开终端重启 Macless Haystack
立即开启另一个终端,执行下面命令重新启动服务器
docker restart macless-haystack-gitee
前端应用程序
如果你没有在安卓手机或网页上查看 Tag 标签定位的需求,就不用看本节内容了。
您可以使用 Atomgit 提供的前端 web 网站,也可以自己托管网站服务器;也可以使用 Android app。
另外,请自己去高德开放平台申请 web 服务 key(key 类型一定要是 Web服务,申请是免费的),在 app/web 网站的设置中需要填入。不填也可以用,但是只会显示位置坐标,不会显示中文地址描述。
- 安装/打开前端应用
- 安卓设备请安装 apk
- 非安卓的设备(iOS/鸿蒙/PC)可使用浏览器打开网站(任选其一)
- Atomgit Page(http)
- Atomgit Page(https)
注意:
1、因浏览器限制,https 的网站只能访问 https 的后台服务。所以如果你选择使用 Atomgit Page(https),那么必须将 macless_haystack 服务部署为 https(需要 SSL 证书)。可以使用 nginx 等工具进行反代,也可以使用服务内置支持的 SSL 使用方法
2、访问 http 的地址,浏览器可能会自作主张转向 https 的地址,可以地址栏改成 http 再回车
- 可选: 如果需要iOS、Linux 或 Windows 客户端,可以自己打包(本项目前端基于 Flutter)
- 点击前端应用程序(app 或 网站)右上角齿轮图标进入设置,填写 高德web 服务 key 和 macless haystack 服务 url 地址。其它设置项默认或按需设置。
- 回主界面,点"+“图标,选择"导入 json 文件”,将
XXXXXX_devices.json
文件导入前端应用程序内。 - 注意:
- 1、“高德web 服务 key” 如果不填,位置只会显示成经纬度,而不显示中文地址描述。
- 2、“macless haystack 服务 url 地址” 形如
http://服务器ip:6176
。若要在公网使用,需将 macless haystack 服务公开到公网,可以用 路由器端口映射 或 内网穿透 的方式实现。具体操作不属于本文范畴,请自行搜索。 - 3、如果 app 获取位置报告时报错
未获取到位置。AppleID登录失效,请移除 auth.json 并重启 macless-haystack 服务
,请移步 FAQ#重新注册/更改账户 - 4、部分国产安卓机因系统魔改,点"导入 json 文件"可能弹不出文件选择。可以安装 “File Manager Plus” 这个文件管理器([GooglePlay] [Apkpure] [百度]),即可支持文件选择。
Home Assistant 集成
如果你没有 Home Assistant 集成的需求(或者不知道是啥的),就不用看本节内容了。
新方法只用 cloud_gps 集成
- 需要先运行起来 Macless Haystack 服务
- Home Assistant 中添加集成 dscao/cloud_gps
- 如下设置(具体请看该集成的 github 说明)
旧方法 OwnTracks + MQTT
此法利用了 OwnTracks 这个官方集成。
本仓库的 request_reports.py
脚本运行之后,会通过 HA 的 mqtt 向 OwnTracks 发布消息。OwnTracks 收到消息之后会自动生成 device_tracker。
- Home Assistant 中添加集成 OwnTracks
集成安装后,要在/homeassistant/configuration.yaml
增加如下配置:# Example configuration.yaml entry owntracks: max_gps_accuracy: 200 waypoints: true mqtt_topic: "owntracks/#" events_only: false
- 编辑本仓库的
settings.toml
文件,填入你自己的 mqtt地址、用户名、密码 和 Tag 标签等信息(文件内有说明) - 执行
request_reports.py
脚本。会要求你输入 Apple-ID、密码和两步验证短信验证码。
python3 ./request_reports.py
# 或者 仅获取过去12小时位置报告
python3 ./request_reports.py --hours 12
去 Home Assistant “设备与服务-实体”(或 OwnTracks 集成)中,应该可以看到 tag
开头的 device_tracker 了。
可以在墨澜地图中查看
- 最后,需要设置定时任务(比如Linux的cron),比如每隔15分钟(建议不要太频繁)执行一次上面的
python3 ./request_reports.py --hours 2
,这样位置才会定时更新。 - 注意
- 1:如果获取不到位置报告,建议拿着定位标签去人多的地方逛逛。
- 2:执行
request_reports.py
时如果报错401
,说明keys/auth.json
登录失效,请删除该文件后重新执行,重新输入 AppleID 和密码即可 - 3: 以定时任务执行时,如果
auth.json
失效,希望能第一时间知晓,可以配置settings.toml
文件内的"通知功能"部分,支持钉钉、企业微信等通知方式