Не удается удалить контакты из учетной записи пользователя домена Служб Google в Linux
Используя клиентские библиотеки google-gdata, я могу добавить контакты в аккаунт Google / GMail
но когда я пытаюсь удалить их, я получаю два разных результата в зависимости от типа учетной записи.
Если целевой учетной записью является чистая учетная запись GMail, я могу удалить контакты, но она не удаляется.
все контакты за один раз. Иногда возвращается несколько, иногда до 25, хотя я проверяю
если есть еще контакты и зацикливаться на них.
Когда целевой учетной записью является учетная запись Служб Google, я просто получаю тайм-аут (примерно через 2 минуты)
Обратите внимание, что даже для учетной записи Служб Google я могу добавлять контакты.
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: (адрес электронной почты изменен для конфиденциальности):
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] в:0 в System.Net.HttpWebRequest.GetResponse () [0x00000] в:0 в Google.GData.Client.Gxecute (0x0000) ] в:0 --- Конец трассировки стека внутренних исключений --- в Google.GData.Client.GDataRequest.Execute () [0x00000] в:0 в Google.GData.Client.GDataGAuthRequest.Execute (Int32 retryCounter) [0x00000] в:0
когда DeleteAllGoogleContacts
сначала называется, это удастся получить корм
и количество записей меньше или равно 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))
Это возвращает все контакты за один раз, но я все еще получаю тайм-аут после удаления ()
Обновление 2:
Это может быть связано с брандмауэром, так как я могу заставить его работать из другой сети. Если так, я удалю вопрос, так как он не актуален.
Обновление 3:
Кажется, это не вызвано брандмауэром.
При запуске этого в Windows с.NET все работает, как ожидалось.
При запуске этого в Linux с последними версиями Mono и FSharp, скомпилированными из исходного кода,
мы получаем исключение тайм-аута.
Мое единственное предположение здесь - то, что это имеет отношение к сертификатам SSL.
Например, если вы хотите получить доступ к SMTP GMail в Linux, вы должны выполнить следующие команды:
mozroots --import --ask-remove
certmgr --ssl smtps://smtp.gmail.com:465
Иначе это не сработает. Возможно, мне нужно сделать что-то подобное для API GData?
Обновление 4:
Глядя на конечные точки для Update()
а также Delete()
видишь, они одно и то же
https://www.google.com/m8/feeds/contacts/userEmail/full/{contactId}
Единственное отличие - используемый HTTP-глагол: PUT
против UPDATE
и я подтвердил
что Update() работает на обеих платформах для обеих целей (Windows/Linux), (GMail, Google Apps)
На рисунке ниже показаны 4 различных сценария удаления ():