【问题标题】:How do I get a list of all todo items in a CalDAV calendar from Perl?如何从 Perl 获取 CalDAV 日历中所有待办事项的列表?
【发布时间】:2015-05-13 19:16:25
【问题描述】:

我有一个 CalDAV 日历,想从中取出所有待办事项,然后删除它们。

Cal::DAV 或 HTTP::DAV 模块都可能是要走的路,但在不了解 CalDAV 的情况下,我完全不清楚如何做我想做的事,我希望避免: -)

【问题讨论】:

  • 这必须是 Perl 吗?否则,您可以只使用 Cadaver 连接到 todolist 集合并执行 'rm *' ...
  • 好吧,如果你能告诉我在 Cadaver 中要做的序列,我可以用 Perl 包裹它:-) 我昨晚快速浏览了 cadaver,不记得我为什么放弃它了.
  • Cadaver 是不适合包装的交互式工具。我不确定您是只想执行一次(以批量方式)还是真正构建到脚本中。 @harvey 的回答应该做你想做的。 CalDAV 待办事项列表只是一个 WebDAV 集合。您可以通过简单的 PROPFIND 检索项目 URL,并且可以通过常规 HTTP DELETE 删除它们。

标签: perl caldav


【解决方案1】:

这是一个使用原始套接字手动连接和发送请​​求的示例 - 我发现使用像 lwp 或 http 这样的库会因为需要覆盖标头而变得很麻烦。

引用了来自http://sabre.io/dav/building-a-caldav-client/的请求格式

#!/usr/bin/env perl
use strict 'vars';
use warnings;
use Socket;

# initialize host and port
my $host = 'www.example.com';
my $port =  80;

# contact the server
open_tcp(F, $host, $port) 
  or die 'Could not connect to server';

# Send request data
while ( my $request = <DATA> ) {
  print F $request;
}

# Get Response
while ( my $response = <F> ) {
  print "Response:> $response";
}

close(F);

# TCP Helper
sub open_tcp
{
  # get parameters
  my ($FS, $dest, $port) = @_;

  my $proto = getprotobyname('tcp');
  socket($FS, PF_INET, SOCK_STREAM, $proto);
  my $sin = sockaddr_in($port,inet_aton($dest));
  connect($FS,$sin);

  my $old_fh = select($FS); 
  $| = 1; # don't buffer output
  select($old_fh);
}

__DATA__
REPORT /calendars/johndoe/home/ HTTP/1.1
Depth: 1
Prefer: return-minimal
Content-Type: application/xml; charset=utf-8

<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="VTODO" />
        </c:comp-filter>
    </c:filter>
</c:calendar-query>

【讨论】:

  • 谢谢 - 这让我成功了。我正在与之交谈的服务器使用 https,所以我创建了一些基于 HTTP::Tiny 的东西。我从 CalDAV 服务器收到响应,但没有收到预期的 VTODO 项目...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2019-10-31
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多