获取Jawbone UP中的个人数据(二)非官方API

从Jawbone网站上,能够下载UP的个人数据,但是这个数据是以天为单位的汇总数据,如果我们需要更精细的数据,就必须通过程序获取。

Jawbone官方网站宣称已经提供开发API,用于与合作方应用之间进行数据交换。但是这个API在网上见不到。我辈苦逼的码农想玩玩自己的数据,只好另想办法。

Eric Blue曾经于2011年11月发表过一篇博文jawbone-up-api-discovery, 介绍了他通过网络侦听Jawbone UP应用与服务器之间的通讯,破解出的一些非官方API,这些API可以用于获得用户自己的运动数据。时过境迁,Jawbone UP硬件已经更新换代至UP 2,手环版本为6-1.0.20,手机应用软件也已经升级到了2.6.8版本,Server端版本已经更新至1.34。Eric Blue公布的API部分内容已经过时。

下面的API是对Jawbone UP的Android版本进行了反编译所得到的,并借鉴了Eric Blue的方法,通过对Jawbone UP应用发出的请求进行侦听以确认,错误在所难免。

详细内容如下:

  1. 概述和登陆
  2. 用户行为概况
  3. 睡眠情况细节——Sleeps
  4. 运动情况细节——Moves
  5. 锻炼情况细节——Workouts
  6. Meals 和 Mood
  7. 其他个人信息
  8. 运动趋势统计和生命线

其他还有一些社交类、饮食类 API 与用户行为数据相关性不大,不再进行分析。祝各位玩的开心!
Score

1. 概述和登陆

客户端请求基本说明

典型的 Jawbone UP 客户端请求形式如下,其中形如 v.1.34 的版本部分用于指明所需的Server端服务版本号,此信息可以省略:

在进行其他访问之前,必须先登录。正确登录之后,只需在每次请求的HTTP中,将认证时的所获得Token值设置到 HTTP Header:**x-nudge-token** 里,即可保持会话。

用户登录

Eric Blue 提到的登录方式 "**user/signin/login**" 方法仍然可用。不过在新的UP客户端版本中,还能够通过 “**users/login**” API进行登陆。

利用 user/signin/login 登陆

Request:

Params:

Return :

Token 值为 JSON 内容中最下端的 "token" : "un_ZHV8Uiq1pyJCPnqCljjDEEuGrKl7nURWQYUScC6E"

用户 XID 值取 "user"."xid” : "RGaCBFg9CsDYVvm2kchbcw"

完整JSON示例如下:

利用 users/login 登陆

users/login 是目前Jawbone UP客户端采用的登录方式,由于其将用户密码进行 SHA-1 之后再传递,所以更加安全。

登陆页面

Request:

Params:

Return :

Token 值为 JSON 内容中的 "data"."session_uid" : "1BkkscbY2RvUUQXF9TewzzDEEuGrKl7nJIuimAfcp8E"

用户 XID 值为 "data"."user"."xid" : "RGaCBFg9CsDYVvm2kchbcw"

完整JSON示例如下:


2. 用户行为概况

用户概况

打开 UP 的 Home 页,首先会展示用户当天的任务完成情况,以及用户的历史行为。下面我们就来讨论,这个页面使用到两个API users/%userXid%/scoreusers/%userXid%/social

请注意,Eric 提到的 users/%userXid%/healthCredits API 似乎已经**不再可用**。

Home页

在使用 users/%userXid%/... 类型的 API 时,需要注意的其中 %userXid% 的取值可以有两种形式:

  • @me ,用于访问自己的信息
  • User XID 值 ,可以使用 login 返回的 "user"."xid" 访问自己的信息。或者可以利用从朋友查找中获取的 User XID值,查询他人的信息(推测,未实验)。

users/%userXid%/score

users/%userXid%/score 用于查看用户的运动完成情况,显示当天用户运动、睡眠、饮食等综合信息。

Request:

Params:

Return :

返回信息包括 Mood、Move、Sleep、Meals 等按日统计信息,这个数据还包括了当用户点击各种行为的状态条时,打开具体行为统计页面的信息:

Score

完整JSON示例如下:

users/%userXid%/social

users/%userXid%/social 用于查看用户各种活动的综合情况,按照当日或设定的截止访问时间,由近至远排列。

Request:

Params:

Return :

返回信息包括 Mood、Move、Sleep、Meals、WorkOut 等活动的分项信息,此处数据仅为对应行为的概述性数据,如果需要更详细的分项数据汇总,需要以 "data"."feed"."xid" 为参数(记为 %evtXid% ),根据 "data"."feed"."type" 调用对应的接口。如:

如果需要换页,可以在"data"."links"."next" 找到换页的URL,如: "data"."links"."next": "/nudge/api/v.1.34/users/RGaCBFg9CsDYVvm2kchbcw/social?page_token=1370439133&limit=20"

Score

完整JSON示例如下:

Users Feeds

users/%userXid%/feed

users/%userXid%/feed 这个 API 和 users/%userXid%/social 几乎如出一辙,唯一差别就是 social API多了个参数 date, 两者的返回参数几乎完全相同

Request:

Params:

Return :

如果需要换页,可以在"data"."links"."next" 找到换页的URL,如:"data"."links"."next": "/nudge/api/v.1.34/users/RGaCBFg9CsDYVvm2kchbcw/feed?page_token=1371815940&limit=5"

完整JSON示例如下:

feeditems/%activityXid%

在 users/%userXid%/social 和 users/%userXid%/feed 两个 API 中的返回值中,我们会发现每个 "data"."feed" 都有一个叫做 "activity_xid" 的值,这个值能够作为 feeditems/%activityXid% 的调用参数,返回单个行为的概述数据。我比对了一下,发现其返回 JSON 数据和上两个 API 的返回值中的数据似乎没什么区别。

Request:

Params:

Return :

完整JSON示例如下:

Users Events

users/%userXid%/events

users/%userXid%/events 是个非常有用的函数。 利用这个函数,能够获取当前用户的所有 Event, 包括已经被删除的用户事件。同时,这个 API 还有 types 参数,能够限制只返回特定类别 Event。

Request:

Params:

Return :

完整JSON示例如下:


3. 睡眠情况细节——Sleeps

Jawbone 最吸引我的功能之一,就是能够记录睡眠情况。除了前面介绍的 user/%userXid%/social 等用户行为概述 API 之外,与睡眠相关的 API 还有以下几个:

从 user/%userXid%/social 结果中的 "data"."feed"."xid"; 从 user/%userXid%/sleeps 结果中的 "data"."items"."xid" 获得 %evtXid% , 用于调用 sleeps/%evtXid% 和 sleeps/%evtXid%/snapshot 。

Meals

user/%userXid%/sleeps

这个 API 能够返回个人的睡眠概括数据列表。在Jawbone UP 的手机应用界面中并没有对应的界面输出。

Request:

Params:

Return :

sleeps/%evtXid%

从 user/%userXid%/social 结果中的 "data"."feed"."xid"; 从 user/%userXid%/sleeps 结果中的 "data"."items"."xid" 获得 %evtXid% , 用于调用 sleeps/%evtXid% 。

Request:

Params:

Return :