Создание календаря по протоколу CALDAV на yandex mail.ru
От: vaa  
Дата: 26.04.22 03:31
Оценка:
По теме: возможно ли создание календаря по протоколу CALDAV на yandex mail.ru?
И еще вопрос
 HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create("https://caldav.yandex.ru/calendars/login@yandex.ru/events-cal1");
    Request.Method = "MKCALENDAR";
    Request.Credentials = new NetworkCredential("login", "password");
    Request.ContentType = "application/xml";
    Request.SendChunked = true;
    Request.TransferEncoding = "utf-8";
    byte[] encodedBody = Encoding.UTF8.GetBytes(body);
    Request.ContentLength = encodedBody.Length;

    using (Stream reqStream = Request.GetRequestStream())
    {
        reqStream.Write(encodedBody, 0, encodedBody.Length);
        reqStream.Close();
    }
  
    var response = (HttpWebResponse)Request.GetResponse();
    String responseString = string.Empty;
    using (Stream stream = response.GetResponseStream())
    {
        StreamReader reader = new StreamReader(stream, Encoding.UTF8);
        responseString = reader.ReadToEnd();
    }

Получаю: The remote server returned an error: (501) Not Implemented.
Что как бы намекает, что яндекс не позволяет создавать календари(но это не точно, т.к. инфы на сайте нет подробной).

Если же использовать современный подход:
    using var client = new HttpClient();
    var login = Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", login);
    HttpRequestMessage message = new HttpRequestMessage(new HttpMethod("MKCALENDAR"), "https://caldav.yandex.ru/calendars/login@yandex.ru/events-cal1")
    {
        Content = new StringContent(data, Encoding.UTF8, "application/xml")
    };
    message.Headers.Authorization = new AuthenticationHeaderValue("Basic", login);
    using var response = await client.SendAsync(message); // UPDATE 4: заменил это на это using var response = await client.SendAsync(message, HttpCompletionOption.ResponseContentRead, CancellationToken.None);
// HttpCompletionOption.ResponseContentRead (!!!)
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();

получаю: Response status code does not indicate success: 500 (Server Error).
Где я ошибся?
Сам календарь формирую при помощи Ical.Net
Сами события нормально считываются обычным client.GetAsync.
за основу взял пример

UPDATE 1: OPTIONS запрос возвращает в том числе и MKCALENDAR
UPDATE 2: Нашел вот эту штуку https://github.com/ProximoSrl/CalDav. она создает календарь(видно в веб-интерфейсе),
но список "calendar-collection-set" методом "propfind" не выдает(ошибка BadRequest).
Внезапно! по get на адрес https://caldav.yandex.ru/calendars/login@yandex.ru/ получил урлы календарей!

UPDATE 3:
опытным путем выяснилось, что урл для создания календаря должен быть "https://caldav.yandex.ru/calendars/login@yandex.ru/me"
при этом нельзя в теле ничего отправлять, только метод, логин и запрос. в ответ пусто. ни айди, ничего.
при этом список вот такой календарей

/calendars/login%40yandex.ru/inbox/
/calendars/login%40yandex.ru/outbox/
/calendars/login%40yandex.ru/events-27127/
/calendars/login%40yandex.ru/events-8486495/
/calendars/login%40yandex.ru/events-8486446/
/calendars/login%40yandex.ru/events-8486467/
/calendars/login%40yandex.ru/events-8486476/
/calendars/login%40yandex.ru/events-8486479/
/calendars/login%40yandex.ru/events-8486741/
/calendars/login%40yandex.ru/events-8486744/
/calendars/login%40yandex.ru/events-8486874/
/calendars/login%40yandex.ru/events-8486886/
/calendars/login%40yandex.ru/events-8486956/
/calendars/login%40yandex.ru/todos-86503/

можно конечно сортировать по events-.
но только если обеспечить эксклюзивный доступ.
что странно, то ли яндекс такой неправильный. по rfc caldav должен через xml-пропсы взаимодействовать.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 26.04.2022 7:17 Разраб . Предыдущая версия . Еще …
Отредактировано 26.04.2022 6:42 Разраб . Предыдущая версия .
Отредактировано 26.04.2022 4:53 Разраб . Предыдущая версия .
Отредактировано 26.04.2022 4:50 Разраб . Предыдущая версия .
Отредактировано 26.04.2022 4:22 Разраб . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.