惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

Fooleap's Blog

渴望理想 | Fooleap's Blog 19 年底一些事 | Fooleap's Blog 藉秋风,跑起来 | Fooleap's Blog 一个人去跑步 | Fooleap's Blog 8 月的跑量仿佛是那暑假的作业 | Fooleap's Blog 三伏天跑步那么难受,为何还要跑? | Fooleap's Blog 解决小程序开发“当前系统代理不是安全代理” | Fooleap's Blog 忘却配速的夏日跑步 | Fooleap's Blog 六月天时“带水”跑步更爽 | Fooleap's Blog 出来混迟早要还的 | Fooleap's Blog 跑步不能当饭吃 | Fooleap's Blog 将京东移动端详情页链接转为 PC 端 | Fooleap's Blog 不是热就是雨 | Fooleap's Blog 这半月,我跑了 11 个 520 | Fooleap's Blog 跑完流汗一时爽,一直流汗一直爽 | Fooleap's Blog 初夏夜跑 | Fooleap's Blog Electron 中打开 QQ 临时会话 | Fooleap's Blog 春节期间的培隆角 | Fooleap's Blog 从春天跑到夏天 | Fooleap's Blog 晨雾中奔跑 | Fooleap's Blog 漫步春雨中 | Fooleap's Blog 跑在木棉花下 | Fooleap's Blog 我在春节依然坚持跑步 | Fooleap's Blog 伴随着日出跑步 | Fooleap's Blog 没有最好,只有更好 | Fooleap's Blog 电子气温计 | Fooleap's Blog 渡亭小学的金凤花 | Fooleap's Blog 随心而跑 | Fooleap's Blog 2018 跑步小结 | Fooleap's Blog 在 gVim 中使用“非等宽字体” | Fooleap's Blog 动车进汕,喜大普奔 | Fooleap's Blog 雨战汕马,漫步鮀城 | Fooleap's Blog 准备出发汕马 | Fooleap's Blog 环苏溪跑个半马 | Fooleap's Blog 不义之财 | Fooleap's Blog 跑去培隆看日落 | Fooleap's Blog 雨后跑土路 | Fooleap's Blog 秋意渐浓 | Fooleap's Blog 在夕阳下奔跑 | Fooleap's Blog 准备参加 2018 汕马 | Fooleap's Blog 不可立见的 spoiler 标签 | Fooleap's Blog TomTom Spark 表带 | Fooleap's Blog Disqus 支持新浪微博图床 | Fooleap's Blog 暂存 Disqus 匿名评论者邮箱地址 | Fooleap's Blog 组一台迷你主机 DeskMini 310 | Fooleap's Blog 我的个人信息卖给了谁? | Fooleap's Blog 我发了违法短信? | Fooleap's Blog 使用 Python 合并地图瓦片 | Fooleap's Blog 使用 Python 合并瓦片图 | Fooleap's Blog 拆电热水壶 | Fooleap's Blog 使用树莓派做监控显示 | Fooleap's Blog 南方的冷 | Fooleap's Blog 蓝牙耳机 Avantree Jogger Plus | Fooleap's Blog 新厝布网 | Fooleap's Blog 报装移动宽带 | Fooleap's Blog 双十一战绩 | Fooleap's Blog 郁闷的心情 | Fooleap's Blog 像 Disqus 一样获取链接颜色 | Fooleap's Blog Disqus 的 URL 编码问题 | Fooleap's Blog 选择框的全选联动 | Fooleap's Blog 弹出层中的视频全屏问题 | Fooleap's Blog 2016 年台风海马 | Fooleap's Blog 纯 CSS 实现导航图标动画 | Fooleap's Blog 湾头晨跑路线推荐:南湾小学跑道 | Fooleap's Blog Jekyll 显示每一年的文章数 | Fooleap's Blog 湾头晨跑路线推荐:南湾堤顶 | Fooleap's Blog Disqus 的 @ 提及功能 | Fooleap's Blog 近日渡亭堤顶的夕阳 | Fooleap's Blog 使用 Disqus API 上传图片 | Fooleap's Blog Disqus API 评论嵌套问题 | Fooleap's Blog Disqus API 的权限问题 | Fooleap's Blog 湾头晨跑路线推荐:环三湾 | Fooleap's Blog 如何下载 Apple Emoji 的 PNG 图片 公众号文章二维码 | Fooleap's Blog Disqus 的评论预审核 | Fooleap's Blog 湾头最好的跑道 | Fooleap's Blog 结合七牛和高德地图 API 显示照片位置 | Fooleap's Blog Zip 压缩排除特定目录 | Fooleap's Blog 流水涸摸蚬热 | Fooleap's Blog 2017 跨年跑 | Fooleap's Blog Jekyll 的中文字数统计 | Fooleap's Blog 为 Jekyll 文章页添加相关文章 | Fooleap's Blog 为 Jekyll 添加一个标签页面 | Fooleap's Blog 干了这瓶蛇草水 | Fooleap's Blog 在 macOS 上使用 NTFS 差点丢数据 Disqus Moderator Badge Text 已支持中文 为 Jekyll 添加一个简单的 API | Fooleap's Blog 为 Jekyll 加上简单搜索功能 | Fooleap's Blog 解决 Jemoji 的出错 | Fooleap's Blog 检测网络是否能够访问 Disqus | Fooleap's Blog 解决 This socket is closed 问题 更好的 Markdown 插图方式 | Fooleap's Blog 转换 Nike+ 的坐标数据 | Fooleap's Blog 高德地图 API 显示跑步路线 | Fooleap's Blog 善用 Google 搜索工具 | Fooleap's Blog 利用 Nike+ API 获取跑步路线数据 | Fooleap's Blog 七牛 API 生成页面 URL 二维码 旧年 12 月跑步笔记 | Fooleap's Blog 科学使用 Disqus | Fooleap's Blog 培隆角的日出 | Fooleap's Blog
将咕咚的数据导入到 Nike+ | Fooleap's Blog
fooleap · 2016-07-31 · via Fooleap's Blog

上篇文章说到运动 APP,Nike+ Running 是我目前正在使用的运动 APP,使用起来还算比较舒服,如果没特殊情况的话,我想不会更换成其他的。

那么在使用 Nike+ 之前的时间里,我用的咕咚运动的数据,能不能转移到 Nike+ 上面呢?答案是肯定的,只是麻烦些。

咕咚后台并没有提供数据导出的功能,但咕咚网提供有 API[1],也就是说可以通过咕咚网 API,将自己的运动数据取下来。然而咕咚网提供的数据并不能直接导入 Nike+,也不能直接上传到任何可跟 Nike+ 同步的平台,例如 Garmin Connect[2]

GPX 是一种基于 XML,通用于存储 GPS 数据的文件格式,可以用它来记录地点、轨迹、路径等等。支持同步到 Nike+ 的 Garmin Connect 支持 GPX 文件的导入,另外,通过一个第三方平台 Nike+ Converter & Uploader[3],可直接将 GPX 格式文件导入到 Nike+。

那也就是说,只要能把咕咚的数据转换成 GPX 格式即可,这个过程需要造一个轮子,Google 一下,很庆幸,已经有人造好了。[4][5]

在近三年时间里,已经有些许变化,故应作修改。咕咚网的数据,iOS 版本跟 Android 版本并不完全相同。我的系统环境是 Windows 7 64 位版本,并已装 Python2。使用这个轮子,需要先使用 pip 安装几个依赖包。

pip install datetime gpxpy lxml requests

对代码进行简单修改,codoonurl.py 文件中:

#apiHost = "http://api.codoon.com/"
apiHost = "https://openapi.codoon.com/"

codoon.py 文件中:

#from time import strptime 此包不存在,用以下代替
from datetime import datetime, timedelta
...
#tmptime = strptime( p["time_stamp"] , DATE_FORMAT ) 有两行,可用以下对应版本替换,因咕咚网的数据 iOS 版本时间还带三个小数位。另外,因时区问题先自减 8 个小时。
#Android
tmptime = datetime.strptime( p["time_stamp"] , DATE_FORMAT ) - timedelta(hours=8)
#iOS
tmptime = datetime.strptime( p["time_stamp"][:-5] , DATE_FORMAT ) - timedelta(hours=8)
#return gpx.to_xml() 默认的 1.0 版本无法导入 Nike+
return gpx.to_xml(version="1.1")

因为鄙人没有佳明表,也就不想通过访问速度并不快的 Garmin Connect 来同步,所以以上的修改都是针对导入 Nike+ 的。

怎么使用呢?只需在 codoon.py 里面填入咕咚的用户名及密码,将最后面的 routeId 替换成相应单次运动的 route_id ,运动即可获取该次运动的咕咚网数据及两个 GPX 文件,一个 route,一个 track,Nike+ Converter & Uploader 只支持 track。

那么问题来了,如何获取单次运动的 route_id 呢?可以打开咕咚网,点到该次运动,傻傻的打开 Developer Tools,在 NetWork 选项卡中刷新,你会发现的。

这明显比搬砖还要难受,太麻烦了。而这个工具已经有提供相应的功能,通过咕咚的 API 获取相应的数据。仅需取消 codoon.py 以下两行的注释,即可获取咕咚的运动数据列表,即每次运动数据的各种属性。

routes = device.get_route_log( productId = imei )
device.saveJsonData( filename = "/route_log.json" , data = routes)

默认只能获取最新的一百次运动的数据。可修改上面定义函数的 count

def get_route_log(self , productId , count = 100 , excluded = "" , page = 1 , isPart = 1 ):
    command = codoonurl.getRouteLogUrl()
    request_data = {"product_id" : productId , "count" : count , "excluded" : excluded ,"page" : page , "is_part" : isPart }
    return self.excutePostRequst(command , data = request_data)

获取下来的数据中 "sports_type" = 1 的即表示跑步运动类型,再相应复制其 route_id 去获取数据即可。

是不是还是很麻烦?鄙人想也是,应该修改为全自动获取所有跑步运动的单次数据,并保存为各自的文件,即使是这样,也还得每个文件手动去导入到 Nike+。想要实现自动同步,看起来还挺有事做的。鄙人并不懂 Python,就不再继续折腾。

使用的过程中,我发现 iOS 记录的数据,转成 GPX 格式后,导入 Nike+ 竟然不显示其路径,但是能显示距离。查看其文件跟 Android 并无明显区别,唯一有区别的似乎只有海拨数据,iOS 记录的是整数,整体添加一个小数点上传依然不行,搞不明白索性就算。

参考资料

本文历史

  • 2016 年 07 月 31 日 完成初稿

最近更新

猜你喜欢