【问题标题】:batch update contacts - google people api批量更新联系人 - google people api
【发布时间】:2018-01-21 08:22:49
【问题描述】:

有没有办法使用新的 google people api 批量处理 CRUD 联系人(我看到 getBatchGet 存在于 READS 中)?如果我们从旧的 gdata 联系人 api 升级,我的应用会左右达到速率限制。

【问题讨论】:

    标签: google-people-api


    【解决方案1】:

    按照Google People APIs 学习如何填充您的对象,最重要的部分是在 do-while 循环中使用 Google Batch API 的方式:

    
    const { google }  = require('googleapis')
    
    
    function extractJSON (str) {
      const result = []
    
      let firstOpen  = 0
      let firstClose = 0
      let candidate  = 0
    
      firstOpen = str.indexOf('{', firstOpen + 1)
    
      do {
        firstClose = str.lastIndexOf('}')
    
        if ( firstClose <= firstOpen ) {
          return []
        }
    
        do {
          candidate = str.substring(firstOpen, firstClose + 1)
    
          try {
            result.push(JSON.parse(candidate))
            firstOpen = firstClose
          } catch (e) {
            firstClose = str.substr(0, firstClose).lastIndexOf('}')
          }
    
        } while ( firstClose > firstOpen )
    
        firstOpen = str.indexOf('{', firstOpen + 1)
    
      } while ( firstOpen !== -1 )
    
      return result
    }
    
    async function batchDeleteContacts (resourceIds) {
      /*
        resourceIds = [
          'c1504716451892127784',
          'c1504716451892127785',
          'c1504716451892127786,
          ....'
        ]
    
    
        Setup your google-api client and extract the oauth header/
      */
      const authHeader = await google.oAuth2Client.getRequestHeaders()
    
      let counter   = 0
      let confirmed = []
    
      try {
        do {
          const temp = resourceIds.splice(0, 25)
    
          const multipart = temp.map((resourceId, index) => ({
            'Content-Type': 'application/http',
            'Content-ID': (counter * 25) + index,
            'body': `DELETE /v1/people/${resourceId}:deleteContact HTTP/1.1\n`
          }))
    
          const responseString = await request.post({
            url: 'https://people.googleapis.com/batch',
            method: 'POST',
            multipart: multipart,
            headers: {
              'Authorization': authHeader.Authorization,
              'content-type': 'multipart/mixed'
            }
          })
    
          const result = extractJSON(responseString)
          confirmed = confirmed.concat(result)
    
          counter ++
    
        } while ( resourceIds.length > 0 )
    
      } catch (ex) {
    
        // Handling exception here
      }
    
      return confirmed
    }
    
    async function batchInsertContacts (contacts) {
      /*
        Follow the Google People APIs documentation to learn how to generate contact objects,
        Its easy and depends on your needs.
    
        contacts = [{
          resource: {
            clientData,
            names,
            nicknames,
            birthdays,
            urls,
            addresses,
            emailAddresses,
            phoneNumbers,
            biographies,
            organizations
          }
        }]
    
        Setup your google-api client and extract the oauth header/
      */
      const authHeader = await google.oAuth2Client.getRequestHeaders()
    
      let counter   = 0
      let confirmed = []
    
      const authHeader = await this.oAuth2Client.getRequestHeaders()
    
      try {
        do {
          const temp = contacts.splice(0, 25)
    
          const multipart = temp.map((contact, index) => ({
            'Content-Type': 'application/http',
            'Content-ID': (counter * 25) + index,
            'body': 'POST /v1/people:createContact HTTP/1.1\n'
                  + 'Content-Type: application/json\n\n'
                  + JSON.stringify(contact.resource)
          }))
    
          const responseString = await request.post({
            url: 'https://people.googleapis.com/batch',
            method: 'POST',
            multipart: multipart,
            headers: {
              'Authorization': authHeader.Authorization,
              'content-type': 'multipart/mixed'
            }
          })
    
          const result = extractJSON(responseString)
          confirmed = confirmed.concat(result)
    
          counter ++
    
        } while ( contacts.length > 0 )
    
      } catch (ex) {
    
        // Handling exception here
      }
    
      return confirmed
    }
    
    async function batchUpdateContacts (contacts) {
      /*
        Follow the Google People APIs documentation to learn how to generate contact objects,
        Its easy and depends on your needs.
    
        contacts = [{
          resourceId: 'c1504616451882127785'
          resource: {
            clientData,
            names,
            nicknames,
            birthdays,
            urls,
            addresses,
            emailAddresses,
            phoneNumbers,
            biographies,
            organizations
          }
        }]
    
        Setup your google-api client and extract the oauth header/
      */
      const authHeader = await google.oAuth2Client.getRequestHeaders()
    
      const updatePersonFields = 'names,nicknames,birthdays,urls,addresses,emailAddresses,phoneNumbers,biographies,organizations'
    
      let counter   = 0
      let confirmed = []
    
      const authHeader = await this.oAuth2Client.getRequestHeaders()
    
      try {
        do {
          const temp = contacts.splice(0, 25)
    
          const multipart = temp.map((contact, index) => ({
            'Content-Type': 'application/http',
            'Content-ID': (counter * 25) + index,
            'body': `PATCH /v1/people/${contact.resourceId}:updateContact?updatePersonFields=${updatePersonFields} HTTP/1.1\n`
                  + 'Content-Type: application/json\n\n'
                  + JSON.stringify(contact.resource)
          }))
    
          const responseString = await request.post({
            url: 'https://people.googleapis.com/batch',
            method: 'POST',
            multipart: multipart,
            headers: {
              'Authorization': authHeader.Authorization,
              'content-type': 'multipart/mixed'
            }
          })
    
          const result = extractJSON(responseString)
          confirmed = confirmed.concat(result)
    
          counter ++
    
        } while ( contacts.length > 0 )
    
      } catch (ex) {
    
        // Handling exception here
      }
    
      return confirmed
    }
    

    【讨论】:

      【解决方案2】:

      简短回答:不。

      但是,您可以在请求中使用 quotaUser 查询参数来防止速率限制。

      • 允许您从服务器端应用程序强制执行每个用户的配额,甚至 在用户的 IP 地址未知的情况下。这可能发生,因为 例如,对于在 App Engine 上运行 cron 作业的应用程序 代表用户。
      • 您可以选择任何唯一的字符串 标识用户,但限制为 40 个字符。

      我一直在使用 People API 进行新的开发。似乎非常有限,例如联系人搜索甚至还不可用。我会保留 Contacts API/GData 以提供新 API 中尚不可用的功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多