我已經有了一個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