2

我正在尝试使用 google-auth-library-nodejs 将照片上传到经过身份验证的帐户,主要遵循此处的示例。我已经成功地使用 OAuth2Client 对客户端进行了身份验证,并且首先使用图像发出发布请求,然后创建媒体项目。但是,我不断从 mediaItems:batchCreate POST 请求中收到此错误。

media item creation status:  { code: 3,
  message:
   'NOT_IMAGE: There was an error while trying to create this media item.' }
{ expiry_date: 1551232184753,
  scopes:
   [ 'https://www.googleapis.com/auth/photoslibrary.appendonly' ],
  azp:
   '279811607028-ne3ln378urka8e6gn1nknag92uv7qhvs.apps.googleusercontent.com',
  aud:
   '279811607028-ne3ln378urka8e6gn1nknag92uv7qhvs.apps.googleusercontent.com',
  exp: '1551232184',
  access_type: 'offline' }

我怀疑这是因为 Oauth2Client.request 中的Gaxios对象参数将请求的数据编码为 base64,而照片 api 文档要求二进制数据。有没有办法覆盖 Gaxios 对象中的这种行为?我可以发出正常的发布请求,但我想保留 google-auth-library 的好处认证好处。这是我的代码。

const oAuth2Client = await getAuthenticatedClient();

let image = fs.readFileSync(path.join(__dirname, '../diagrams/camera_mod_measurements.jpg') );

// Make a simple request to the People API using our pre-authenticated client. The `request()` method
// takes an GaxiosOptions object.  Visit https://github.com/JustinBeckwith/gaxios.
const requestParams = {
    url: "https://photoslibrary.googleapis.com/v1/uploads",
    method: "POST",
    headers: {
        "Content-Type": "application/octet-stream",
        "X-Goog-Upload-File-Name": "test1",
        "X-Goog-Upload-Protocol": "raw"
    },
    data: {
        MEDIA_BINARY_DATA: image
    },
    params: {

    },
}
const uploadToken = await oAuth2Client.request(requestParams);
console.log("UPLOAD TOKEN:", uploadToken.data);

const mediaItemRequest = {
    url: "https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate",
    method: "POST",
    headers: {
        "Content-Type": "application/json"
    },
    data: {
        "newMediaItems": [
            {
                "description": "TEST",
                "simpleMediaItem": {
                    "uploadToken": uploadToken.data
                }
            }
        ]
    }
};

const mediaItemResponse = await oAuth2Client.request(mediaItemRequest);
console.log(mediaItemResponse.data);
console.log("media item creation status: ", mediaItemResponse.data.newMediaItemResults[0].status);

谢谢!

4

0 回答 0