使用google-gdata客户端库,我可以将对帐户添加到Google / GMail帐户中 但是当我尝试删除它们时,我会根据帐户类型得到两个不同的结果。
当目标帐户是纯GMail帐户时,我可以删除联系人,但不会删除 所有联系人一气呵成。有时它会返回一些,有时甚至高达25,即使我正在检查 如果有更多的联系人并循环它们。
当目标帐户是Google Apps帐户时,我只是暂停(大约2分钟后) 请注意,即使是Google Apps帐户,我也可以添加联系人。
let service = new ContactsService("ContactSync")
service.setUserCredentials(username, password)
let token = service.QueryClientLoginToken()
service.SetAuthenticationToken(token)
let uri = ContactsQuery.CreateContactsUri("default")
let query = new ContactsQuery(uri)
let rec DeleteAllGoogleContacts (query : ContactsQuery) =
let feed = service.Query(query) : ContactsFeed
feed.Entries
|> List.ofSeq
|> List.iter(fun f -> f.Delete())
match feed.NextChunk with
| x when String.IsNullOrWhiteSpace(x) -> ()
| _ -> DeleteAllGoogleContacts(new ContactsQuery(feed.NextChunk))
DeleteAllGoogleContacts(query)
Google Apps帐户的错误是(为隐私而更改了电子邮件):
Google.GData.Client.GDataRequestException:执行请求 失败: https://www.google.com/m8/feeds/contacts/email@domain.com/full/22280c0f9f627f ---> System.Net.WebException:请求超时 在System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)[0x00000] in:0 在System.Net.HttpWebRequest.GetResponse()[0x00000]中:0 在Google.GData.Client.GDataRequest.Execute()[0x00000]中:0 ---内部异常堆栈跟踪结束--- 在Google.GData.Client.GDataRequest.Execute()[0x00000]中:0 在Google.GData.Client.GDataGAuthRequest.Execute(Int32 retryCounter)[0x00000] in:0
首次调用DeleteAllGoogleContacts
时,它将成功获取Feed
并且条目数小于或等于25.超时发生在调用f.Delete()
请注意,就我目前所知,我不能在这里使用OAuth,因为 这将在没有用户交互的无头服务器上运行。
更新
我发现还有另一种方法来检索联系人
let Delete() =
let requestSettings = new RequestSettings("ContactSync", username, password)
requestSettings.AutoPaging <- true
let contactsRequest = new ContactsRequest(requestSettings)
let feed = contactsRequest.GetContacts() : Feed<Contact>
feed.Entries
|> List.ofSeq
|> List.iter(fun f -> contactsRequest.Delete(f))
这一次检索所有联系人,但我仍然在Delete()
时获得超时更新2:
这实际上可能与防火墙有关,因为我可以让它工作 来自另一个网络。如果是这样,我会删除该问题,因为它不相关。
更新3:
它似乎不是由防火墙引起的
在带有.NET的Windows上运行时,一切都按预期工作
在Linux上使用从源编译的最新Mono和FSharp运行时,
我们得到超时异常。
我唯一猜到的是它与SSL证书有关 例如,如果要在Linux上访问GMail SMTP,则必须发出以下命令:
mozroots --import --ask-remove
certmgr --ssl smtps://smtp.gmail.com:465
否则它将无效。也许我必须为GData API做类似的事情?
更新4:
查看Update()
和Delete()
的端点,您可以看到它们是同一个
https://www.google.com/m8/feeds/contacts/userEmail/full/{contactId}
唯一的区别是正在使用的HTTP动词:PUT
vs UPDATE
,我确认了
Update()在两个目标(Windows / Linux),(GMail,Google Apps)的平台上都有效。
下图显示了Delete()的4种不同场景: