导入.ics文件时出现Google日历错误

时间:2014-01-22 06:16:05

标签: google-calendar-api icalendar

我很难让订阅日历与Google日历一起使用。以下网址适用于Outlook和Apple日历(iCal),但我收到来自Google的错误 - “您提供的地址未包含有效iCal或GData格式的日历。”

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

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

我对我的问题感到困惑,因为我可以手动导入由我的脚本输出的.ics文件,并且谷歌日历读取它没有任何问题。所以我认为我对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;
    
  6. 由于某种原因,我无法解释,这使得完全相同的文件在Google日历中起作用。因此,这与Outlook,Google日历和Apple日历兼容。

答案 2 :(得分:0)

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

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

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

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