Создайте общий контакт домена в Gsuite, используя Контакты API в C # - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь создать общий контакт в домене в GSuite через API контактов в C #, но не могу понять, как поместить запись XML-атома в URL-адрес фида, как указано здесь: https://developers.google.com/admin-sdk/domain-shared-contacts/#Creating

Я пытался следовать более старому способу GData, указанному здесь https://developers.google.com/gdata/client-cs, но я получаю сообщение об ошибке «Выполнение запроса аутентификации вернуло неожиданный результат: 404».

static void Main(string[] args)
        {

            Console.WriteLine("Hello !! ");
            //Get Auth
            OAuth2Parameters p = ContactsAuth();

            //Create a domain shared contact
            try
            {
                RequestSettings settings = new RequestSettings("GSuiteAdminApp", p);
                ContactsRequest cr = new ContactsRequest(settings);

                ContactEntry cn = new ContactEntry();

                Name n = new Name();
                n.GivenName = "Ice";
                n.FamilyName = "Cold001";
                n.FullName = "Ice Cold001";

                EMail e = new EMail();
                e.Rel = "http://schemas.google.com/g/2005#work";
                e.Primary = true;
                e.Address = "ice.cold001@xyz.com";

                cn.Name = n;
                cn.Emails.Add(e);

            }
            catch (Exception e44)
            {
                Console.WriteLine(e44.Message);
            }
        }




//Auth for Contacts API
        public static OAuth2Parameters ContactsAuth()
        {
            string clientId = "xxxxxxxxxxxxxx.apps.googleusercontent.com";
            string clientSecret = "xxxxxxxxxxxxx";

            string[] scopes = new string[] { "https://www.google.com/m8/feeds/" };

            try
            {
                UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets
                {
                    ClientId = clientId,
                    ClientSecret = clientSecret
                }, scopes, "super-admin@mydomain.com", CancellationToken.None, new FileDataStore("C:\\Temp\\A\\SharedContactsOauth")).Result;
                // Translate the Oauth permissions to something the old client libray can read
                OAuth2Parameters parameters = new OAuth2Parameters();
                parameters.AccessToken = credential.Token.AccessToken;
                parameters.RefreshToken = credential.Token.RefreshToken;
                return parameters;
            }
            catch (Exception ex33)
            {
                Console.WriteLine(ex33.Message);
                return null;
            }
        }

Это выдает ошибку "запрос не выполнен".

1 Ответ

0 голосов
/ 06 июня 2019

Я наконец смог понять это, собрав воедино фрагменты кода из нескольких разных источников и некоторые свои собственные модификации. Линда Лоутон https://www.daimto.com/google-contacts-with-c/ для части OAuth2, используя более старый API GData. Документация Google по API контактов v3.0 https://developers.google.com/contacts/v3/ по механике использования клиентской библиотеки .NET для контактов и их (немного схематично) документации по "общим контактам в домене", особенно по использованию соответствующих записей FeedUri и Atom для новых контакт https://developers.google.com/admin-sdk/domain-shared-contacts/#Creating.

В основном это сводится к тому, что это - Используйте учетную запись GSuite Super Admin для авторизации в API контактов с помощью OAuth2.0, затем используйте клиентскую библиотеку GData Contacts .NET для создания нового контакта добавив домен Gsuite в метод, и все готово.

Вот полный код, который у меня сейчас работает:

using System;
using System.Threading;
using Google.Contacts;
using Google.GData.Contacts;
using Google.GData.Client;
using Google.GData.Extensions;
using Google.Apis.Auth;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Util.Store;

namespace SharedContactsAPI
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Hello !! ");

            //Get Auth
            OAuth2Parameters p = ContactsAuth();

            ////Create a domain shared contact
            try
            {
                RequestSettings settings = new RequestSettings("GSuiteAdminApp", p);
                ContactsRequest contactreq = new ContactsRequest(settings);

                Console.WriteLine("Attempting to create a Domain Shared Contact in GSuite");
                Console.WriteLine(" ");
                CreateContact(contactreq);

            }
            catch (Exception e44)
            {
                Console.WriteLine(e44.Message);
            }
        }

        //Create Shared Contact
        public static Contact CreateContacttest(ContactsRequest cr)
        {
            Contact newEntry = new Contact();
            // Set the contact's name.
            newEntry.Name = new Name()
            {
                FullName = "Ice Cold005",
                GivenName = "Ice",
                FamilyName = "Cold005"
            };
            newEntry.Content = "Notes";
            // Set the contact's e-mail addresses.
            newEntry.Emails.Add(new EMail()
            {
                Primary = true,
                Rel = ContactsRelationships.IsWork,
                Address = "ice.cold005@xyz.com"
            });

            //Insert the contact
            Uri feedUri = new Uri(ContactsQuery.CreateContactsUri("test.com"));
            Contact createdEntry = cr.Insert(feedUri, newEntry);
            Console.WriteLine("New Contact created successfully with ContactID = " + createdEntry.Id);
            return createdEntry;
        }

        //Auth for Contacts API
        public static OAuth2Parameters ContactsAuthtest()
        {
            string clientId = "xxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com";
            string clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxx";

            string[] scopes = new string[] { "https://www.google.com/m8/feeds/contacts/" };

            try
            {
                UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets
                {
                    ClientId = clientId,
                    ClientSecret = clientSecret
                }, scopes, "super-admin@test.com", CancellationToken.None, new FileDataStore("C:\\Temp\\A\\SharedContactsOauth")).Result;
                // Translate the Oauth permissions to something the old client libray can read
                OAuth2Parameters parameters = new OAuth2Parameters();
                parameters.AccessToken = credential.Token.AccessToken;
                parameters.RefreshToken = credential.Token.RefreshToken;
                return parameters;
            }
            catch (Exception ex33)
            {
                Console.WriteLine(ex33.Message);
                return null;
            }
        }

    }
}
...