带有ASP.NET的Google Calendar API

Don*_*nna 3 c# asp.net google-calendar-api

我对于使用Google Calendar API在ASP.NET网络表单(C#)中添加/修改事件感到困惑。

我不确定是否需要oAuth或什么。我的应用程序在我自己的服务器上,用于访问我自己的域和日历。我不需要其他用户给我访问他们的日历的权限;我只需要通过我的应用程序访问自己的应用程序即可。

我想在我的一个aspx页面上将事件信息发送到我的Google日历,以添加(或稍后修改)该事件。

我已经检查了各种代码示例和Google入门指南。我只是不清楚确切需要什么。我已经设置了API密钥和oAuth2客户端ID。Google的说明使我发了圈,这很可能是由于我需要澄清所需内容。

有人可以消除我的困惑并指出正确的方向吗?

Moh*_*hid 12

总结:

  • 呼叫Google Clould OAuth2受保护的资源

  • 从您的服务器到Google服务器

  • 没有用户交互

  • 访问自己的数据

  • 使用C#

代码:

    var private_key = @"-----BEGIN PRIVATE KEY-ccc-END PRIVATE KEY-----\n";
    string calanderId = @"xxxxxxxxxxxxx@group.calendar.google.com";
    var client_email = @"my-google-calender@xxx.iam.gserviceaccount.com";

    var credential =
        new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer(client_email)
        {
            Scopes = new string[] { CalendarService.Scope.Calendar }
        }.FromPrivateKey(private_key));
    var service = new CalendarService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
    });
Run Code Online (Sandbox Code Playgroud)
  • 使用服务方法获取数据

  • 可以从此链接生成私钥和client_email

  • 日历ID可以在calendar.google.com上找到

  • 您必须与client_email共享日历,请参见演示


  Google            You                             You
  Pay +             Pay +                           Pay +
  Google            Google                          You
  Manage            Manage                          Manage%
 +----------+    +----------+                     +----------+
 | Gmail    |    |          |                     |          |
 | Calendar |    |  G Suite |                     | Google   |
 | drive    |    |          |                     | Cloud    |
 |          |    |          |                     |          |
 +----^-----+    +----+-----+                     +------+---+
      |               ^                                  ^
      |               |                                  |
      |               |                                  |
      |               |                                  |
+-------------------------------------------------------------+
|     |               |                                  |    |
|     |               |                                  |    |
|     |               |       Google                     |    |
|     |               |       Oauth2                     |    |
|     |               |       Server                     |    |
|     |               |                                  |    |
|     |               |                                  |    |
+-------------------------------------------------------------+
      |               |                                  |
      |               |         +----------------+       |
      |               |         |                |       |
      |               |         |                |       | No
      |               |require  |                |       | Consent
      |               |admin    |                |       |
      |               |consent  |                |       |
      |require        |         |                +-------+
      |user           |         |                |
      |consent        +---------+   Your app     |
      |                         |                |
      |                         |                |
      |                         |                |
      |                         |                |
      +-------------------------+                |
                                |                |
                                |                |
                                |                |
                                +----------------+
                                     You
                                     Pay +
                                     You
                                     Manage
Run Code Online (Sandbox Code Playgroud)

逐步演示


步骤01:打开Goog​​le控制台

https://console.developers.google.com/projectselector/apis/library/calendar-json.googleapis.com

步骤02:单击选择

在此处输入图片说明

步骤03:选择或创建一个新项目

在此处输入图片说明

步骤04:单击启用或管理

在此处输入图片说明 在此处输入图片说明

步骤05:单击凭据

在此处输入图片说明

步骤06:创建服务帐户密钥

在此处输入图片说明

步骤07:输入服务帐户名称,然后单击创建

在此处输入图片说明

步骤08:单击创建无角色,然后将下载的json私钥保存在安全的地方

在此处输入图片说明

步骤09:从复制您的client_email

在此处输入图片说明

第10步:打开Goog​​le日历

  • calendar.google.com

步骤11:打开您的日历设置和共享

在此处输入图片说明

第12步:与特定人员共享,然后单击添加

在此处输入图片说明

步骤13:

  1. 添加您在步骤09中之前复制的服务帐户的电子邮件
  2. 也更改权限进行更改并管理共享
  3. 点击发送

    在此处输入图片说明

步骤14:在同一页面上复制并保存日历ID,我们将需要它

在此处输入图片说明

步骤15:创建新的控制台应用程序

在此处输入图片说明

步骤16:将私钥json文件添加到您的项目

在此处输入图片说明

第17步:r单击私钥json,然后单击Propertis

在此处输入图片说明

步骤18:将“复制到输出Direcory”更改为“始终复制”

在此处输入图片说明

步骤19:打开PM Console,然后在默认项目D上选择您的项目

在此处输入图片说明

第20步:安装Google.Apis日历软件包

Install-Package Google.Apis.Calendar.v3
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

步骤21:用代码替换Program.cs

using Google.Apis.Auth.OAuth2;
using Google.Apis.Calendar.v3;
using Google.Apis.Calendar.v3.Data;
using Google.Apis.Services;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace CalendarQuickstart
{
    class Program
    {
        static void Main(string[] args)
        {
            string jsonFile = "xxxxxxx-xxxxxxxxxxxxx.json";
            string calanderId = @"xxxxxxxxxxxxx@group.calendar.google.com";

            string[] Scopes = { CalendarService.Scope.Calendar };

            ServiceAccountCredential credential;

            using (var stream =
                new FileStream(jsonFile, FileMode.Open, FileAccess.Read))
            {
                var confg = Google.Apis.Json.NewtonsoftJsonSerializer.Instance.Deserialize<JsonCredentialParameters>(stream);
                credential = new ServiceAccountCredential(
                   new ServiceAccountCredential.Initializer(confg.ClientEmail)
                   {
                       Scopes = Scopes
                   }.FromPrivateKey(confg.PrivateKey));
            }

            var service = new CalendarService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "Calendar API Sample",
            });

            var calander = service.Calendars.Get(calanderId).Execute();
            Console.WriteLine("Calander Name :");
            Console.WriteLine(calander.Summary);

            Console.WriteLine("click for more .. ");
            Console.Read();


            // Define parameters of request.
            EventsResource.ListRequest listRequest = service.Events.List(calanderId);
            listRequest.TimeMin = DateTime.Now;
            listRequest.ShowDeleted = false;
            listRequest.SingleEvents = true;
            listRequest.MaxResults = 10;
            listRequest.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;

            // List events.
            Events events = listRequest.Execute();
            Console.WriteLine("Upcoming events:");
            if (events.Items != null && events.Items.Count > 0)
            {
                foreach (var eventItem in events.Items)
                {
                    string when = eventItem.Start.DateTime.ToString();
                    if (String.IsNullOrEmpty(when))
                    {
                        when = eventItem.Start.Date;
                    }
                    Console.WriteLine("{0} ({1})", eventItem.Summary, when);
                }
            }
            else
            {
                Console.WriteLine("No upcoming events found.");
            }
            Console.WriteLine("click for more .. ");
            Console.Read();

            var myevent = DB.Find(x => x.Id == "eventid" + 1);

            var InsertRequest = service.Events.Insert(myevent, calanderId);

            try
            {
                InsertRequest.Execute();
            }
            catch (Exception)
            {
                try
                {
                    service.Events.Update(myevent, calanderId, myevent.Id).Execute();
                    Console.WriteLine("Insert/Update new Event ");
                    Console.Read();

                }
                catch (Exception)
                {
                    Console.WriteLine("can't Insert/Update new Event ");

                }
            }
        }


        static List<Event> DB =
             new List<Event>() {
                new Event(){
                    Id = "eventid" + 1,
                    Summary = "Google I/O 2015",
                    Location = "800 Howard St., San Francisco, CA 94103",
                    Description = "A chance to hear more about Google's developer products.",
                    Start = new EventDateTime()
                    {
                        DateTime = new DateTime(2019, 01, 13, 15, 30, 0),
                        TimeZone = "America/Los_Angeles",
                    },
                    End = new EventDateTime()
                    {
                        DateTime = new DateTime(2019, 01, 14, 15, 30, 0),
                        TimeZone = "America/Los_Angeles",
                    },
                     Recurrence = new List<string> { "RRULE:FREQ=DAILY;COUNT=2" },
                    Attendees = new List<EventAttendee>
                    {
                        new EventAttendee() { Email = "lpage@example.com"},
                        new EventAttendee() { Email = "sbrin@example.com"}
                    }
                }
             };
    }
}
Run Code Online (Sandbox Code Playgroud)

步骤22:用您的json文件名替换json文件名

  string jsonFile = "xxxxxxx-xxxxxxxx.json";
Run Code Online (Sandbox Code Playgroud)

步骤23:将步骤14中的calander ID替换为calander ID

 string calanderId = @"xxxxxxxxxxxxx@group.calendar.google.com";
Run Code Online (Sandbox Code Playgroud)

步骤24:运行应用

在此处输入图片说明

第25步:访问日历,您应该会在

 2019/01/13
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 好的,抱歉耽搁了。你解决了这个问题 - 谢谢!终于有人给了我我需要的澄清,而不是因为我问这个问题的方式而责骂我。非常感谢!我仍然不知道如何为段落添加换行符 :) (2认同)
  • 很棒的简单教程!太棒了 (2认同)
  • 谢谢你!!我在谷歌可怕的文档上浪费了很多时间,这很有效。为我节省更多时间。 (2认同)
  • @MohamedElrashid 我遵循你的答案。读取日历工作正常,但插入给我一个错误:服务帐户无法在没有域范围授权的情况下邀请与会者 (403)。请问您有什么想法吗? (2认同)