我已经有了一个CalDAV日历,并且想要从中删除所有待办事项,然后删除它们。如何从Perl获取CalDAV日历中的所有待办事项列表?
Cal :: DAV或HTTP :: DAV模块可能是要走的路,但是如何做我想做的事却一点也不清楚,对CalDAV没有多少了解,我希望避免:-)
我已经有了一个CalDAV日历,并且想要从中删除所有待办事项,然后删除它们。如何从Perl获取CalDAV日历中的所有待办事项列表?
Cal :: DAV或HTTP :: DAV模块可能是要走的路,但是如何做我想做的事却一点也不清楚,对CalDAV没有多少了解,我希望避免:-)
下面是一个使用原始套接字手动连接和发送请求的示例 - 我发现使用类似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项目... – Elbin
请求格式请问这是Perl的?否则,您可以使用Cadaver连接到todolist集合,并执行'rm *'... – hnh
那么,如果您可以向我展示在Cadaver中执行的顺序,则可以将Perl包装在其中:-)我快速查看昨晚在尸体上,不记得我为什么放弃它。 – Elbin
Cadaver是一款不适合包装的交互式工具。我不确定你是否只想这样做(以批量方式)或者真正构建成脚本。 @哈维的答案应该做你想做的。 CalDAV待办事项列表仅仅是一个WebDAV集合。您可以通过简单的PROPFIND检索项目URL,并且可以通过常规HTTP DELETE删除它们。 – hnh