调用Google People API获取联系人报错:缺少必填参数resourceName
解决Google People API调用
contacts.people.connections.list()的错误问题 嘿,我来帮你搞定这个问题!你碰到的Error: Missing required parameters: resourceName错误是因为API调用缺少了必填参数,还有几个小细节需要调整,咱们一步步来修复:
问题分析与修复步骤
1. 补上必填的resourceName参数
Google People API的connections.list接口要求必须传入resourceName参数,用来指定要获取哪个用户的联系人。对于当前授权的用户,我们直接填'people/me'就可以了。
2. 更换正确的OAuth权限范围
你当前使用的https://www.googleapis.com/auth/plus.me权限只能获取用户的Google+个人资料,完全没有访问联系人的权限。根据你的需求替换成对应的权限:
- 仅读取联系人:
https://www.googleapis.com/auth/contacts.readonly - 需要读写联系人:
https://www.googleapis.com/auth/contacts
3. 调整API调用的时机
你现在把联系人API的调用放在了getAccessToken回调函数外面,这时候OAuth2客户端还没完成授权、拿到有效token,必然会出问题。必须把这个调用移到getAccessToken的回调内部,确保授权完成后再执行。
修改后的完整代码
const express = require('express'), bodyParser = require('body-parser'), Sequelize = require('sequelize') const app=express() app.use(bodyParser.json()) var google = require('googleapis'); var contacts = google.people('v1'); const nconf = require('nconf'); const readline = require('readline'); const plus = google.plus('v1'); const path = require('path'); const OAuth2Client = google.auth.OAuth2; nconf.argv().env().file(path.join(__dirname, '/oauth2.keys.json')); const keys = nconf.get('web'); const CLIENT_ID = '1058912681476-uat19si2uli37vlehs2avqfue2l0b6ku.apps.googleusercontent.com'; const CLIENT_SECRET = 'PbY8AVICTQsywb4qiqCJ8gMB'; const REDIRECT_URL = 'urn:ietf:wg:oauth:2.0:oob'; const oauth2Client = new OAuth2Client(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); function getAccessToken (oauth2Client, callback) { // generate consent page url const url = oauth2Client.generateAuthUrl({ access_type: 'offline', // will return a refresh token // 更换为联系人权限范围 scope: 'https://www.googleapis.com/auth/contacts.readonly' }); console.log('Visit the url: ', url); rl.question('Enter the code here:', code => { // request access token oauth2Client.getToken(code, (err, tokens) => { if (err) { return callback(err); } // set tokens to the client oauth2Client.credentials=tokens; callback(); }); }); } // retrieve an access token getAccessToken(oauth2Client, () => { // retrieve user profile plus.people.get({ userId: 'me', auth: oauth2Client }, (err, profile) => { if (err) { throw err; } console.log(profile.displayName, ':', profile.tagline); }); // 把联系人API调用移到回调内部,补上resourceName参数 contacts.people.connections.list({ auth: oauth2Client, resourceName: 'people/me', // 必填参数 personFields: 'names,emailAddresses' // 指定要获取的字段,按需调整 }, function (err, response) { if(err){ throw err; } // 注意:返回的结构是response.data.connections,不是直接response.names console.log('用户联系人列表:', response.data.connections); }); }); app.listen(8080)
额外说明
- 我还加了
personFields参数,这也是API要求的必填参数(除非你用requestMask.includeField),用来指定要返回联系人的哪些字段,比如姓名、邮箱等,你可以根据自己的需求调整。 - 注意返回的联系人数据结构是
response.data.connections,每个联系人对象里包含你指定的字段,比如names、emailAddresses,所以之前的console.log(response.names)是不对的,我已经改成了正确的打印方式。
内容的提问来源于stack exchange,提问作者CanciuCostin
相关产品推荐
相关产品推荐

