导入.ics文件的Google日历错误

问题描述 投票:4回答:3

我很难让我的订阅日历与Google日历配合使用。以下URL可以在Outlook和Apple Calendar(iCal)上正常使用,但是我从Google处收到错误消息:“您提供的地址未包含有效iCal或GData格式的日历。”

我的URL通过了以下验证器的验证(icalvalid.cloudapp.net/和severinghaus.org/projects/icv /)

有人可以提供任何想法吗?这是网址:https://beta.vcallboard.com/calls/exportcalendar.php?userID=Mg%3D%3D&token=MjB6N2E0OTk%3D

我已经尝试过的理论:-无法在https上运行-(我将.ics文件保存并上传为服务器根目录中的文件,并且该URL有效-似乎与自动生成有关)-某些字段的空白值无效(如果我将其上传为.ics文件,则可以使用)

google-calendar-api icalendar
3个回答
2
投票

您没有在ICS文件中定义您要引用的时区。您有许多行,如下所示:

DTSTART;TZID=America/Chicago:20140121T010000

但是要使用这些,您需要定义时区,例如:

BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Test calendar
X-WR-TIMEZONE:Indian/Reunion
BEGIN:VTIMEZONE
TZID:Indian/Reunion
TZURL:http://tzurl.org/zoneinfo/Indian/Reunion
X-LIC-LOCATION:Indian/Reunion
BEGIN:STANDARD
TZOFFSETFROM:+034152
TZOFFSETTO:+0400
TZNAME:RET
DTSTART:19110601T000000
RDATE:19110601T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
...

获取时区定义文件的好地方是tzurl.org


2
投票

我对我的问题感到困惑,因为我可以手动导入脚本输出的.ics文件,并且Google日历可以毫无问题地读取该文件。因此,我认为我对iCal文件的实际格式没有任何问题-我认为这与标头或某些服务器配置有关。所以我做了一些实验...

长话短说,通过执行以下操作,我可以在Google日历上使用它:

  1. 将所有iCal数据加载到变量中,从数据库中提取数据,站点常量等。请确保使用\r\n在验证器中进行更好的验证。

    $iCal = "BEGIN:VCALENDAR\r
    VERSION:2.0\r
    PRODID:-//VirtualCallboard//".SITENAME."//EN\r
    CALSCALE:GREGORIAN\r
    METHOD:PUBLISH\r";
    while ($r=mysql_fetch_assoc($result))
    {
        // i do a bunch of stuff here to get variables ready for the output
        $iCal .= "BEGIN:VEVENT\r
    DTSTAMP:".gmdate("Ymd\THis\Z")."\r
    DTSTART:".date("Ymd\THis\Z", strtotime($r[tdstart]))."\r
    DTEND:'.date("Ymd\THis\Z",   strtotime($r[tdend]))."\r
    SUMMARY:$r[title]\r
    UID:$r[callid]@".$_SERVER['HTTP_HOST']."\r
    DESCRIPTION:$r[notes].\r
    LOCATION:$r[location_name].\r
    STATUS:CONFIRMED\r
    END:VEVENT\r\n";
    }
    $iCal .= "END:VCALENDAR";
    
  2. 转义特殊字符(我现在所知道的都是逗号)。然后(这是秘密)-使用file_put_contents将iCal变量中的字符串写入缓存目录中具有.ics扩展名的文件中

    //escape special characters.
    $iCal = str_replace(",","\,",$iCal);
    
    //output to a file
    $filename = 'site/cache/'.date("YmdHis").'.ics';
    file_put_contents($filename,$iCal);
    
  3. 调用标题:

    //set correct content-type-header
    header("Content-Type:text/calendar");
    header("Content-Disposition:inline;filename=my_ical.ics");
    
  4. 使用file_get_contents从文件中读取.ics数据,并将其输出到浏览器。

    print file_get_contents($filename);
    
  5. 清理我在缓存目录中创建的.ics文件。

    unlink($filename);
    exit;
    

由于某些原因,我无法解释,这使得相同的文件在Google日历中可以正常工作。因此,它与Outlook,Google日历和Apple日历兼容。


0
投票

可能值得记住的是,Google缓存日历URL,并且仅每x小时刷新一次(12?)。因此,如果您尝试在无法正常运行之前添加URL,则它可能仍会显示该旧版本,可能什么也没有。

尝试对URL添加不相关的更改,例如在末尾查询(?foo = 1),或者如果可以的话,更改服务器上的地址。

https://www.binarysludge.com/2012/02/01/how-to-force-refresh-google-calendar/

((在头和ic格式混乱的最后几个小时里,缓存是一种我从未想到的问题。人们倾向于认为一个人的改变至少起了作用。)]

© www.soinside.com 2019 - 2024. All rights reserved.