You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:35:13