2015-04-25 1 views
1

J'ai cherché sur le Web la solution mais il semble que je sois la seule à ne pas avoir pu résoudre ce problème.La bibliothèque cliente Python pour l'API Google Calendar v3 insère l'événement "Missing fin time" erreur

Donc, c'est ce que mon code python ressemble:

class ReminderDate(object): 
    def __init__(self, datetimestring, timezone="Australia/Sydney"): 
     self.dateTime = datetimestring 
     self.timeZone = timezone 
class ReminderFormat(object): 
    def __init__(self, useDefault=False): 
     self.useDefault = useDefault 
     self.overrides = [{"method":"email", "minutes":15}] 
class ReminderData(object): 
    def __init__(self, reminder, datefrom=None, dateto=None, datevalue=None): 
     self.summary = reminder 
     self.start = ReminderDate(datefrom) 
     self.end = ReminderDate(dateto) 
     self.reminders = ReminderFormat() 

def save_event_to_google_calendar(self, reminder_data): 
     credentials = self.get_credentials() 
     service = build('calendar', 'v3', http=credentials.authorize(Http())) 
     event = json.dumps(reminder_data, default=lambda o: o.__dict__) 
     print (event) 
     created_event = service.events().insert(calendarId=CALENDAR_ID, body=str(event), sendNotifications=True).execute() 
     pp.pprint(created_event) 

Et il produit donc l'impression (événement) produit un JSON comme ci-dessous:

{"start": {"timeZone": "Australia/Sydney", 
      "dateTime": "2015-04-26T18:45:00+10:00"}, 
"end": {"timeZone": "Australia/Sydney", 
     "dateTime": "2015-04-26T19:00:00.000+10:00"}, 
"reminders": {"overrides": [{"minutes": 15, "method": "email"}], 
       "useDefault": false}, 
"summary": "do grocery shopping"} 

et je reçois l'erreur suivante:

File "/usr/local/lib/python2.7/dist-packages/googleapiclient/http.py", line 729, in execute 
     raise HttpError(resp, content, uri=self.uri) 
    googleapiclient.errors.HttpError: 
<HttpError 400 when requesting https://www.googleapis.com/calendar/v3/calendars/myemail%40gmail.com/events?alt=json&sendNotifications=true 
returned "Missing end time."> 

Je ne comprends pas. J'ai la "fin" du temps dans le json. Alors qu'est-ce qui me manque ici?

J'ai essayé d'afficher le même fichier json via la console de développeur google https://developers.google.com/google-apps/calendar/v3/reference/events/insert et cela fonctionne. mais il échoue à la bibliothèque client Python :((décrit ci-dessus)


[EDIT] Solution trouvée

La question était que j'avais converti objet Python à JSON "string" et c'est ce que J'approvisionnait par opposition à JSON « objet » attendu par l'API c'est donc le bon code.

json_event = json.loads(event) 
created_event = service.events().insert(calendarId=CALENDAR_ID, body=json_event, sendNotifications=True).execute() 
+0

Etes-vous sûr de passer un 'timeZone'? Il n'y a pas une telle valeur dans l'exemple d'API. – soon

+0

J'ai essayé les deux (avec et sans timeZone) .. le résultat était le même. En outre, même si l'exemple ne montre pas qu'il est dans l'API en tant que propriété facultative. –

Répondre

2

Essayez d'ajouter:

httplib2.debuglevel = 4 

juste avant l'appel API. Cela vous permettra de voir le corps exact que la requête events.insert() envoie. Comparez cela au corps produit par l'explorateur API et vous devriez avoir votre réponse.

+0

@JeyLee Merci beaucoup (et très astucieux moyen de me diriger vers la bonne direction). Donc, fondamentalement, le problème était (au cas où quelqu'un se poserait la question) que j'avais converti Python Object en JSON "string" et c'est ce que je fournissais par opposition à JSON "object" attendu par l'API. C'était donc la solution: 'json_event = json.loads (event) created_event = service.events() insérer (calendarId = CALENDAR_ID, corps = json_event, sendNotifications = True) .Execute()' –

+0

C'était. une grande aide pour moi. Dans mon cas, je réutilisais une variable que j'utilisais pour construire ma requête, et je pouvais voir la valeur incorrecte dans la requête en utilisant cette solution – Grezzo