我使用 Google Contacts API 从服务帐户(不使用实时用户会话)检索联系信息没有成功。无论我尝试什么,我要么得到一个异常(例如:Message = "Error:\"invalid_request\",Description:\"Invalid impersonation prn email address.\",Uri:\"\""),要么没有错误,但返回了 0 个联系人。
我已经仔细检查了 Google Apps 管理控制台和管理 API 客户端访问页面中的设置(包括从 Google App 技术支持获取这些设置的验证),但无论如何,我无法加载联系人。我还尝试了所有可以在“堆栈溢出”上找到的示例,但似乎没有一个可以解决问题。
这些尝试已经在 C# / ASP.net 中进行,但我对其他语言足够熟悉,因此我应该能够适应任何可能有人可以使用的示例。
我希望有人成功地从服务帐户使用 Google 联系人 API,并愿意分享他们为实现这一目标所做的代码。
谢谢!!!
这是我尝试的一个示例,它总是导致异常“invalid_request\”:“无效的模拟 prn 电子邮件地址。\”
private void TestLoadContacts()
{
try
{
string strClientID = "STRINGGENERATEDFROMGOOGLEAPPSINTERFACE.apps.googleusercontent.com";
var credential = GenerateCred(new[] { "https://www.google.com/m8/feeds" }, strClientID);
// Get the token for this scope and user
if (credential.RequestAccessTokenAsync(new CancellationToken()).Result)
{
// use the token to initalize the request
var rs = new RequestSettings("Google Sync")
{
OAuth2Parameters = new OAuth2Parameters()
{
AccessToken = credential.Token.AccessToken
}
};
var request = new ContactsRequest(rs);
Feed<Contact> f = request.GetContacts();
foreach (var c in f.Entries)
{
//process each contact
}
}
}
catch (Exception ex)
{
string strError = ex.Message;
}
}
private static ServiceAccountCredential GenerateCred(IEnumerable<string> scopes, string delegationUser)
{
string strServiceAccountEmail = "account-1@MyGoogleAccount-1139.iam.gserviceaccount.com";
X509Certificate2 certificate = new X509Certificate2(@"C:\MyP12s\MyGoogleAccount-9da1a08f4eef.p12",
"notasecret", X509KeyStorageFlags.Exportable);
var credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(strServiceAccountEmail)
{
Scopes = scopes,
User = delegationUser
}.FromCertificate(certificate));
return credential;
}