Henkjan 2 Ответов: 3

Создание проблемы события с Google calendar API v3


Я застрял на документации google calendar API v3.
Я действительно получаю события, созданные внутри веб-интерфейса google calendar, но как только я пытаюсь поместить новое событие в календарь через свой проект .net, я получаю ошибку:
Недостаточное Разрешение [403]

Ошибки [

Сообщение[недостаточное разрешение] местоположение[ - ] причина[недостаточные разрешения] Домен[глобальный]

]
Hope somebody could help solving this error! In my opinion the documentation and also the vb.net examples are not giving any solution.


Что я уже пробовал:

<pre>Imports Google.Apis.Auth.OAuth2
Imports Google.Apis.Calendar.v3
Imports Google.Apis.Calendar.v3.Data
Imports Google.Apis.Calendar.v3.EventsResource
Imports Google.Apis.Services
Imports Google.Apis.Util.Store
Imports System
Imports System.IO
Imports System.Linq
Imports System.Text
Imports System.Threading
Imports System.Threading.Tasks
Imports System.Windows.Forms
Imports System.Collections.Generic
Imports Calendar

Public Class Form1
    Shared Scopes As String() = {CalendarService.Scope.CalendarReadonly}

    Shared ApplicationName As String = "Google Calendar API .NET Quickstart"
    Dim m_appointments As New List(Of Appointment)

   
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim credential As UserCredential
        Using stream = New FileStream("client_secret.json", FileMode.Open, FileAccess.Read)
            Dim credPath As String = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)
            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("Credential file saved to: " & credPath)
        End Using

        Dim service = New CalendarService(New BaseClientService.Initializer() With {.HttpClientInitializer = credential, .ApplicationName = ApplicationName})
        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
        Dim events As Events = request.Execute()
        If events.Items IsNot Nothing AndAlso events.Items.Count > 0 Then
            For Each [Event] In events.Items
                Dim app As New Appointment
                app.StartDate = [Event].Start.DateTime
                app.EndDate = [Event].End.DateTime
                app.Title = [Event].Summary
                m_appointments.Add(app)
            Next
        Else
        End If
        DayView2.AllowNew = True
        DayView2.StartDate = Now
    End Sub


    Private Sub DayView2_Click(sender As Object, e As EventArgs) Handles DayView2.Click
        'Create NEW event in dayview
        Dim credential As UserCredential
        Using stream = New FileStream("client_secret.json", FileMode.Open, FileAccess.Read)
            Dim credPath As String = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)
            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
        End Using
        Dim service = New CalendarService(New BaseClientService.Initializer() With {.HttpClientInitializer = credential, .ApplicationName = ApplicationName})
        Dim CalendarEvent As New Google.Apis.Calendar.v3.Data.Event
        Dim request As EventsResource.InsertRequest
        Dim StartDateTime As New Google.Apis.Calendar.v3.Data.EventDateTime
        Dim enddatetime As New Google.Apis.Calendar.v3.Data.EventDateTime
        Dim A As Date = "16/01/2018 13:00"
        StartDateTime.DateTime = A
        Dim B As Date = "16/01/2018 14:00"
        enddatetime.DateTime = B
        CalendarEvent.Start = StartDateTime
        CalendarEvent.End = enddatetime
        CalendarEvent.Id = System.Guid.NewGuid.ToString
        CalendarEvent.ICalUID = CalendarEvent.Id
        CalendarEvent.Summary = "Test"
        service.Events.Insert(CalendarEvent, "primary").Execute()
    End Sub
End Class

3 Ответов

Рейтинг:
2

Henkjan 2

После долгих испытаний я обнаружил, что эта ошибка в основном решается путем установки правильного идентификатора календаря для календаря google. Поскольку google calendar использует либо идентификатор, такой как ваш адрес gmail, либо если у вас есть несколько календарей, синхронизированных внутри вашего календаря google, идентификатор календаря вызывается после списка различных идентификаторов.

Основной причиной в моем коде было использование заглавной буквы внутри слова "первичный". Похоже, что идентификатор календаря google чувствителен к капиталу! Это решило половину моего кода. Если вы получите сигнал тревоги 404 со всем отработанным должным образом. Вы должны сначала посмотреть после объявления слова "первичный" без заглавных букв.

Потом я присмотрел код 403. Это было вызвано EVENT_ID из календаря google.

В нескольких примерах everybode говорит вам, что вам нужно использовать:

system.GUID.Newguide.tostring


Если вы посмотрите документацию google.calendar.API.v3, то увидите, что eventID должен быть уникальным идентификатором от 5 до 32 символов/цифр. Системы.идентификатор GUID.newguide.tostring даст вам идентификатор с 32 символами, но сделает последовательности xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx.
Единственное, что вам нужно сделать, прежде чем идентификатор события будет принят Google Calendar без предоставления вам ошибки, - это:
System.Guid.NewGuid.ToString.Replace("-", "")


Надеюсь, это поможет всем, кто также хочет работать с Google Calendar API в vb.net


Рейтинг:
0

Graeme_Grant

Это должно помочь объяснить ошибки: Обработка ошибок API  |  API календаря  |  Разработчики Google[^]

Как вы можете видеть из приведенной выше ссылки на документацию, информация об ошибке находится в теле ответа.

Также проверьте внутреннее исключение для исключения webexception бросается, как там, как правило, более детальную информацию.


Рейтинг:
0

ManikandanChennai

Я сделал это, работая с нижеприведенными шагами:

Шаг 1

Shared Scopes As String() = {CalendarService.Scope.CalendarReadonly}
Заменить строку с
Shared Scopes As String() = {CalendarService.Scope.Calendar}

Шаг 2
CalendarEvent.Id = System.Guid.NewGuid.ToString
CalendarEvent.ICalUID = CalendarEvent.Id
Закомментировал первую строку, а затем изменил вторую строку следующим образом
CalendarEvent.ICalUID = "112233" 'Ofcourse you may try to use the NewGuid here


Nelek

Вы заметили, что этому вопросу уже больше 7 месяцев?

ManikandanChennai

Да. Но никто не ответил, чтобы закончить. Поэтому я и ответил. Это может помочь кому - то в будущем.

Henkjan 2

Всем Привет. Я решил проблему с API. Проблема заключалась в UID, который google автоматически присваивает этому элементу.
Всем спасибо за помощь!

Member 13929434

Хенкян, пожалуйста, расскажите нам, как вы решили эту проблему. Что именно вы сделали, чтобы преодолеть эту проблему?
Спасибо.

ManikandanChennai

Я четко объяснил, что я сделал... следуйте шагам 1 и 2.