获取访问令牌后如何读取用户的Google日历事件?

时间:2019-09-02 08:18:54

标签: python django google-api google-calendar-api google-api-python-client

我想在django中获取我的用户的google日历事件,我编写了以下代码。这段代码可以工作并保存用户的访问令牌,但是我不知道该怎么做才能获取用户的Google日历事件。 在此之前,我遇到了一些问题,并在this question中提出了问题,并试图解决它,现在我在这里。 有人能帮我吗?

在网址中:

url(r'^new_event/$', views.new_event, name="new_event"),
url(r'^oauth2_callback', OAuth2CallBack.as_view(), name='oauth2_callback'),
url(r'^access_to_google_calendar$', views.access_to_google_calendar, 
                         name="access_to_google_calendar"),

视图中:

def access_to_google_calendar(request):
    # Following line is for getting google calendar events of user to show him
    flow = OAuth2WebServerFlow(settings.CLIENT_ID_CALENDAR, 
                             settings.CLIENT_SECRET_CALENDAR,
                             scope='https://www.googleapis.com/auth/calendar',
                               redirect_uri=settings.REDIRECT_URI_CALENDAR)
    generated_url = flow.step1_get_authorize_url()
    return HttpResponseRedirect(generated_url)



class OAuth2CallBack(View):
    def get(self, request, *args, **kwargs):
        code = request.GET.get('code', False)
        if not code:
            return JsonResponse({'status': 'error, no access key received from Google or User declined permission!'})

        flow = OAuth2WebServerFlow(settings.CLIENT_ID_CALENDAR, settings.CLIENT_SECRET_CALENDAR,
                                   scope='https://www.googleapis.com/auth/calendar',
                                   redirect_uri=settings.REDIRECT_URI_CALENDAR)
        credentials = flow.step2_exchange(code)

        http = httplib2.Http()
        http = credentials.authorize(http)

        credentials_js = json.loads(credentials.to_json())
        access_token = credentials_js['access_token']
        # Store the access token in case we need it again!
        username = request.user.username
        with open('token.csv', 'w') as file:
            fieldnames = ['user', 'token']
            writer = csv.DictWriter(file, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerow({'user': username, 'token': access_token})

        request.session['access_token'] = access_token
        return redirect('new_event')

    def post(self, request, *args, **kwargs):
        return HttpResponseNotAllowed('Only GET requests!')



def new_event(request):
        # Here how to get google event of user?????

2 个答案:

答案 0 :(得分:0)

如果您查看Google日历的文档,则大多数方法都有示例代码。 events.list

page_token = None
while True:
  events = service.events().list(calendarId='primary', pageToken=page_token).execute()
  for event in events['items']:
    print event['summary']
  page_token = events.get('nextPageToken')
  if not page_token:
    break

答案 1 :(得分:0)

我终于找到了如何创建服务来获取Google日历事件仅具有访问令牌

首先,您应该获取之前保存的令牌(从csv文件或数据库或...在此保存在csv文件中)

token = get_from_any_where_you_saved_it_before

然后:(在这种情况下,第一行很重要)

credentials = client.AccessTokenCredentials(token, 'USER_AGENT')
service = build('calendar', 'v3', credentials=credentials)
google_calendar_events = service.events().list(calendarId='primary', singleEvents=True,
                                          orderBy='startTime').execute()
google_calendar_events = google_calendar_events.get('items', [])