Office365 能够通过API将事件写入只读日历

Office365 能够通过API将事件写入只读日历,office365,office365api,Office365,Office365api,我认为这是Calendar REST API中的一个bug,但我希望找到一个解决方法 简言之,我能够通过API将日历事件发布到只读日历,而不会出错。奇怪的是,365用户界面知道日历是只读的,不允许通过用户界面进行编辑 这会导致同步出现问题,因为当原始日历再次发布时,所有新事件都会被删除。我的问题是,我如何确定我正在编写的日历具有正确的写入权限(就像UI一样),其次,我是否可以通过API而不是UI来编写它 复制步骤: 获取一个公共的、只读的ical日历地址。乙二醇 在365中,右键单击“我的日历”

我认为这是Calendar REST API中的一个bug,但我希望找到一个解决方法

简言之,我能够通过API将日历事件发布到只读日历,而不会出错。奇怪的是,365用户界面知道日历是只读的,不允许通过用户界面进行编辑

这会导致同步出现问题,因为当原始日历再次发布时,所有新事件都会被删除。我的问题是,我如何确定我正在编写的日历具有正确的写入权限(就像UI一样),其次,我是否可以通过API而不是UI来编写它

复制步骤:

  • 获取一个公共的、只读的ical日历地址。乙二醇
  • 在365中,右键单击“我的日历”和“打开日历”
  • 在“internet日历”字段中粘贴来自(1)的地址。日历应显示在“我的日历”下请注意,您无法通过UI为此日历创建活动
  • 使用
    GEThttps://outlook.office.com/api/v1.0/me/calendars
    获取新添加的日历ID
  • 使用
    POSThttps://outlook.office.com/api/v1.0/me/calendars/[CALENDAR\u ID]/events
    在新日历中创建事件
  • 预期行为 与UI一样,API不允许您写入此日历

    实际行为 创建成功,返回201个已创建。惊喜一段时间后(4-6小时),新创建的事件将被删除。如果同步此日历,则会出现问题,因为删除将传播到与该日历同步的任何客户端


    感谢您的报道。我对此进行了调查,不幸的是目前还没有一个好的答案。我们正在努力改进它,使API与Outlook和OWA更加一致。不幸的是,我没有任何时间来分享

    基本上,当您订阅internet日历时,会在邮箱中创建辅助日历。它不是真正的只读,但Outlook和OWA知道它是用于与internet日历同步的,不允许您在那里创建项目。这种逻辑完全在客户机上,而不是在服务器上,这就是为什么它现在的行为方式

    下次启动与webcal URL的同步过程时,该事件将被删除,因为从webcal链接下拉的ICS中不存在该事件

    作为一种解决方法,如果您愿意深入到
    /beta
    端点,您可以检索日历上的
    PidTagExtendedFolderFlags
    属性。这是一个二进制属性,因此需要对其进行一些解析以获取数据。格式记录在中。您需要解析
    Id
    等于0x01的,然后测试
    数据作为0x40位的位掩码。如果已设置,则该文件夹应视为只读

    要获取此属性,需要展开
    日历
    实体上的
    SingleValueExtendedProperties
    ,如下所示:

    GET https://outlook.office.com/api/beta/me/calendars?
    $expand=SingleValueExtendedProperties($filter=PropertyId eq 'Binary 0x36da')
    
    这将返回如下结果:

    {
      "value": [
        {
          "Id": "AAMkAGRm...AAA=",
          "Name": "Calendar",
          "Color": "Auto",
          "ChangeKey": "nxdFEDVaMUqvOVUO3592PQAAFmsEKg==",
          "SingleValueExtendedProperties": [
            {
              "PropertyId": "Binary 0x36da",
              "Value": "AQQAABAA"
            }
          ]
        },
        {
          "Id": "AAMkAGRm...AAA=",
          "Name": "Internet Calendar",
          "Color": "Auto",
          "ChangeKey": "nxdFEDVaMUqvOVUO3592PQAAFmsELQ==",
          "SingleValueExtendedProperties": [
            {
              "PropertyId": "Binary 0x36da",
              "Value": "AQRAJRAC"
            }
          ]
        }
      ]
    }
    
    这些属性的值是base64编码的二进制blob。如果你解码它们,你会得到如下结果:

    {
      "value": [
        {
          "Id": "AAMkAGRm...AAA=",
          "Name": "Calendar",
          "Color": "Auto",
          "ChangeKey": "nxdFEDVaMUqvOVUO3592PQAAFmsEKg==",
          "SingleValueExtendedProperties": [
            {
              "PropertyId": "Binary 0x36da",
              "Value": "AQQAABAA"
            }
          ]
        },
        {
          "Id": "AAMkAGRm...AAA=",
          "Name": "Internet Calendar",
          "Color": "Auto",
          "ChangeKey": "nxdFEDVaMUqvOVUO3592PQAAFmsELQ==",
          "SingleValueExtendedProperties": [
            {
              "PropertyId": "Binary 0x36da",
              "Value": "AQRAJRAC"
            }
          ]
        }
      ]
    }
    
    • 日历:010400001000
    • 互联网日历:010440251002
    根据格式解释,我们有:

    Id: 0x01
    Cb: 0x04
    Data: 0x02102540
    

    0x40位设置在
    数据
    字段中,因此其中一位是只读的。

    让我调查一下,然后再给您回复。感谢您的回复。这是否意味着无法通过API检测日历是否与internet日历同步?当然,如果OWA知道它是,数据一定来自某个地方(即服务器)?这导致了一个巨大的问题,即如果用户选择其中一个日历,我们使用提供的端点进行同步,那么我们这边添加的所有事件在同步期后都会作为“删除事件”返回,从而导致数据丢失情况。OWA reads属性是二进制MAPI属性。我试过了,我可以通过beta端点访问它。在我的回答中添加细节。