从Windows服务访问Google Calendar API

时间:2017-09-25 13:28:40

标签: vb.net google-api windows-services google-calendar-api google-api-dotnet-client

我正在Visual Studio(VB)中编写一个Windows服务应用程序,用于轮询用户谷歌日历,查看在接下来的5分钟内发生的任何事件。

理想情况下,我希望我的服务能够生成凭据,但我不认为Windows服务会弹出浏览器页面来验证某人。目前,我正在从可以弹出浏览器的控制台应用程序生成特定位置的凭据,并让服务在该位置查找凭据。我想完全摆脱控制台应用程序,但如果有必要,我将在安装该服务的批处理文件中运行它。

我遇到的一个重大问题是生成凭据文件(次要问题),更重要的是刷新它,以便它在一小时后不会过期(主要问题)。

这是我的Windows服务代码(这在我运行我的控制台应用程序并允许访问我的日历后的一小时内工作得很好):

Dim Scopes As String() = {CalendarService.Scope.CalendarReadonly}
Dim ApplicationName As String = "Google Calendar API .NET Quickstart"

Private Sub writeUpdateTimerEvent(source As Object, e As ElapsedEventArgs)

    Dim credential As UserCredential

    Try

        Using stream = New FileStream("FILE PATH TO client_secret.json", FileMode.Open, FileAccess.Read)

            Dim credPath As String = "FILE PATH TO WHERE MY CONSOLE APP IS STORING THE CREDENTIALS FILE"
            credPath = Path.Combine(credPath, ".credentials/calendar-dotnet-quickstart.json")

            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, New FileDataStore(credPath, True)).Result

            If credential Is Nothing Then
                credential.RefreshTokenAsync(CancellationToken.None)
            End If

        End Using

        ' Create Google Calendar API service.
        Dim service = New CalendarService(New BaseClientService.Initializer() With {
            .HttpClientInitializer = credential,
            .ApplicationName = ApplicationName
        })

        ' Define parameters of request.
        Dim request As EventsResource.ListRequest = service.Events.List("primary")
        request.TimeMin = DateTime.Now
        request.TimeMax = DateTime.Now.AddMinutes(5)
        request.ShowDeleted = False
        request.SingleEvents = True
        request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime

        ' List events.
        Dim eventsString As String = ""
        Dim events As Events = request.Execute()

        If events.Items IsNot Nothing AndAlso events.Items.Count > 0 Then
            'This is where I do my operations on events occuring in the next 5 minutes
            EventLog1.WriteEntry("Event occuring within 5 minutes")
        Else
            EventLog1.WriteEntry("No event occuring within 5 minutes")
        End If
    Catch ex As Exception
        EventLog1.WriteEntry("error grabbing events." & Environment.NewLine & ex.message)
    End Try
End Sub

这是我的控制台应用程序代码(与上面几乎相同):

Module Module1

Dim Scopes As String() = {CalendarService.Scope.CalendarReadonly}
Dim ApplicationName As String = "Google Calendar API .NET Quickstart"

Sub Main()
    Dim credential As UserCredential

    Using stream = New FileStream("client_secret.json", FileMode.Open, FileAccess.Read)
        Dim credPath As String = "SAME FILE PATH AS IN MY SERVICE"
        credPath = Path.Combine(credPath, ".credentials/calendar-dotnet-quickstart.json")

        credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, New FileDataStore(credPath, True)).Result
        Console.WriteLine(Convert.ToString("Credential file saved to: ") & credPath)
    End Using

    ' Create Google Calendar API service.
    Dim service = New CalendarService(New BaseClientService.Initializer() With {
            .HttpClientInitializer = credential,
            .ApplicationName = ApplicationName
        })

    ' Define parameters of request.
    Dim request As EventsResource.ListRequest = service.Events.List("primary")
    request.TimeMin = DateTime.Now
    request.ShowDeleted = False
    request.SingleEvents = True
    request.MaxResults = 10
    request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime

    ' List events.
    Dim events As Events = request.Execute()
    Console.WriteLine("Upcoming events:")
    If events.Items IsNot Nothing AndAlso events.Items.Count > 0 Then
        For Each eventItem As Object In events.Items
            Dim [when] As String = eventItem.Start.DateTime.ToString()
            If [String].IsNullOrEmpty([when]) Then
                [when] = eventItem.Start.[Date]
            End If
            Console.WriteLine("{0} ({1})", eventItem.Summary, [when])
        Next
        Console.WriteLine("You may now close this window.")
        System.Environment.Exit(0)
    Else
        Console.WriteLine("No upcoming events found.")
    End If
    Console.Read()

End Sub

End Module

1 个答案:

答案 0 :(得分:0)

现在使用服务帐户而不是用户帐户。无需处理生成凭据或刷新令牌。

Etc/GMT