C# 如何访问google日历的客户端机密文件

C# 如何访问google日历的客户端机密文件,c#,google-api-dotnet-client,google-calendar-api,C#,Google Api Dotnet Client,Google Calendar Api,我想访问google日历的客户端_秘密文件,并使用它在我的日历中添加事件 我正在用c#创建一个聊天机器人,在我使用计算机路径的那一刻(当我试图在我的pc中访问我的项目的客户机机密文件时),它工作得很好 当我在网上发布项目并尝试访问该文件时,我无法访问 我的代码是: string path = @"C:\Project\Test\Bot\V3\client_secret.json"; string pathi = @"{ 'installed': { 'client_id': '1111

我想访问google日历的客户端_秘密文件,并使用它在我的日历中添加事件

我正在用c#创建一个聊天机器人,在我使用计算机路径的那一刻(当我试图在我的pc中访问我的项目的客户机机密文件时),它工作得很好

当我在网上发布项目并尝试访问该文件时,我无法访问

我的代码是:

 string path =  @"C:\Project\Test\Bot\V3\client_secret.json";

 string pathi = @"{
 'installed': {
'client_id': '1111111- 
  21432423.apps.googleusercontent.com',
'project_id': '111',
'auth_uri': 'https://accounts.google.com/o/oauth2/auth',
'token_uri': 'https://www.googleapis.com/oauth2/v3/token',
'auth_provider_x509_cert_url': 'https://www.googleapis.com/oauth2/v1/certs',
'client_secret': '22222222222222',
'redirect_uris': [ 'urn:ietf:wg:oauth:2.0:oob', 'http:dev.ai.com/BotTest/' ]
      }
  }";


            UserCredential credential;
            string[] Scopes = { CalendarService.Scope.Calendar };
            string credPath = System.Environment.GetFolderPath(
               System.Environment.SpecialFolder.Personal);

            using (var stream =
           new FileStream(pathi, FileMode.Open, FileAccess.Read))
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
               GoogleClientSecrets.Load(stream).Secrets,
               Scopes,
               "user",
               CancellationToken.None,
               new FileDataStore(credPath, true)).Result;
            string ApplicationName = "Google Calendar API .NET Quickstart";

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


            Event newEvent = new Event()
            {

                Summary = "Event",
                Location = "",
                Description = "Event is scheduled for:  " + 
        eventi.Date.ToString("dd-MM-yyyy") + "  " + 
       eventi.Time.ToShortTimeString(),
                Start = new EventDateTime()
                {

                    // DateTime = eventi.Date,
                    DateTime = new DateTime(eventi.Date.Year, 
         eventi.Date.Month, eventi.Date.Day, eventi.Time.Hour, 
            eventi.Time.Minute, 0),
                    TimeZone = "Europe/Brussels",


                },
                End = new EventDateTime()
                {

                    DateTime = eventi.Date.AddMinutes(60),
                    // DateTime = new DateTime(eventi.Date.Year, 
                 eventi.Date.Month, eventi.Date.Day, eventi.Time.Hour, 
                        eventi.Time.Hour +1 ,0),
                    TimeZone = "Europe/Brussels",
                },
                Recurrence = new String[] { "RRULE:FREQ=DAILY;COUNT=1" },
                Attendees = new EventAttendee[] {
                new EventAttendee() { Email = "eeee@gmail.com" },

            },

                ///////////////////////////////////////////



                ///////////////////////////////////////////

                Reminders = new Event.RemindersData()
                {
                    UseDefault = false,
                    Overrides = new EventReminder[] {
                    new EventReminder() { Method = "email", Minutes = 1 * 60 },
                    new EventReminder() { Method = "sms", Minutes = 10 },
                }
                }
            };
            String calendarId = "primary";
            EventsResource.InsertRequest request1 = 
          service.Events.Insert(newEvent, calendarId);
            Event createdEvent = request1.Execute();
            Console.WriteLine("Event created: {0}", createdEvent.HtmlLink);

            // Define parameters of request.
            EventsResource.ListRequest request = service.Events.List("primary");
            request.TimeMin = eventi.Time;
            request.ShowDeleted = false;
            request.SingleEvents = true;
            request.MaxResults = 10;
            request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;


            // List events.
            Events events = request.Execute();
            Console.WriteLine("Upcoming events:");
            if (events.Items != null && events.Items.Count > 0)
            {
                foreach (var eventItem in events.Items)
                {
                    string when = eventItem.Start.Date;
                    if (String.IsNullOrEmpty(when))
                    {
                        when = eventItem.Start.Date;
                    }
                    Console.WriteLine("{0} ({1})", eventItem.Summary, when);
                }
            }
            else
            {
                Console.WriteLine("No upcoming events found.");
            }
            //Console.Read();
            //   context.Wait(this.MessageReceived);
        }
        context.Wait(this.MessageReceived);
    }
当我使用path时,在代码的这一部分中,我使用了path工作:

    using (var stream =
           new FileStream(path, FileMode.Open, FileAccess.Read))
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
               GoogleClientSecrets.Load(stream).Secrets,
               Scopes,
               "user",
               CancellationToken.None,
               new FileDataStore(credPath, true)).Result;
当我将文件的根目录放到web中不起作用时,与将文件的所有脚本放到字符串路径中时一样:

string path = @"http://dev.aaaa.com/bot/client_secret.json"
我尝试只输入文件名,但仍然不起作用:

 using (var stream =
           new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
               GoogleClientSecrets.Load(stream).Secrets,
               Scopes,
               "user",
               CancellationToken.None,
               new FileDataStore(credPath, true)).Result;

您能帮助我如何访问此文件吗?

将credentials.json复制到bin\debug和bin\release文件夹中,如果您的客户端是控制台应用程序,请按此方法操作

UserCredential credential;
            string credPath = System.Environment.GetFolderPath(
               System.Environment.SpecialFolder.Personal);

            using (var stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
            {
                credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                   new[] { CalendarService.Scope.CalendarReadonly },
                    "user", CancellationToken.None, new FileDataStore(credPath));
            }
对于web应用程序,client_secret.json将如下所示,并包含重定向uri等

{"web":{"client_id":" ","project_id":" ","auth_uri":" ","token_uri":" ","auth_provider_x509_cert_url":" ","client_secret":" ","redirect_uris":[]}}

也不要透露您的任何id和机密。

请确保为域“dev.aaaa.com”(通常在开发时我们提供localhost,但您可能必须更改为实际域,即“dev.aaaa.com”)定义的客户端id和机密与“client_secret.json”文件。同时将client_secret.json放在根目录下,只需提及文件名,因为新的FileStream只需要本地文件路径!是的,我输入了正确的域,但仍然不起作用。我收到这样一条消息:“path不能是空字符串”,事实上,当我调试path返回文件名path时(因此它不是空的):(thnx…in credentials.json是正确的,或者我必须使用client_secret进行更新。jsoni遇到以下错误:System.ArgumentException:Path不能是空字符串或全部空白。在System.IO.Directory.CreateDirectory(字符串路径)在Google.api.Util.Store.FileDataStore..ctor(字符串文件夹,布尔完整路径).事实上,path exist和path return client_secret.json文件您的访问令牌将保存在FileDataStore()的文件夹参数中在此之后,请查看谷歌认证屏幕,登录后,您还应该看到您必须允许的同意屏幕。请您帮我提供一个示例代码……我认为我的代码仅适用于桌面应用程序,但在web中,我必须使用smth,否则:(有必要对iis进行任何更改???因为很奇怪,当我在本地pc上测试时,我可以访问google caledar,而在web上部署时,我无法访问