Here it goes. It's not exactly generic because it's designed to be called from Emacs org-mode, but I hope it will be useful for you.
# BEGIN CODE #!/usr/bin/perl use strict; use warnings; use Getopt::Long; use LWP::Simple; use HTML::Entities; use URI::Escape; use XML::Simple; use WWW::Blogger::XML; use File::Slurp; use Data::Dumper; # Get the options from command line. Getopt::Long::GetOptions(\ my %opts, 'org', map "$_=s", qw/blog title categories file/); my $post_body = $opts{file} ? File::Slurp::read_file($opts{file}) : join '', <>; if ($opts{org}) { # Convert tags to categories. if ($post_body =~ s!(?: )*<span class="tag">(.+?)</span>!!s) { $opts{categories} = $1; $opts{categories} =~ s! !,!g; $opts{categories} =~ s!___!-!g; $opts{categories} =~ s!__! !g; $opts{categories} = HTML::Entities::decode_entities($opts{categories}); } # Extract post title. $post_body =~ s!\s*<h2[^>]*>(.+?)\s*</h2>!!s; $opts{title} = HTML::Entities::decode_entities($1); } # Search for a post with such title. Atom API doesn't seem to allow searching, # so do a normal web search. my $content = LWP::Simple::get( "http://$opts{blog}.blogspot.com?q=" . URI::Escape::uri_escape("\"$opts{title}\"") ); my ($blog_id) = $content =~ /[?&]blogID=(\d+)/; # Look if a post with specified title is present in search results. my $post_id; while ($content =~ m!<a name='(\d+)'></a>.+?<a [^>]+>([^<]+)!sg) { next unless uc HTML::Entities::decode_entities($2) eq uc $opts{title}; # If $post_id is already defined, this must be another post with the same # title. Therefore, the title isn't unique. Die. die "Multiple posts found with the title \"$opts{title}\": $post_id, $2" if defined $post_id; # This is the first match, assign the post id. $post_id = $1; } # Build post as structure for conversion to XML. my %body = ( 'xmlns' => 'http://www.w3.org/2005/Atom', 'content' => { content => $post_body, type => 'html', }, title => { content => $opts{title}, type => 'text', }, category => [ map { scheme => 'http://www.blogger.com/atom/ns#', term => $_, }, split /\s*,\s*/, ($opts{categories} || '') ], ); # Create the request. my $request = HTTP::Request->new( $post_id ? 'PUT' : 'POST', $WWW::Blogger::XML::API::url . "/feeds/$blog_id/posts/default/" . ($post_id || ''), [ Content_Type => 'application/atom+xml' ], XML::Simple::XMLout(\%body, RootName => 'entry'), ); # Execute it, dying on failure. my $result = WWW::Blogger::XML::API::ua_request($request); die $result->status_line unless $result->is_success; # END OF CODE On Mon, May 31, 2010 at 2:29 PM, Ovid <publiustemp-londo...@yahoo.com> wrote: > Does anyone have any *working* code (I've seen plenty of failing examples) > they can share which demonstrates making a successful post to blogger? I've > failed with both Net::Blogger and Atompub > (http://stackoverflow.com/questions/2942998/cant-post-with-perls-netblogger). > > Cheers, > Ovid > -- > Buy the book - http://www.oreilly.com/catalog/perlhks/ > Tech blog - http://blogs.perl.org/users/ovid/ > Twitter - http://twitter.com/OvidPerl > Official Perl 6 Wiki - http://www.perlfoundation.org/perl6 > > > >