Backup your google reader into a sqlite database; moreover all used xml files (received via the API) are also stored. You should use this script in an empty directory!
#!/usr/bin/perl -w #--------Enter your credentials here----------------- my $user= 'sjobs@gmail.com'; my $pwd = 'iPassword'; #---------------------------------------------------- use strict; use LWP; use XML::Simple; use LWP::UserAgent; use Data::Dumper; use DBI; my $dbh; my $xml; my $st; my $count = 0; my $ua = LWP::UserAgent->new;; $ua->agent("GReader Export "); my $req = HTTP::Request->new(GET => 'https://www.google.com/accounts/ClientLogin?service=reader&Email='.$user.'&Passwd='.$pwd); my $res = $ua->request($req); die $res->status_line, "\n" if (not $res->is_success); $res->content =~ m/Auth=(\S*)/; my $auth = $1; $req = HTTP::Request->new(GET => 'http://www.google.com/reader/api/0/subscription/list?output=xml'); $req->header(Authorization => 'GoogleLogin auth='.$auth); $res = $ua->request($req); die $res->status_line, "\n" if (not $res->is_success); open (FILEHANDLE, ">subscriptions.xml"); print FILEHANDLE $res->content; close FILEHANDLE; $dbh = DBI->connect("dbi:SQLite:dbname=greader.db",{AutoCommit => 0}); $dbh->do('CREATE TABLE IF NOT EXISTS subscriptions (id VARCHAR PRIMARY KEY, title VARCHAR, htmlUrl VARCHAR, file VARCHAR)'); $dbh->do('CREATE TABLE IF NOT EXISTS feeds (id VARCHAR REFERENCES subscriptions(id), title VARCHAR, link VARCHAR, label VARCHAR, content VARCHAR)'); $st = $dbh->prepare("INSERT OR REPLACE INTO subscriptions (id, title, htmlUrl, file) VALUES (?, ?, ?, ?)"); my $xs = XML::Simple->new; $xml = $xs->XMLin($res->content, KeyAttr => {}); my $id; my $title; my $htmlurl; my $label; my $content; my $link; my $file; foreach my $object (values $xml->{list}->{object}) { foreach my $string (values $object->{string}) { $id = $string->{content} if ($string->{name} eq 'id'); $title = $string->{content} if ($string->{name} eq 'title'); $htmlurl = $string->{content} if ($string->{name} eq 'htmlUrl'); } $file = substr($htmlurl, 0, 30); $file =~ s/[^0-9a-z_-]+/_/gi; $file = $file."-".$count.".xml"; $st->execute($id, $title, $htmlurl, $file); $count++; } $st = $dbh->prepare("SELECT id, file FROM subscriptions"); my $st_insert = $dbh->prepare("INSERT OR REPLACE INTO feeds (id, title, link, label, content) VALUES (?, ?, ?, ?, ?)"); $st->execute(); while ((my $row = $st->fetchrow_hashref())) { print $count--." ".$row->{id}."\n"; $req = HTTP::Request->new(GET => 'http://www.google.com/reader/atom/'.$row->{id}); $req->header(Authorization => 'GoogleLogin auth='.$auth); $res = $ua->request($req); next if (not $res->is_success); open (FILEHANDLE, ">".$row->{file}); print FILEHANDLE $res->content; close FILEHANDLE; $xml = $xs->XMLin($res->content, KeyAttr => {}); foreach my $entry (values $xml->{entry}) { open (FILEHANDLE, ">".$row->{file}.".dump"); print FILEHANDLE Dumper($xml); close FILEHANDLE; $title = ""; $link = ""; $label = ""; $content = ""; if (not ref($entry) eq 'HASH') { next; } if (ref($entry->{title}) eq 'HASH') { $title = $entry->{title}->{content} if (defined $entry->{title}->{content}); } else { $title = $entry->{title} if (defined $entry->{title}); } if(ref($entry->{link}) eq 'ARRAY'){ $link = $entry->{link}[0]->{href} if (defined $entry->{link}[0]->{href}); } else { $link = $entry->{link}->{href} if (defined $entry->{link}->{href}); } if (defined $entry->{category}) { foreach my $l (values $entry->{category}) { $label = $label.$l->{label}." " if (ref($l) eq 'HASH' and defined $l->{label}); chomp $label; } } if (ref($entry->{content}) eq 'HASH') { $content = $entry->{content}->{content} if (defined $entry->{content}->{content}); } else { $content = $entry->{content} if (defined $entry->{content}); } chomp $title; chomp $link; chomp $label; chomp $content; $st_insert->execute($row->{id}, $title, $link, $label, $content); } }