使用java实时获取手环、手表的健康数据

14 篇文章 0 订阅
4 篇文章 0 订阅

吐槽

最近在自研开发一款有关读取健康数据的APP

但是数据来源非常稀少,申请了市面上所有的国内厂商的手环api都被拒了(因为是个人开发)

找了很久发现fitbit有开源的api于是淘了个fitbit的手表开始开发

Web API (fitbit.com)

在上述连接可以按步骤使用api

不知道是不是因为我英语不好的原因,总是感觉开发文档写的很拉,想找找大佬的实例代码跑一下,发现要么找不到,要么直接没法用。

没办法只能手搓。。。

以下是项目结构

pom

<dependencies>
        <dependency>
            <groupId>com.anXin</groupId>
            <artifactId>anXin-utils</artifactId>
            <version>3.6.3</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>
    </dependencies>

utils是我自己的工具类,其实只用到了base64加密随便搜一个替换就行

思路

首先注册一个应用程序,这个很简单不教学了,主要是获取token等关键信息,因为这些api都基于这些关键信息

他的授权码请求URL

https://www.fitbit.com/oauth2/authorize?client_id=ABC123&response_type=code
&code_challenge=<code_challenge>&code_challenge_method=S256
&scope=activity%20heartrate%20location%20nutrition%20oxygen_saturation%20profile
%20respiratory_rate%20settings%20sleep%20social%20temperature%20weight

但是会跳出以下授权页面

抓包发现是全部授权后会重定向,因此直接模拟浏览器重定向请求,在下面的代码已经给出

即可获取授权码来获取token

要注意的是请求一定要携带cookie不然会自动重定向到登录

实现

service定义接口

实现类先预留以下属性

 private String clientId="你的客户端id";
    private String clientSecret="你的客户端秘钥";
    private String scope="activity heartrate location nutrition profile settings sleep social weight";
    private String userAuthorizationUri="https://www.fitbit.com/oauth2/authorize";
    private String accessTokenUri="https://api.fitbit.com/oauth2/token";
    private String code;
    private String access_token;
    private String refresh_token;
    private String token_type;
    private String user_id;

接下来实现接口

 try {
            // 创建CookieStore并设置Cookie
            CookieStore cookieStore = new BasicCookieStore();
            BasicClientCookie cookie = new BasicClientCookie("Cookie", "自己在请求头那里复制"); // 替换为实际的Cookie信息
            cookie.setDomain("www.fitbit.com"); // 设置Cookie的作用域
            cookie.setPath("/"); // 设置Cookie的路径
            cookieStore.addCookie(cookie);
            CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
            String postData ="client_id="+clientId+"&response_type=code&scope=activity+heartrate+location+nutrition+oxygen_saturation+profile+respiratory_rate+settings+sleep+social+temperature+weight&state&prompt=none";
            HttpPost httpPost = new HttpPost(userAuthorizationUri);
            // 设置POST请求的Content-Type
            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
            // 设置POST请求的参数
            StringEntity entity = new StringEntity(postData, StandardCharsets.UTF_8);
            httpPost.setEntity(entity);
            CloseableHttpResponse response = httpClient.execute(httpPost);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode==302){
                Header locationHeader = response.getFirstHeader("Location");
                if (locationHeader != null) {
                    String redirectURL = locationHeader.getValue();
                    System.out.println("==================以下为fitbit服务信息===============");
                    System.out.println("重定向的路径:" + redirectURL);
                    code=redirectURL.substring(redirectURL.indexOf('=')+1).split("#")[0];
                    System.out.println("Authorize为"+code);

                } else {
                    System.out.println("未找到重定向路径");
                }

            }else {
                log.error("fitbit获取code失败");
            }
            CloseableHttpClient tokenHttpClient = HttpClients.createDefault();
            String tokenPostData = "grant_type=authorization_code&code="+code;
            HttpPost tokenHttpPost = new HttpPost(accessTokenUri);
            // 设置POST请求的Content-Type
            tokenHttpPost.setHeader("Authorization","Basic "+Base64Utils.encode((clientId+":"+clientSecret).getBytes()));
            tokenHttpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
            // 设置POST请求的参数
            StringEntity tokenEntity = new StringEntity(tokenPostData, StandardCharsets.UTF_8);
            tokenHttpPost.setEntity(tokenEntity);
            CloseableHttpResponse tokenResponse = tokenHttpClient.execute(tokenHttpPost);
            BufferedReader reader = new BufferedReader(new InputStreamReader(tokenResponse.getEntity().getContent()));
            StringBuilder jsonResponse = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                jsonResponse.append(line);
            }
            System.out.println("返回的JSON数据:" + jsonResponse.toString());
            Gson gson = new Gson();
            Map<String,Object> map = gson.fromJson(jsonResponse.toString(), Map.class);
            access_token= (String) map.get("access_token");
            refresh_token= (String) map.get("refresh_token");
            token_type= (String) map.get("token_type");
            user_id= (String) map.get("user_id");
            System.out.println("access_token为"+access_token);
            System.out.println("refresh_token为"+refresh_token);
            System.out.println("token_type为"+token_type);
            System.out.println("user_id为"+user_id);
            System.out.println("==================fitbit服务信息结束===============");
        }catch (Exception e){
            log.error("获取fitbit的token失败!");
            e.printStackTrace();
        }

 

手搓成功!

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天辰尽落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值