我正在尝试使用 .NET 客户端 API V3 从我的 Google 日历中获取 FreeBusy 数据。
以下代码允许我使用服务身份验证登录并获取日历列表和日历设置。如图所示,我还可以获取事件。
为了完成这项工作,我与我的开发 ID 共享了我的日历:
<my-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);
}
}
}
但是,尝试获取空闲忙碌信息的代码总是会收到“错误请求”错误。
我已经检查了使用提琴手发送的请求,据我所知它是正确的。
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"}
谁能告诉我为什么我收到错误的请求错误,更重要的是如何解决它?
非常感谢
克里斯。