使用C#

时间:2019-06-04 00:38:56

标签: c# google-api google-contacts-api

我正在尝试通过C#中的Contacts API在GSuite中创建域共享联系人,但无法确定如何将原子XML条目发布到Feed URL,如此处所述:https://developers.google.com/admin-sdk/domain-shared-contacts/#Creating

我尝试遵循此处https://developers.google.com/gdata/client-cs所述的旧GData方式,但是收到“执行身份验证请求返回了意外结果: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 :(得分:0)

我终于能够通过沿用几个不同来源的代码片段以及自己的一些修改来弄清楚。 Linda Lawton使用较旧的GData API编写的OAuth2部分的https://www.daimto.com/google-contacts-with-c/。 Google关于Contacts API v3.0 https://developers.google.com/contacts/v3/的文档,详细介绍了如何使用.NET客户端库进行联系人及其在“域共享联系人”上的(略略的)文档,尤其是对于新联系人使用正确的FeedUri和Atom条目时https://developers.google.com/admin-sdk/domain-shared-contacts/#Creating

基本上可以归结为: 使用GSuite超级管理员帐户使用OAuth2.0对Contacts API进行身份验证,然后使用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;
            }
        }

    }
}