帮助家长从 Procare 下载自家宝宝的数据(包括但不限于照片、视频、Note、Meal等)
我家宝宝所在的 daycare 用 Procare 每天发照片/Note 等宝宝的每日活动记录,可惜 Procare 没有提供专门的导出功能,设计上对导出数据也并不算友好,对于想要自己保留一份数据的父母困难重重,具体来讲:
- 用浏览器访问的 Web 页面,仅能得到最近3个月的活动数据,不过照片和视频倒是有单独的页面,可以按指定的日/周/月提供下载(没有提供批量下载,想下载要一个一个点)
- 用手机访问的 App,可以按活动类别展示指定日期内的数据(目测一次最多选85天),但无法从 App 上复制粘贴文字信息(要保存只能截屏)
- 就算是手工下载或截屏的照片,照片的拍摄日期信息也没法一并保存(在按拍摄时间排序的照片流里,可能会用下载时间代替拍摄时间,或者显示为 NODATE,会显得很凌乱)
因此想找到一个拿到这些数据的办法,以便按自己的喜欢的方式管理(例如照片/图片放在 Amazon Photos,视频放在 Google Photos),摆脱只能在 Procare 中查看的囧境。
对于照片和视频,先通过 userscript 把下载文件的url和元信息保存到一个 csv 文件,再通过命令行根据 csv 文件并行下载文件,并更新其元信息; 对于 Note、Meal 或其他,先在手机 App 上录制成 MP4 视频,再通过 python 脚本提取成按日聚合的图片;
-
从 mp4 视频中逐帧分析,提取每日 Note/Meal 等
-
OCR 识别日期和时间,更新 EXIF original date 信息(这样该照片在照片流按拍摄时间排序时,才会被放到对应那一天)
-
按日将长图和多个有部分重叠的图片缝合(stitch)成一张图片
-
可通过更改 config 微调对 mp4 视频的分析细节(仅测试过 iPhone X Max,其他厂商或型号手机录制的 mp4 可能需要调整参数,例如调整 OCR 识别日期、时间的正确位置,提高识别准确率)
# Dependencies of pytesseract and PyExifTool package used in python
brew install tesseract exiftool
推荐使用 pyenv 和 virtualenv 避免影响系统 python
# Use 3.9.2 for example, you can use whatever version >= 3
pyenv install 3.9.2
# Setup and activate a virtual environment
pyenv virtualenv 3.9.2 geekdadgo-runtime
pyenv activate geekdadgo-runtime
# Upgrade pip to avoid troubles
python -m pip install --upgrade pip
# Install geekdadgo
pip install git+https://github.com/everbird/geekdadgo.git@v0.1.1
# Download config file
wget -O ~/.geekdadgo.conf https://raw.githubusercontent.com/everbird/geekdadgo/main/config/.geekdadgo.conf
geekdadgo --help
下面均以手机用 iPhone X Max,桌面系统用 macOS,浏览器用 Firefox 为例,不再做特殊说明。若使用不同,请自行做相应调整。
- 安装 GreaseMonkey (Firfox) 或 Tampermonkey (Chrome )
- 安装 geek-dad-go_exporter.user.js userscript 脚本 (点击链接即可提示安装,或者自己手工安装:点击 Greasemonkey/Tampermonkey 按钮,选 “New user script ...“,将文件内容复制粘贴后保存 )
- 打开或刷新 Procare Web 页面,例如 School Dashboard
- 点击页面右下角新出现的 "Export photo/video links" 按钮
- 在弹出对话框中分别填写 起始时间 和 结束时间,格式为 YYYY-MM-DD,例如 2023-07-12
- 等待生成并下载 csv 文件,你可以通过浏览器自带的 Web Developer Tools 在 Console 中查看进度
打开命令行终端(Terminal 或 iTerm2 之类),执行以下命令:
cat procare-photos-csv-2022-07-12_to_2023-05-24.csv | awk -F, '{ gsub(":", "-", $2); gsub(/\..*$/, "", $2); print $1,$2,$3}' | xargs -n3 -P8 sh -c 'wget -q -O photos_2022-07-12_to_2023-05-24/$0_$1.jpg $2'
该命令用 wget 并行下载 csv 文件中 url 对应的数据,所以执行前请确保 wget 已安装。下载时间跟网速和图片数量有关,附上例子如下:
~/Downloads/procare
❯ time cat procare-photos-csv-2022-07-12_to_2023-05-24.csv | awk -F, '{ gsub(":", "-", $2); gsub(/..$/, "", $2); print $1,$2,$3}' | xargs -n3 -P8 sh -c 'wget -q -O photos_2022-07-12_to_2023-05-24/$0_$1.jpg $2'
cat procare-photos-csv-2022-07-12_to_2023-05-24.csv 0.00s user 0.00s system 0% cpu 2:07.15 total
awk -F, '{ gsub(":", "-", $2); gsub(/..$/, "", $2); print $1,$2,$3}' 0.04s user 0.01s system 0% cpu 2:53.29 total
xargs -n3 -P8 sh -c 'wget -q -O photos_2022-07-12_to_2023-05-24/$0_$1.jpg $2' 85.71s user 31.48s system 60% cpu 3:12.35 total~/Downloads/procare 3m 12s
❯ cat procare-photos-csv-2022-07-12_to_2023-05-24.csv | wc -l
2114
执行以下命令:
geekdadgo update-dto -i ~/Downloads/procare/photos_2022-07-12_to_2023-05-24
所有 -i 参数对应目录中的 png, jpg, jpeg 文件都会被遍历,按文件名以下划线(_)分隔后末尾的时间来更新该图片的 EXIF original date。附上例子如下:
~/playground/geekdadgo main* ⇣
❯ time geekdadgo update-dto -i ~/Downloads/procare/photos_2022-07-12_to_2023-05-24
geekdadgo update-dto -i ~/Downloads/procare/photos_2022-07-12_to_2023-05-24 13.23s user 4.67s system 73% cpu 24.420 total
开始之前,先准备好屏幕录制功能。在 Settings -> Control Center 中加入 Screen Recording,这样从屏幕右上角下划时,会有屏幕录制按钮。
打开 Procare 移动端 App,在 Activity 标签中点击宝宝名字右下方的漏斗图标,在 Activity Filter 页面,将默认的 "All Activities" 改为你想要保存的活动类型,例如 Note 或 Meals 等。再依次选择起始时间和结束时间后,点击 APPLY 按钮得到你所选择类别和时间范围的列表。注意 App 中时间范围目测一次最多选 85 天,所以推荐按月操作。
开始录制之前,先将屏幕一直划到底部,让所有需要加载的新数据全都显示出来,直到看到底部"This is the end of your activities"。
双击顶部状态栏回到页面最顶部,从屏幕右上角下划,选择屏幕录制按钮,在开始倒计时时回到 Procare 页面,屏幕左上角出现红色按钮时,开始录制屏幕。
尽量匀速上划,直到再次看到底部。然后点击左上角红色按钮结束录制。请保障所录制的内容不包含切换程序、加载、通知条等影响画面的元素,必要时可开启 Do Not Disturb 模式。
附上例子视频仅供参考:
blurred-procare-note-20221201-20221231.mov
将录制好的 mp4 文件传输到电脑上(例如我直接用的 AirDrop)
用以下命令将 mp4 文件按日提取成图片,放在 images 目录内:
geekdadgo run -o images -i procare-note-20230301-20230331.MP4
注意你可以用 -o
指定自己的输出目录,用 --config-path
指定自定义配置,用 -vvvv
开启更多日志。另外配置文件 中 [app]
部分的 debug
设置为 true
可以开启调试模式,将处理过程中识别各个区域的结果按相应帧数输出成图片,以便按效果微调配置文件中的各个参数。
从上述例子视频提取出的文件如下:
附上具体图片:
提取后请自行验收一遍图片,若出现严重遗漏、OCR偏差、缝合错位等,可以调整配置文件中的相应参数来适应你的情况
用以下命令更新图片的 EXIF original date
geekdadgo update-dto -i images
如有必要,可以考虑用不同的配置文件,将同一个 mp4 文件的图片提取到不同目录,然后从中挑选出每日较好的那张(主要是因为,如果图片很长的话,有时 stitch 会错乱或模糊,所以不同配置的输出结果有可能有好有坏)。