0

나는 Visual Studio (VB)에서 향후 5 분 내에 발생하는 모든 이벤트에 대해 사용자 Google 캘린더를 폴링하는 Windows 서비스 응용 프로그램을 작성 중입니다.Windows 서비스에서 Google 캘린더 API에 액세스하기

이상하게도 서비스에 자격 증명을 생성하고 싶지만 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 

거의 같은 내 콘솔 응용 프로그램 코드 (입니다 : 여기

내 Windows 서비스 코드 (내 콘솔 응용 프로그램을 실행하고 내 캘린더에 대한 액세스를 허용 한 후이이 시간 동안 완벽하게 잘 작동)입니다 위와 같이) :

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

이 도움이되는지 확실하지 않지만 [.NET 빠른 시작]을 체크 한 (https://developers.google.com/google-apps/calendar/quickstart/dotnet)? – noogui

+0

. NET 퀵 스타트 다음에 나에게이 점을주었습니다. 코드는 기본적으로 CSharp에서 VB로 변환 된 가이드에서 직접 나온 것입니다. – JonW

+0

서비스 계정을 사용해야한다고 생각합니다. https://developers.google.com/identity/protocols/OAuth2#serviceaccount –

답변

0

사용자 계정 대신 서비스 계정을 사용하여 이제 작동 중입니다. 자격증 명 생성 또는 토큰 새로 고침을 처리 할 필요가 없습니다.

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 
    }) 
관련 문제