2015-05-13 26 views
1

我已經有了一個CalDAV日曆,並且想要從中刪除所有待辦事項,然後刪除它們。如何從Perl獲取CalDAV日曆中的所有待辦事項列表?

Cal :: DAV或HTTP :: DAV模塊可能是要走的路,但是如何做我想做的事卻一點也不清楚,對CalDAV沒有多少了解,我希望避免:-)

+0

請求格式請問這是Perl的?否則,您可以使用Cadaver連接到todolist集合,並執行'rm *'... – hnh

+0

那麼,如果您可以向我展示在Cadaver中執行的順序,則可以將Perl包裝在其中:-)我快速查看昨晚在屍體上,不記得我爲什麼放棄它。 – Elbin

+0

Cadaver是一款不適合包裝的交互式工具。我不確定你是否只想這樣做(以批量方式)或者真正構建成腳本。 @哈維的答案應該做你想做的。 CalDAV待辦事項列表僅僅是一個WebDAV集合。您可以通過簡單的PROPFIND檢索項目URL,並且可以通過常規HTTP DELETE刪除它們。 – hnh

回答

0

下面是一個使用原始套接字手動連接和發送請​​求的示例 - 我發現使用類似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> 
+1

謝謝 - 這讓我有一部分。我所說的服務器使用https,所以我創建了基於HTTP :: Tiny的東西。我從CalDAV服務器獲得迴應,但不是預期的VTODO項目... – Elbin