Google api 使用Google People API不会显示Google联系人

Google api 使用Google People API不会显示Google联系人,google-api,google-contacts-api,google-people-api,Google Api,Google Contacts Api,Google People Api,因为谷歌不推荐谷歌联系人API,而是建议我们使用谷歌联系人API来添加/创建/删除联系人。我能够创建、获取谷歌联系人,示例代码如下: const { google } = require("googleapis") const path = require("path") const keyFile = path.join(__dirname, "serviceAccCredentials.json") const scopes =

因为谷歌不推荐谷歌联系人API,而是建议我们使用谷歌联系人API来添加/创建/删除联系人。我能够创建、获取谷歌联系人,示例代码如下:

const { google } = require("googleapis")
const path = require("path")

const keyFile = path.join(__dirname, "serviceAccCredentials.json")
const scopes = [
  "https://www.googleapis.com/auth/contacts",
  "https://www.googleapis.com/auth/contacts.readonly"
]

function log(arg) {
  console.log(JSON.stringify(arg, null, 4))
}

const run = async () => {
  try {

    const { people, contactGroups } = google.people({
      version: "v1",
      auth: await google.auth.getClient({
        keyFile,
        scopes
      })
    })

    const createContact = await people.createContact(
        {
        requestBody: {
          names: [
            {
              givenName: "Yacov 3",
              familyName: "110$"
            }
          ],
          "memberships": [
            {
              "contactGroupMembership": {
                contactGroupId: 'myContacts'
                // "contactGroupResourceName": "contactGroups/myContacts"
              }
            }
          ]
        }
      }
    )
    log(createContact.data)

    const afterResponse = await people.connections.list({
      resourceName: "people/me",
      personFields: "names",
    })
    log(afterResponse.data)

  } catch (e) {
    console.log(e)
  }
}

run()

问题是,我看不到谷歌联系人下使用服务帐户创建的联系人。通常情况下,服务帐户是为G-suit用户创建的,在G-suit域范围的委派设置下,我还添加了带有范围的项目id。此外,服务帐户中还启用了People API

此外,在年的操场上,当我试图创建一个谷歌联系人时,它成功了。来自那里的API资源管理器/游乐场的请求如下所示

     const createContact = await people.createContact({
        "personFields": "names",
        "sources": [
          "READ_SOURCE_TYPE_CONTACT"
        ],
        "prettyPrint": true,
        "alt": "json",
        "resource": {
          "names": [
            {
              "givenName": "test 2",
              "familyName": "playground"
            }
          ],
          "memberships": [
            {
              "contactGroupMembership": {
                "contactGroupResourceName": "contactGroups/myContacts"
              }
            }
          ]
        }
      })
奇怪的是,像
contactGroupResourceName
personFields
sources
alt
prettyPrint
这样的所有属性都不存在

谁能告诉我发生了什么事。 PS:我不能也不想使用OAuth2,因为应用程序将是服务器到服务器的通信,不会涉及任何人的同意。谢谢

问题: 您可能已经为您的服务帐户启用了域范围的委派,但您没有使用它来模拟普通用户

域范围委派的目的是让服务帐户代表域中的任何用户行事,但要做到这一点,您必须指定希望服务帐户模拟的用户

否则,服务帐户将访问其自己的资源(其联系人、驱动器、日历等),而不是常规帐户的资源。因此,如果使用常规帐户访问contacts UI,您将看不到创建的联系人,因为没有为此帐户创建联系人

解决方案: 您需要模拟要为其创建联系人的帐户

为此,由于您使用的是节点的,因此应指定要模拟的帐户的电子邮件地址,如下所示:

更新: 在这种情况下,您可以执行以下操作:

let auth = await google.auth.getClient({
  keyFile,
  scopes
});
auth.subject = "email-address-to-impersonate";
const { people, contactGroups } = google.people({
  version: "v1",
  auth: auth
})
参考:

问题是,我看不到使用您登录的服务帐户创建的联系人。如果它们是由服务帐户创建的,那么它们就是服务帐户联系人,您无法从自己的帐户中看到,因为您没有访问权限。当您从服务帐户创建它们时,您是否将其委托给域上的用户?@DaImTo有意义,
当您从服务帐户创建它们时,您是否将其委托给域上的用户?
这是如何做到的?你能解释一下吗?peerror:authClient.request不是一个函数,我在传递auth.subject后遇到了错误,或者我在创建联系人时也尝试了auth.email,例如
people.createContact({auth:{email:'ffbtest@fforb.com'},请求主体:{名称:[
@Danish你在哪里添加这个?你正在为
google.people
中的
auth
参数构建值,那么你在哪里设置
auth.subject=“email”
?我建议首先构建
auth
参数,然后调用
google.people({…})
。我编辑了我的答案,以展示如何做到这一点。大家好,是的,我尝试了上面的示例,现在我有一个不同的错误。
错误:未经授权的\u客户端:客户端未经授权使用此方法检索访问令牌,或者客户端未被授权使用任何请求的作用域。at/home/xxx/people api project/node\u modulees/gtoken/build/src/index.js:272:35在处理tick和拒绝时(内部/process/task_queues.js:94:5)
@丹麦语这可能意味着您在设置域范围的委派时没有将适当的作用域添加到管理控制台。请按照指定的步骤进行操作,并确保添加了
联系人
联系人。只读
(步骤5)。@丹麦语不客气。很高兴您的问题得到解决。
let auth = await google.auth.getClient({
  keyFile,
  scopes
});
auth.subject = "email-address-to-impersonate";
const { people, contactGroups } = google.people({
  version: "v1",
  auth: auth
})