Is it possible to write activity to my Google-fit account using Python?

William Brochensque junior picture William Brochensque junior · Sep 10, 2020 · Viewed 10.2k times · Source

Context:

There's this app, called, Fit as, which adds activity to your Google fit account, but it looks like it's based on real activity, such as mocking the GPS location or the device accelerometer.

There's also this app, called Step Me, which also adds activity to your Google fit account, but it's instantly. The app devs itself claim it to add data from now, to the past. (Which I think is based on maybe an API or Framework to add data to Google fit).

What I'm searching for:

A way to add data like Step Me does, but with Python.

What I already know it's possible to do:

Using this code as example, it's possible to get data from the API, like this:

#! /usr/bin/env python
#-*- coding: utf-8 -*-

import json
import httplib2
from datetime import datetime
from apiclient.discovery import build
from oauth2client.client import OAuth2WebServerFlow

CLIENT_ID = 'XXXXXXXXXXXXXXXXXX.apps.googleusercontent.com'
CLIENT_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXX'
OAUTH_SCOPE = 'https://www.googleapis.com/auth/fitness.activity.read'
DATA_SOURCE = "derived:com.google.step_count.delta:com.google.android.gms:estimated_steps"
DATA_SET = "1051700038292387000-1451700038292387000"
REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'

def retrieve_data():
    flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE, REDIRECT_URI)
    authorize_url = flow.step1_get_authorize_url()

    code = raw_input('Enter verification code: ').strip()
    credentials = flow.step2_exchange(code)

    http = httplib2.Http()
    http = credentials.authorize(http)

    fitness_service = build('fitness', 'v1', http=http)

    return fitness_service.users().dataSources(). \
              datasets(). \
              get(userId='me', dataSourceId=DATA_SOURCE, datasetId=DATA_SET). \
              execute()

def nanoseconds(nanotime):
    dt = datetime.fromtimestamp(nanotime // 1000000000)
    return dt.strftime('%Y-%m-%d %H:%M:%S')

if __name__ == "__main__":

    dataset = retrieve_data()
    with open('dataset.txt', 'w') as outfile:
        json.dump(dataset, outfile)

    last_point = dataset["point"][-1]
    print("Start time:", nanoseconds(int(last_point.get("startTimeNanos", 0))))
    print("End time:", nanoseconds(int(last_point.get("endTimeNanos", 0))))
    print("Data type:", last_point.get("dataTypeName", None))
    print("Steps:", last_point["value"][0].get("intVal", None))

And, yes, I can find some examples in java, but it doesn't help when I need to use it on a python program itself.

Answer