Я пытаюсь передать вес в Google Fit API через PHP и прочитал Отправить информацию о весе / расстоянии через Google Fit REST API без просвещения.
Я запросилAuth Token с областями действия
https://www.googleapis.com/auth/fitness.body.write
Я также создал источник данных, и если я использую POSTMAN для выполнения Get on
https://www.googleapis.com/fitness/v1/users/me/dataSources
, я получаю ожидаемые данные
{
"dataStreamId": "derived:com.google.weight:REDACTED",
"dataStreamName": "Mediasana BS444",
"type": "derived",
"dataType": {
"name": "com.google.weight",
"field": [
{
"name": "weight",
"format": "floatPoint"
}
]
},
"device": {
"uid": "REDACTED_MAC",
"type": "scale",
"version": "1",
"model": "BS444",
"manufacturer": "Mediasana"
},
"application": {
"version": "1",
"detailsUrl": "http://example.com",
"name": "PHPBathroomScales"
},
"dataQualityStandard": []
},
Так что все выглядит хорошо, используя PHP SDK для создания запроса, я вижу, что в конечном итоге он вызывает
https://www.googleapis.com/fitness/v1/users/me/dataSources/REDACTED/datasets/1535085014438000000-1535085014438000000
с полезной нагрузкой
{"dataSourceId": "УДАЛЕНО", "maxEndTimeNs": 1535085014438000000, "minStartTimeNs": 1535085014438000000, "точка": { "dataTypeName": "com.google.weight", "originDataSourceId": "", "" endTimeNanos: 1535085014438000000, "startTimeNanos": 1535085014438000000, "value": {"fpVal": 88.8}}}
(что в целом соответствует примеру @ james-cole из вышеуказанного потока
и дает JSON-ответ
{
"minStartTimeNs": "1535085014438000000",
"maxEndTimeNs": "1535085014438000000",
"dataSourceId": "REDACTED",
"point": []
}
Согласно документации "В случае успеха этот метод повторяетсяrns ресурс Users.dataSources.datasets в теле ответа. «Похоже, что он был успешным, однако пустое значение означает, что что-то невелико, а последующие запросы показывают, что вес не был добавлен.
Есть идеи, чего не хватает?
$client = new Google_Client();
$client->setApplicationName($app_name);
$client->setScopes(implode(' ', array(Google_Service_Fitness::FITNESS_BODY_WRITE)));
$client->setAuthConfig($client_secret);
$client->setAccessType('offline');
// Read and Update Access Code token removed for brevity
return $client;
$dataStreamId = "REDACTED";
addWeight($fitness_service,$dataStreamId,new DateTime("2019-03-17 11:02:03",new DateTimeZone("UTC")),88.8);
function addWeight(&$service,$dataStreamId,$time,$value)
{
$time = intval($time->format("U")*1000000000);
$minmax = "{$time}-{$time}";
$pointValue = new Google_Service_Fitness_Value();
$pointValue->setFpVal(floatval($value));
$pointPatch = new Google_Service_Fitness_DataPoint();
$pointPatch->setDataTypeName("com.google.weight");
$pointPatch->setEndTimeNanos($time);
$pointPatch->setStartTimeNanos($time);
$pointPatch->setValue($pointValue);
$patchBody = new Google_Service_Fitness_Dataset();
$patchBody->setDataSourceId($dataStreamId);
$patchBody->setMaxEndTimeNs($time);
$patchBody->setMinStartTimeNs($time);
$patchBody->setPoint($pointPatch);
$patchResult = $service->users_dataSources_datasets->patch("me",$dataStreamId, $minmax, $patchBody);
}