You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CalDAV查询因重复事件返回异常结果及衍生问题求助

CalDAV查询NextCloud日历异常问题

我部署了两台NextCloud服务器,通过Python发起CalDAV时间范围查询时,请求能正常执行,但返回结果存在异常:

  • 大量超出查询时间范围的重复事件
  • 使用<c:expand>扩展重复事件后,又出现两个新问题:
    1. 时间字段缺失时区偏移信息
    2. 结果行尾附带HTML编码的回车字符(示例:DTSTART:20250907T140000Z&#13;)

初始查询XML

<c:calendar-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
    <d:prop><d:getetag /><c:calendar-data /></d:prop>
    <c:filter>
        <c:comp-filter name="VCALENDAR">
            <c:comp-filter name="VEVENT">
                <c:time-range  start="20250911T000000" end="20250919T000000"/>
            </c:comp-filter>
        </c:comp-filter>
    </c:filter>
</c:calendar-query>

Python请求代码

requests.request(
    "REPORT",
    "https://my.nextcloud.de/remote.php/dav/calendars/myUser/myCalendar/",
    headers={"Depth": "1", "Content-Type": "text/html"},
    auth=HTTPBasicAuth(reqName, reqPwd),
    data=reqData
)

扩展后的查询XML

<c:calendar-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
    <d:prop>
        <c:calendar-data>
            <c:expand start="20250907T000000" end="20250908T000000"/>
        </c:calendar-data>
    </d:prop>
    <c:filter>
        <c:comp-filter name="VCALENDAR">
            <c:comp-filter name="VEVENT">
                <c:time-range  start="20250907T000000" end="20250908T000000"/>
            </c:comp-filter>
        </c:comp-filter>
    </c:filter>
</c:calendar-query>

问题修复方案

  1. 修正请求Content-Type头
    当前请求的Content-Type设为text/html,但CalDAV的REPORT要求使用application/xml或text/xml,这会导致服务器解析异常,是引发重复事件和格式问题的核心原因之一。修改headers:

    headers={"Depth": "1", "Content-Type": "application/xml"}
    
  2. 解决时区缺失问题
    在<c:calendar-data>节点中明确请求时区信息,同时给时间范围参数加上UTC标识(Z后缀),避免服务器解析时的时区歧义:

    <c:calendar-data>
        <c:expand start="20250907T000000Z" end="20250908T000000Z"/>
        <c:timezone xmlns="urn:ietf:params:xml:ns:caldav"/>
    </c:calendar-data>
    

    也可以指定具体时区,比如Europe/Berlin,替换上述<c:timezone>节点为:

    <c:timezone xmlns="urn:ietf:params:xml:ns:caldav">Europe/Berlin</c:timezone>
    
  3. 清除编码回车字符
    返回结果中的&#13;是HTML转义的回车符(CR),可以通过Python的html模块解码后统一换行格式:

    import html
    
    # 解码HTML转义字符
    decoded_content = html.unescape(response.text)
    # 统一换行符为\n
    cleaned_content = decoded_content.replace('\r\n', '\n').replace('\r', '\n')
    
  4. 排查服务器配置
    两台服务器都出现相同问题,建议检查NextCloud日历应用是否为最新版本,确认CalDAV扩展功能已正常启用,必要时重启NextCloud服务或重新安装日历应用。


内容的提问来源于stack exchange,提问作者awado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 09:14:53