示例#1
0
def fitbit_activity(user_id):
    """ 存储今天的 activity 记录
    API: https://dev.fitbit.com/build/reference/web-api/activity/
    """
    user = load_user(user_id)
    oauth = get_user_oauth(user=user, provider='fitbit')

    if not oauth:
        return jsonify({'msg': 'Unauthorized'})

    fitbit = Fitbit(client_id=os.getenv('FITBIT_APP_ID'),
                    client_secret=os.getenv('FITBIT_SECRET'),
                    access_token=oauth.token['access_token'],
                    refresh_token=oauth.token['refresh_token'],
                    refresh_cb=actions.fitbit_refresh_cb)

    dt_str = request.args.get('datetime')
    dt = pendulum.parse(dt_str, strict=False)

    # 如果 token 失效更新 token
    if is_token_expired(dt, oauth.token):
        new_token = fitbit.client.refresh_token()
        app.logger.info('=== {} new_token: {}'.format(user.username,
                                                      new_token))
        actions.update_oauth_token(oauth, new_token)

    # 获取 activity
    data = fitbit.activities(date=dt.date(), user_id=oauth.provider_user_id)
    print('==== activities from fitbit')
    print(data)

    query = models.Activity.query.filter_by(user=user, date=dt.date())

    try:
        activities = query.one()
        activities.data = data
        db.session.add(activities)
        db.session.commit()
    except NoResultFound:
        # 存储 activity
        activities = models.Activity(user=user, data=data, date=dt.date())
        db.session.add(activities)
        db.session.commit()

    result = activities.data['summary']

    for distance in result['distances']:
        if distance['activity'] == 'total':
            result['distances'] = distance['distance']
            break

    return jsonify(result)