Previously described bash script allows for uploading a file to PicasaWeb only. With the following (simplified) Perl script one can upload pictures as well as upload with metadata (title description and tags) or create/list albums:
#!/usr/bin/perl use strict; use LWP::UserAgent; use Getopt::Long; use File::MimeInfo; use XML::LibXML; my $AlbumId ="6170354040646469009"; my $profileID="default"; my $Action = 'u'; ## x| u | c | l (default action is Upload) my $entryTitle = ''; my $entryDescription = ''; my $entryKeywords = ''; my $ActionUpload =''; my $ActionList = ''; my $ActionCreate = ''; my $ActionXload = ''; my $ImageFile = ''; my $dummyReq=''; GetOptions("xload" => \$ActionXload, "upload" => \$ActionUpload, "list" => \$ActionList, "create" => \$ActionCreate, "title=s" => \$entryTitle, "description=s" => \$entryDescription, "keywords=s" => \$entryKeywords, "file=s" => \$ImageFile, "album=s" => \$AlbumId, ## UploadFile to Album ) ; ## Determine action: if ( $ActionUpload ) {$Action = 'u'} elsif ( $ActionList ) { $Action = 'l'} elsif ( $ActionCreate ) { $Action = 'c'} elsif ( $ActionXload ) { $Action = 'x'}
OAuth 2.0 authorization is handled with Python script oauth2picasa.py
. The script is an adapted/copy-pasted fragment of code borrowd from picasawebsync
:
### Authenticate with external script (oauth2picasa.py): my $ACCESS_TOKEN=`oauth2picasa.py`; chomp($ACCESS_TOKEN); print STDERR "*** AccessToken: $ACCESS_TOKEN [AlbumId: $AlbumId]\n"; my $req ; my $blog_entry ; my $picasawebURL = "https://picasaweb.google.com/data/feed/api/user/$profileID"; if ( $Action eq 'c' ) {## Action: create album $req = HTTP::Request->new(POST => $picasawebURL ); $req->header( 'Content-Type' => 'application/atom+xml' ); $blog_entry = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:gphoto='http://schemas.google.com/photos/2007'>" . "<title type='text'>$entryTitle</title>" . "<summary type='text'>$entryDescription</summary>" . "<media:group><media:keywords>$entryKeywords</media:keywords></media:group>" . "<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/photos/2007#album'></category></entry>"; $req->content($blog_entry); } elsif ( $Action eq 'l' ) {## Action: list albums $req = HTTP::Request->new(GET => $picasawebURL ); } elsif ( $Action eq 'u' ) {## Action: Upload 1 photo w/o metadata my $mimeType = mimetype($ImageFile); ## https://developers.google.com/picasa-web/docs/2.0/developers_guide_protocol $req = HTTP::Request->new(POST => "$picasawebURL/albumid/$AlbumId" ); $req->header( 'Content-Type' => "$mimeType" ); $req->header( 'Slug' => "$ImageFile" ); ## http://www.perlmonks.org/?node_id=131584 open(FILE, $ImageFile); $req->content(join('',<FILE>)); close(FILE); }
To upload the binary image data along with its metadata, use MIME content type "multipart/related"; send photo metadata in one part of the POST body (Content-Type: application/atom+xml
), and binary-encoded image data in another part. This is the preferred approach according to Picasa Web Albums Data API Picasa Web Albums Data API
elsif ( $Action eq 'x' ) {## Action: Upload 1 photo with metadata # https://groups.google.com/forum/#!topic/google-picasa-data-api/2qRfP0EIFhk my $mimeType = mimetype($ImageFile); $req = HTTP::Request->new(POST => "$picasawebURL/albumid/$AlbumId" ); $req->header( 'Content-Type' => "multipart/related" ); open(FILE, $ImageFile); my $add_photo_metadata = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/'>" . "<title type='text'>$entryTitle</title>" . "<summary type='text'>$entryDescription</summary>" . "<media:group><media:keywords>$entryKeywords</media:keywords></media:group>" . "<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/photos/2007#photo'></category></entry>"; my $add_photo_data = join('',<FILE>); close(FILE); ## http://www.perlmonks.org/?node_id=131584 $req->add_part(HTTP::Message->new(['Content-Type' => 'application/atom+xml'], $add_photo_metadata)); $req->add_part(HTTP::Message->new(['Content-Type' => "$mimeType"], $add_photo_data)); } $req->header( 'Authorization' => "Bearer $ACCESS_TOKEN" ); $req->header( 'GData-Version' => '2' ); ## ### ### my $res ; my $ua = LWP::UserAgent->new; $res = $ua->request($req); if ($res->is_success) { my $decoded_response = $res->decoded_content; print "*** OK *** $decoded_response\n"; }
Usage:
Upload with metadata
picasaweb.pl -xload -title PICTURE-TITLE -descr DESCRIPTION \ -keywords 'TAG1,TAG2' -file FILE.jpg -album ALBUMID
Upload w/o metadata:
picasaweb.pl -upload -file FILE.jpg -album 12345
Create album:
picasaweb.pl -create -title ALBUM-TITLE -descr DESCRIPTION \ -keywords 'TAG1,TAG2'
List album:
picasaweb.pl -list
Source code: picasaweb.pl
Takie informacje są niezwykle cenne.
OdpowiedzUsuńInformacje zawarte w tym wpisie bardzo mnie zaciekawiły.
OdpowiedzUsuń