Google Kalender ist ein Planungsdienst, mit dem Sie Ereignisse wie Besprechungen erstellen und verfolgen können. Sie können die Ereignisse im Kalender protokollieren und Erinnerungen an die bevorstehenden erhalten. Google ermöglicht es Ihnen auch, seinen Kalenderdienst programmgesteuert zu verwenden. So können Sie Ihre Termine mit Google Kalender aus Ihren Anwendungen heraus verwalten. In diesem Artikel erfahren Sie, wie Sie Google Kalender programmgesteuert in C# erstellen, aktualisieren und löschen.
- .NET-API zum Erstellen und Bearbeiten von Google Kalender
- Erstellen Sie einen Google-Kalender in C#
- Aktualisieren Sie einen Google-Kalender in C#
- Löschen Sie einen Google-Kalender in C#
C# .NET API zum Erstellen und Bearbeiten von Google Kalender
Um mit dem Google Kalender-Dienst zu arbeiten, verwenden wir Aspose.Email for .NET. Es ist eine leistungsstarke API, die eine Reihe von Funktionen für die Verarbeitung von E-Mails, die Arbeit mit E-Mail-Clients und die Nutzung der Zusammenarbeitsdienste von Google bietet. Sie können die DLL der API entweder herunterladen oder sie mit dem folgenden Befehl von NuGet installieren.
PM> Install-Package Aspose.Email
Bevor Sie mit der Arbeit beginnen, müssen Sie ein Projekt in der Google Developer Console erstellen, das Ihrer Anwendung die Kommunikation mit Google-Diensten ermöglicht. Um eine zu erstellen, können Sie dieser Anleitung folgen.
Um auf Google Kalender zuzugreifen und ihn zu manipulieren, müssen wir Code schreiben, um die Informationen des Benutzers zu verarbeiten und die Authentifizierung durchzuführen. Für den Google-Benutzer erstellen wir zuerst eine Klasse namens TestUser und erben sie dann von der GoogleUser-Klasse. Das Folgende ist die vollständige Implementierung beider Klassen.
using System;
namespace Aspose.Email
{
internal enum GrantTypes
{
authorization_code,
refresh_token
}
public class TestUser
{
internal TestUser(string name, string eMail, string password, string domain)
{
Name = name;
EMail = eMail;
Password = password;
Domain = domain;
}
public readonly string Name;
public readonly string EMail;
public readonly string Password;
public readonly string Domain;
public static bool operator ==(TestUser x, TestUser y)
{
if ((object)x != null)
return x.Equals(y);
if ((object)y != null)
return y.Equals(x);
return true;
}
public static bool operator !=(TestUser x, TestUser y)
{
return !(x == y);
}
public static implicit operator string(TestUser user)
{
return user == null ? null : user.Name;
}
public override int GetHashCode()
{
return ToString().GetHashCode();
}
public override bool Equals(object obj)
{
return obj != null && obj is TestUser && this.ToString().Equals(obj.ToString(), StringComparison.OrdinalIgnoreCase);
}
public override string ToString()
{
return string.IsNullOrEmpty(Domain) ? Name : string.Format("{0}/{1}", Domain, Name);
}
}
public class GoogleUser : TestUser
{
public GoogleUser(string name, string eMail, string password)
: this(name, eMail, password, null, null, null)
{ }
public GoogleUser(string name, string eMail, string password, string clientId, string clientSecret)
: this(name, eMail, password, clientId, clientSecret, null)
{ }
public GoogleUser(string name, string eMail, string password, string clientId, string clientSecret, string refreshToken)
: base(name, eMail, password, "gmail.com")
{
ClientId = clientId;
ClientSecret = clientSecret;
RefreshToken = refreshToken;
}
public readonly string ClientId;
public readonly string ClientSecret;
public readonly string RefreshToken;
}
}
Jetzt müssen wir eine Hilfsklasse erstellen, die sich um die Authentifizierung eines Google-Kontos kümmert. Wir nennen diese Klasse GoogleOAuthHelper. Das Folgende ist die vollständige Implementierung dieser Klasse.
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace Aspose.Email
{
internal class GoogleOAuthHelper
{
public const string TOKEN_REQUEST_URL = "https://accounts.google.com/o/oauth2/token";
public const string SCOPE = "https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar" + "+" + "https%3A%2F%2Fwww.google.com%2Fm8%2Ffeeds%2F" + "+" + "https%3A%2F%2Fmail.google.com%2F"; // IMAP & SMTP
public const string REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
public const string REDIRECT_TYPE = "code";
internal static string GetAccessToken(TestUser user)
{
return GetAccessToken((GoogleUser)user);
}
internal static string GetAccessToken(GoogleUser user)
{
string access_token;
string token_type;
int expires_in;
GetAccessToken(user, out access_token, out token_type, out expires_in);
return access_token;
}
internal static void GetAccessToken(GoogleUser user, out string access_token, out string token_type, out int expires_in)
{
access_token = null;
token_type = null;
expires_in = 0;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(TOKEN_REQUEST_URL);
request.CookieContainer = new CookieContainer();
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
string encodedParameters = string.Format("client_id={0}&client_secret={1}&refresh_token={2}&grant_type={3}",
System.Web.HttpUtility.UrlEncode(user.ClientId), System.Web.HttpUtility.UrlEncode(user.ClientSecret), System.Web.HttpUtility.UrlEncode(user.RefreshToken), System.Web.HttpUtility.UrlEncode(GrantTypes.refresh_token.ToString()));
byte[] requestData = Encoding.UTF8.GetBytes(encodedParameters);
request.ContentLength = requestData.Length;
if (requestData.Length > 0)
using (Stream stream = request.GetRequestStream())
stream.Write(requestData, 0, requestData.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string responseText = null;
using (TextReader reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
responseText = reader.ReadToEnd();
foreach (string sPair in responseText.Replace("{", "").Replace("}", "").Replace("\"", "").Split(new string[] { ",\n" }, StringSplitOptions.None))
{
string[] pair = sPair.Split(':');
string name = pair[0].Trim().ToLower();
string value = System.Web.HttpUtility.UrlDecode(pair[1].Trim());
switch (name)
{
case "access_token":
access_token = value;
break;
case "token_type":
token_type = value;
break;
case "expires_in":
expires_in = Convert.ToInt32(value);
break;
}
}
Debug.WriteLine("");
Debug.WriteLine("---------------------------------------------------------");
Debug.WriteLine("-----------OAuth 2.0 authorization information-----------");
Debug.WriteLine("---------------------------------------------------------");
Debug.WriteLine(string.Format("Login: '{0}'", user.EMail));
Debug.WriteLine(string.Format("Access token: '{0}'", access_token));
Debug.WriteLine(string.Format("Token type: '{0}'", token_type));
Debug.WriteLine(string.Format("Expires in: '{0}'", expires_in));
Debug.WriteLine("---------------------------------------------------------");
Debug.WriteLine("");
}
internal static void GetAccessToken(TestUser user, out string access_token, out string refresh_token)
{
GetAccessToken((GoogleUser)user, out access_token, out refresh_token);
}
internal static void GetAccessToken(GoogleUser user, out string access_token, out string refresh_token)
{
string token_type;
int expires_in;
GoogleOAuthHelper.GetAccessToken(user, out access_token, out refresh_token, out token_type, out expires_in);
}
internal static void GetAccessToken(TestUser user, out string access_token, out string refresh_token, out string token_type, out int expires_in)
{
GetAccessToken((GoogleUser)user, out access_token, out refresh_token, out token_type, out expires_in);
}
internal static void GetAccessToken(GoogleUser user, out string access_token, out string refresh_token, out string token_type, out int expires_in)
{
string authorizationCode = GoogleOAuthHelper.GetAuthorizationCode(user, GoogleOAuthHelper.SCOPE, GoogleOAuthHelper.REDIRECT_URI, GoogleOAuthHelper.REDIRECT_TYPE);
GoogleOAuthHelper.GetAccessToken(authorizationCode, user, out access_token, out token_type, out expires_in, out refresh_token);
}
internal static void GetAccessToken(string authorizationCode, TestUser user, out string access_token, out string token_type, out int expires_in, out string refresh_token)
{
GetAccessToken(authorizationCode, (GoogleUser)user, out access_token, out token_type, out expires_in, out refresh_token);
}
internal static void GetAccessToken(string authorizationCode, GoogleUser user, out string access_token, out string token_type, out int expires_in, out string refresh_token)
{
access_token = null;
token_type = null;
expires_in = 0;
refresh_token = null;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(TOKEN_REQUEST_URL);
request.CookieContainer = new CookieContainer();
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
string encodedParameters = string.Format("client_id={0}&code={1}&client_secret={2}&redirect_uri={3}&grant_type={4}", System.Web.HttpUtility.UrlEncode(user.ClientId), System.Web.HttpUtility.UrlEncode(authorizationCode), System.Web.HttpUtility.UrlEncode(user.ClientSecret), System.Web.HttpUtility.UrlEncode(REDIRECT_URI), System.Web.HttpUtility.UrlEncode(GrantTypes.authorization_code.ToString()));
byte[] requestData = Encoding.UTF8.GetBytes(encodedParameters);
request.ContentLength = requestData.Length;
if (requestData.Length > 0)
using (Stream stream = request.GetRequestStream())
stream.Write(requestData, 0, requestData.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string responseText = null;
using (TextReader reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
responseText = reader.ReadToEnd();
foreach (string sPair in responseText.Replace("{", "").Replace("}", "").Replace("\"", "").Split(new string[] { ",\n" }, StringSplitOptions.None))
{
string[] pair = sPair.Split(':');
string name = pair[0].Trim().ToLower();
string value = System.Web.HttpUtility.UrlDecode(pair[1].Trim());
switch (name)
{
case "access_token":
access_token = value;
break;
case "token_type":
token_type = value;
break;
case "expires_in":
expires_in = Convert.ToInt32(value);
break;
case "refresh_token":
refresh_token = value;
break;
}
}
Debug.WriteLine(string.Format("Authorization code: '{0}'", authorizationCode));
Debug.WriteLine(string.Format("Access token: '{0}'", access_token));
Debug.WriteLine(string.Format("Refresh token: '{0}'", refresh_token));
Debug.WriteLine(string.Format("Token type: '{0}'", token_type));
Debug.WriteLine(string.Format("Expires in: '{0}'", expires_in));
Debug.WriteLine("---------------------------------------------------------");
Debug.WriteLine("");
}
internal static string GetAuthorizationCode(TestUser acc, string scope, string redirectUri, string responseType)
{
return GetAuthorizationCode((GoogleUser)acc, scope, redirectUri, responseType);
}
internal static string GetAuthorizationCode(GoogleUser acc, string scope, string redirectUri, string responseType)
{
Debug.WriteLine("");
Debug.WriteLine("---------------------------------------------------------");
Debug.WriteLine("-----------OAuth 2.0 authorization information-----------");
Debug.WriteLine("---------------------------------------------------------");
Debug.WriteLine(string.Format("Login: '{0}'", acc.EMail));
string authorizationCode = null;
string error = null;
string approveUrl = string.Format("https://accounts.google.com/o/oauth2/auth?redirect_uri={0}&response_type={1}&client_id={2}&scope={3}", redirectUri, responseType, acc.ClientId, scope);
AutoResetEvent are0 = new AutoResetEvent(false);
Thread t = new Thread(delegate ()
{
bool doEvents = true;
WebBrowser browser = new WebBrowser();
browser.AllowNavigation = true;
browser.DocumentCompleted += delegate (object sender, WebBrowserDocumentCompletedEventArgs e) { doEvents = false; };
Form f = new Form();
f.FormBorderStyle = FormBorderStyle.FixedToolWindow;
f.ShowInTaskbar = false;
f.StartPosition = FormStartPosition.Manual;
f.Location = new System.Drawing.Point(-2000, -2000);
f.Size = new System.Drawing.Size(1, 1);
f.Controls.Add(browser);
f.Load += delegate (object sender, EventArgs e)
{
try
{
browser.Navigate("https://accounts.google.com/Logout");
doEvents = true;
while (doEvents) Application.DoEvents();
browser.Navigate("https://accounts.google.com/ServiceLogin?sacu=1");
doEvents = true;
while (doEvents) Application.DoEvents();
HtmlElement loginForm = browser.Document.Forms["gaia_loginform"];
if (loginForm != null)
{
HtmlElement userName = browser.Document.All["Email"];
userName.SetAttribute("value", acc.EMail);
loginForm.InvokeMember("submit");
doEvents = true;
while (doEvents)
Application.DoEvents();
loginForm = browser.Document.Forms["gaia_loginform"];
HtmlElement passwd = browser.Document.All["Passwd"];
passwd.SetAttribute("value", acc.Password);
loginForm.InvokeMember("submit");
doEvents = true;
while (doEvents)
Application.DoEvents();
}
else
{
error = "Login form is not found in \n" + browser.Document.Body.InnerHtml;
return;
}
browser.Navigate(approveUrl);
doEvents = true;
while (doEvents) Application.DoEvents();
HtmlElement approveForm = browser.Document.Forms["connect-approve"];
if (approveForm != null)
{
HtmlElement submitAccess = browser.Document.All["submit_access"];
submitAccess.SetAttribute("value", "true");
approveForm.InvokeMember("submit");
doEvents = true;
while (doEvents)
Application.DoEvents();
}
else
{
error = "Approve form is not found in \n" + browser.Document.Body.InnerHtml;
return;
}
HtmlElement code = browser.Document.All["code"];
if (code != null)
authorizationCode = code.GetAttribute("value");
else
error = "Authorization code is not found in \n" + browser.Document.Body.InnerHtml;
}
catch (Exception ex)
{
error = ex.Message;
}
finally
{
f.Close();
}
};
Application.Run(f);
are0.Set();
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
are0.WaitOne();
if (error != null)
throw new Exception(error);
return authorizationCode;
}
}
}
Erstellen Sie einen Google-Kalender in C#
Sobald Sie die obige Konfiguration vorgenommen haben, können Sie mit der Arbeit mit dem Google Kalender-Dienst fortfahren. Im Folgenden sind die Schritte zum Erstellen und Aktualisieren eines Google-Kalenders in C# aufgeführt.
- Rufen Sie mithilfe der Methode GmailClient.GetInstance(String, String) eine Instanz der Klasse GmailClient in ein Objekt IGmailClient ab.
- Erstellen Sie eine Instanz der Klasse Calendar und initialisieren Sie sie mit Name, Beschreibung und anderen Eigenschaften.
- Rufen Sie die Methode IGmailClient.CreateCalendar(Calendar) auf, um den Google-Kalender zu erstellen.
- Rufen Sie die zurückgegebene ID des Kalenders ab.
Das folgende Codebeispiel zeigt, wie Sie einen Google-Kalender in C# erstellen.
// Initialisieren Sie den Google-Benutzer
GoogleUser User = new GoogleUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;
// Zugriffstoken erhalten
GoogleOAuthHelper.GetAccessToken(User, out accessToken, out refreshToken);
// Holen Sie sich eine Instanz des Gmail-Clients
using (IGmailClient client = GmailClient.GetInstance(accessToken, User.EMail))
{
// Kalender einfügen und abrufen
Aspose.Email.Clients.Google.Calendar calendar = new Aspose.Email.Clients.Google.Calendar("summary - " + Guid.NewGuid().ToString(), null, null, "America/Los_Angeles");
// Kalender einfügen und ID abrufen
string id = client.CreateCalendar(calendar);
Aspose.Email.Clients.Google.Calendar cal = client.FetchCalendar(id);
}
Aktualisieren Sie einen Google-Kalender in C#
Im Folgenden finden Sie die Schritte zum programmgesteuerten Aktualisieren eines Google-Kalenders in C#.
- Rufen Sie mithilfe der Methode GmailClient.GetInstance(String, String) eine Instanz der Klasse GmailClient in ein Objekt IGmailClient ab.
- Verwenden Sie die Methode IGmailClient.FetchCalendar(String), um die Kalenderinstanz anhand ihrer ID abzurufen.
- Aktualisieren Sie die Eigenschaften des Kalenders und rufen Sie die Methode IGmailClient.UpdateCalendar(Calendar) auf, um den Kalender zu aktualisieren.
Das folgende Codebeispiel zeigt, wie Sie einen Google-Kalender in C# aktualisieren.
// Holen Sie sich eine Instanz des Gmail-Clients
using (IGmailClient client = GmailClient.GetInstance(accessToken, User.EMail))
{
string id = "<<calendar ID>>";
// Kalender abrufen
Aspose.Email.Clients.Google.Calendar cal = client.FetchCalendar(id);
// Informationen im abgerufenen Kalender ändern und Kalender aktualisieren
cal.Description = "Description - " + Guid.NewGuid().ToString();
cal.Location = "Location - " + Guid.NewGuid().ToString();
// Kalender aktualisieren
client.UpdateCalendar(cal);
}
Löschen Sie einen Google-Kalender in C#
Sie können auch einen bestimmten Kalender mit Aspose.Email für .NET löschen. Im Folgenden sind die Schritte zum Ausführen dieses Vorgangs aufgeführt.
- Rufen Sie mithilfe der Methode GmailClient.GetInstance(String, String) eine Instanz der Klasse GmailClient in ein Objekt IGmailClient ab.
- Rufen Sie die Liste der Kalender mit der Methode IGmailClient.ListCalendars() ab.
- Durchlaufen Sie die Liste und filtern Sie die gewünschte.
- Löschen Sie den Kalender mit der Methode IGmailClient.DeleteCalendar(Calendar.Id).
Das folgende Codebeispiel zeigt, wie Sie einen Google-Kalender in C# löschen.
// Holen Sie sich eine Instanz des Gmail-Clients
using (IGmailClient client = GmailClient.GetInstance(accessToken, User.EMail))
{
// Kalender mit Zusammenfassung aufrufen und löschen, beginnend mit "Kalenderzusammenfassung - "
string summary = "Calendar summary - ";
// Kalenderliste abrufen
ExtendedCalendar[] lst0 = client.ListCalendars();
foreach (ExtendedCalendar extCal in lst0)
{
// Ausgewählte Kalender löschen
if (extCal.Summary.StartsWith(summary))
client.DeleteCalendar(extCal.Id);
}
}
Holen Sie sich eine kostenlose API-Lizenz
Sie können eine kostenlose temporäre Lizenz erhalten, um Aspose.Email für .NET ohne Evaluierungseinschränkungen zu verwenden.
Fazit
In diesem Artikel haben Sie gelernt, wie Sie Google Kalender programmgesteuert in C# erstellen. Außerdem haben Sie gesehen, wie Sie einen bestimmten Google-Kalender in C# aktualisieren und löschen. Außerdem können Sie die Dokumentation durchsuchen, um mehr über Aspose.Email für .NET zu erfahren. Sie können Ihre Fragen auch über unser Forum stellen.