Google calendar api Google日历API V3 FreeBusy请求收到错误请求错误

Google calendar api Google日历API V3 FreeBusy请求收到错误请求错误,google-calendar-api,Google Calendar Api,我正在尝试使用.NET客户端API V3从我的Google日历获取忙/闲数据 下面的代码允许我使用服务身份验证登录并获取日历列表和日历设置。我还可以获取如图所示的事件 为了实现这一点,我已将日历与我的开发Id共享: @developer.gserviceaccount.com using System; using System.Collections.Generic; using System.Linq; using System.Text; using Google.Apis.Calenda

我正在尝试使用.NET客户端API V3从我的Google日历获取忙/闲数据

下面的代码允许我使用服务身份验证登录并获取日历列表和日历设置。我还可以获取如图所示的事件

为了实现这一点,我已将日历与我的开发Id共享:

@developer.gserviceaccount.com

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Google.Apis.Calendar;
using Google.Apis.Calendar.v3;
using Google.Apis.Authentication;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using DotNetOpenAuth.OAuth2;
using System.Diagnostics;
using Google.Apis.Calendar.v3.Data;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Discovery;
using Google.Apis.Drive.v2;
using Google.Apis.Util;

namespace consoleGoogleResearch
{
    class Program
    {
        private const string SERVICE_ACCOUNT_EMAIL = "<your-value>@developer.gserviceaccount.com";
        private const string SERVICE_ACCOUNT_PKCS12_FILE_PATH = @"<path-to\<your-value>-privatekey.p12";

        /// <summary>
        /// Build a Calendar service object authorized with the service account.
        /// </summary>
        /// <returns>Drive service object.</returns>
        static CalendarService BuildCalendarService()
        {
            AssertionFlowClient client = new AssertionFlowClient(
                GoogleAuthenticationServer.Description, new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret", X509KeyStorageFlags.Exportable))
            {
                Scope = CalendarService.Scopes.Calendar.GetStringValue(),
                ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
            };
            OAuth2Authenticator<AssertionFlowClient> authenticator = new OAuth2Authenticator<AssertionFlowClient>(client, AssertionFlowClient.GetState);
            return new CalendarService(authenticator);
        }

        public static void Main(string[] args)
        {
            var service = BuildCalendarService();

            // Get the calendar service
            Google.Apis.Calendar.v3.CalendarListResource.ListRequest clrq = service.CalendarList.List();
            var result = clrq.Fetch();

            // Prove we can get the settings.
            SettingsResource.ListRequest slr = service.Settings.List();
            var sr = slr.Fetch();

            try
            {
                Console.WriteLine("Calendars: ");
                foreach (CalendarListEntry calendar in result.Items)
                {
                    Console.WriteLine("{0}", calendar.Id);
                    Console.WriteLine("\tAppointments:");
                    Google.Apis.Calendar.v3.EventsResource.ListRequest elr = service.Events.List(calendar.Id);
                    var events = elr.Fetch();
                    if (events.Items != null)
                    {
                        foreach (Event e in events.Items)
                        {
                            Console.WriteLine("\tSummary: {0}, Location: {1}", e.Summary, e.Location);
                            if (e.IsAllDayEvent())
                            {
                                Console.WriteLine("\t\tAll Day: {0}", e.Start.GetDateTime().ToLongDateString());
                            }
                            else
                            {
                                Console.WriteLine("\t\tFrom: {0}", e.Start.GetDateTime());
                                Console.WriteLine("\t\tTo: {0}", e.End.GetDateTime());
                            }
                            if (e.Attendees != null)
                            {
                                foreach (var att in e.Attendees)
                                {
                                    Console.WriteLine("Attendee:\t\t\t{0}<{1}>", att.DisplayName, att.Email);
                                }
                            }
                            Console.WriteLine();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                log.DebugFormat("Error: {0}", ex.Message);
            }

            // Attempt to get free busy data.
            FreebusyResource.QueryRequest fbq = service.Freebusy.Query(new FreeBusyRequest());

            FreeBusyRequestItem c = new FreeBusyRequestItem();
            c.Id = "<your calendar id>";
            fbq.Body.Items = new List<FreeBusyRequestItem>();
            fbq.Body.Items.Add(c);
            fbq.Body.TimeZone = "Europe/London";
            fbq.Body.TimeMin = "2013-01-101T00:00:00.000Z";
            fbq.Body.TimeMax = "2013-01-301T00:00:00.000Z";

            // This call fails with global bad request
            var fbres = fbq.Fetch();

            Console.ReadKey();
        }
    }

    static internal class Extensions
    {
        static internal DateTime GetDateTime(this EventDateTime edt)
        {
            if (String.IsNullOrEmpty(edt.DateTime))
            {
                if (String.IsNullOrEmpty(edt.Date))
                {
                    return DateTime.MinValue;
                }
                else
                {
                    return DateTime.Parse(edt.Date);
                }
            }
            else
            {
                return DateTime.Parse(edt.DateTime);
            }
        }

        static internal Boolean IsAllDayEvent(this Event e)
        {
            return (e.Start.DateTime == null && e.Start.Date != null);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用Google.api.Calendar;
使用Google.api.Calendar.v3;
使用Google.api.Authentication;
使用Google.api.Authentication.OAuth2;
使用Google.api.Authentication.OAuth2.DotNetOpenAuth;
使用DotNetOpenAuth.OAuth2;
使用系统诊断;
使用Google.api.Calendar.v3.Data;
使用System.Security.Cryptography.X509证书;
使用Google.api.Discovery;
使用Google.api.Drive.v2;
使用Google.api.Util;
名称空间控制台日志搜索
{
班级计划
{
private const string SERVICE_ACCOUNT_EMAIL=“@developer.gserviceaccount.com”;

私有常量字符串服务\帐户\ PKCS12\文件\路径=@"答案在上面的评论中,我在日期上犯了一个错误。

最后我发现了我自己的错误。检查请求中的日期。timeMin 2013-01-101 timeMax 2013-01-301将这些更改为有效日期已将其修复。希望考虑到我花了多少时间才弄清楚如何使服务身份验证生效,此代码会对某人有用的,克里斯
POST https://www.googleapis.com/calendar/v3/freeBusy?alt=json&prettyPrint=true HTTP/1.1
Authorization: Bearer <removed>
Content-Type: application/json; charset=utf-8
User-Agent: ConsoleApplication1 google-api-dotnet-client/ Win32NT/6.1.7601.65536 (gzip)
Host: www.googleapis.com
Content-Length: 144
Accept-Encoding: gzip, deflate

{"items":[{"id":"apps.vivid@gmail.com"}],"timeMax":"2013-01-301T00:00:00.000Z","timeMin":"2013-01-101T00:00:00.000Z","timeZone":"Europe/London"}