2

解決策をウェブで検索しましたが、この問題を解決できなかったのは私だけのようです。

だから、これは私のpythonコードがどのように見えるかです:

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)

そして、それが生成するため、print(event) は以下のような json を出力します。

{"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"}

次のエラーが表示されます。

    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.">

理解できない。私はjsonに「終了」時間を持っています。次に、ここで何が欠けていますか?

Google 開発者コンソールhttps://developers.google.com/google-apps/calendar/v3/reference/events/insertを介して同じ json を投稿しようとしましたが、動作します。しかし、それはpythonクライアントライブラリから失敗します:((上記で説明)


[編集] 解決策が見つかりました

問題は、Python オブジェクトを JSON の「文字列」に変換したことであり、API が期待する JSON の「オブジェクト」ではなく、それを提供していました。したがって、これは正しいコードです:

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

1 に答える 1

3

追加してみてください:

httplib2.debuglevel = 4

API 呼び出しの直前。これにより、events.insert() リクエストが送信している正確な本文を確認できます。それを API エクスプローラーによって生成された本体と比較すると、答えが得られるはずです。

于 2015-04-25T14:23:38.213 に答える