Aug-17-2019, 07:32 PM
Hi guys,
I am trying to update a Google contact using People API. Unfortunately I am getting an error:
Invalid JSON payload received. Unknown name "": Root element must be a message.
when executing the request.
Anyone has any clue how can I resolve it? The JSON itself seems to be OK because I used https://developers.google.com/people/api...ateContact to test it, got 200 response and the contact was modified.
I am trying to update a Google contact using People API. Unfortunately I am getting an error:
Invalid JSON payload received. Unknown name "": Root element must be a message.
when executing the request.
Anyone has any clue how can I resolve it? The JSON itself seems to be OK because I used https://developers.google.com/people/api...ateContact to test it, got 200 response and the contact was modified.
from __future__ import print_function import pickle import os.path from googleapiclient.discovery import build from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request # If modifying these scopes, delete the file token.pickle. SCOPES = ['https://www.googleapis.com/auth/contacts'] def modifyContact(service, resourceName, JSON): print (JSON) service.people().updateContact(resourceName=resourceName, updatePersonFields='phoneNumbers', body=JSON).execute() def buildJSON(phoneNumbers, etag): JSON = "" for x in range(0, len(phoneNumbers)): if phoneNumbers[x].get('type') == 'mobile': if phoneNumbers[x].get('value').find('+48') != -1: oldNUmber = phoneNumbers[x].get('value') newNumber = phoneNumbers[x].get('value')[3:] JSON += """ { "type": "mobile", "value": "%s" }, { "type": "mobile", "value": "%s" }, """ % (oldNUmber, newNumber) else: JSON += """ { "type": "mobile", "value": "%s" }, """ % (phoneNumbers[x].get('value')) else: JSON += """ { "type": "%s", "value": "%s" }, """ % (phoneNumbers[x].get('type'), phoneNumbers[x].get('value')) # remove last whitespaces + character which is exceeding comma JSON = JSON.rstrip()[:-1] JSON = """ "phoneNumbers": [ %s ], "etag": "%s" """ % (JSON, etag) #print (JSON) return JSON def main(): creds = None # The file token.pickle stores the user's access and refresh tokens, and is # created automatically when the authorization flow completes for the first # time. if os.path.exists('token.pickle'): with open('token.pickle', 'rb') as token: creds = pickle.load(token) # If there are no (valid) credentials available, let the user log in. if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file( 'credentials.json', SCOPES) creds = flow.run_local_server(port=0) # Save the credentials for the next run with open('token.pickle', 'wb') as token: pickle.dump(creds, token) service = build('people', 'v1', credentials=creds) # Call the People API print('List 10 connection names') results = service.people().connections().list( resourceName='people/me', pageSize=1000, personFields='names,phoneNumbers').execute() connections = results.get('connections', []) for person in connections: names = person.get('names', []) phoneNumbers = person.get('phoneNumbers', []) if names: name = names[0].get('givenName') if name == "testAPI": print(name) print (person.get('etag')) print (person.get('resourceName')) if phoneNumbers: JSON = buildJSON(phoneNumbers, person.get('etag')) modifyContact(service, person.get('resourceName'), JSON) #print (phoneNumbers[x].get('value')) print (person) if __name__ == '__main__': main()