0

Je vous écris une application de service Windows dans Visual Studio (VB) qui interroge un utilisateur de Google Agenda pour tous les événements qui se produisent au cours des 5 prochaines minutes.acessing Google Calendar API de Windows Services

Idéalement, je voudrais mon service pour générer les informations d'identification, mais je ne pense pas qu'un service Windows peut apparaître une page du navigateur pour authentifier une personne. Actuellement, je génère les informations d'identification dans un emplacement spécifique à partir d'une application de console qui peut afficher un navigateur et demander au service de rechercher des informations d'identification dans cet emplacement. Je voudrais me débarrasser complètement de l'application console, mais si c'est nécessaire, je vais l'exécuter dans le fichier batch qui installe le service.

Le grand problème que je vais avoir génère les informations d'identification fichier (préoccupation secondaire), et plus important encore rafraîchissant il n'expire après une heure (principale préoccupation).

Voici mon windows code de service (cela fonctionne parfaitement bien pour l'heure après que je lance mon application console et permettre l'accès à mon calendrier):

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 

Voici mon code de l'application de la console (à peu près la même comme ci-dessus):

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 
+0

Je ne sais pas si cela aide, mais avez-vous vérifié [Quickstart .NET] (https://developers.google.com/google-apps/calendar/quickstart/dotnet)? – noogui

+0

Voici le .NET Quickstart est ce qui m'a à ce point, mon code est essentiellement directement à partir de ce guide, converti de CSharp à VB. – JonW

+0

Je crois que vous devriez utiliser un compte de service. https://developers.google.com/identity/protocols/OAuth2#serviceaccount –

Répondre

0

Cela a fonctionné maintenant, en utilisant un compte de service au lieu d'un compte d'utilisateur. Pas besoin de gérer les informations d'identification ou d'actualiser le jeton.

Dim serviceAccountEmail As [String] = ConfigurationManager.AppSettings("ServiceAcct") 

Dim certificate = New X509Certificate2("key.p12", "notasecret", X509KeyStorageFlags.Exportable) 


Dim credential1 As New ServiceAccountCredential(New ServiceAccountCredential.Initializer(serviceAccountEmail) With { 
     .Scopes = Scopes 
    }.FromCertificate(certificate)) 


Dim service = New CalendarService(New BaseClientService.Initializer() With { 
     .HttpClientInitializer = credential1, 
     .ApplicationName = ApplicationName 
    })