#!/usr/local/bin/perl use vars qw( $VERSION ); $VERSION = "1.1"; use strict; ############################################################################### ### Default Configuration ##################################################### ############################################################################### use vars qw( $BASE_URL $AGENT @SERVERS ); ## Where we're getting messages from on Usenet $BASE_URL = 'http://groups.google.com/groups?dmode=source'; ## What user agent should we say we're using? $AGENT = "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/0.8.12"; @SERVERS = qw( news.killfile.org news.ks.uiuc.edu news.readfreenews.net ); ############################################################################### ### main() #################################################################### ############################################################################### use Net::NNTP; use LWP::UserAgent; my $ua = new LWP::UserAgent ( 'agent' => $AGENT ); $0 =~ s%.*/%%; # Clean up path info my $id = shift @ARGV; die "Usage: $0 ID\n" unless $id; my $article; foreach (@SERVERS) { my $nntp = new Net::NNTP($_); $id = join('', '<', $id, '>'); $id =~ s/^<>$/>/g; $article = $nntp->article($id); $nntp->quit; last if $article; } if ($article) { print @$article; exit 0 } else { my $newd = $id; $newd =~ s/%/%25/g; $newd =~ s/@/%40/g; $newd =~ s/^<|>$//g; my $url = join('&', $BASE_URL, "selm=$newd"); my $response = $ua->get($url); warn "U: $url\n"; my (@lines, $isarticle, $lastline); if ($response->is_success) { foreach my $line (split("\n", $response->content)) { chomp $line; $line =~ s/>/>/g; $line =~ s/<///g; $lastline = $line; # $isarticle++ if $line =~ /^.*(Path|From): /; $isarticle++ if $line =~ /^(\s*
)/;
$line =~ s/^\s*// if $1;
$isarticle = 0 if $line =~ m%^<\/pre>$%;
push @lines, $line if $isarticle;
$lastline = $line;
}
} else { die "Couldn't get $newd: " . $response->status_line, "\n"; }
print join("\n", @lines, "");
close STRING;
}
###############################################################################
### Documentation #############################################################
###############################################################################
=head1 NAME
article - a script that downloads a Usenet news article by Message-ID
=head1 SYNOPSIS
article MSGID
=head1 DESCRIPTION
'article' is a simple script for looking for news articles from either
your local news spool (using Net::NNTP and your NNTPSERVER variable) or,
failing that, Google Groups. Prints the article and exits if it finds
something, exits without printing anything if nothing is found.
=head1 NOTES
This is fairly dependent on how Google is interfacing with their articles
on any given day... This works as of 13 Jun 2006.
=head1 REQUIREMENTS
=head1 SEE ALSO
B, B
=head1 AUTHOR
Tim Skirvin
=head1 LICENSE
This code may be redistributed under the same terms as Perl itself.
=head1 COPYRIGHT
Copyright 2002-2006, Tim Skirvin
=cut
###############################################################################
### Version History ###########################################################
###############################################################################
# 1.2 Tue Jun 13 15:28:02 2006 tskirvin
### Documenting it for distribution with the urlview-news package.
# 1.1 Sun May 21 15:16:39 2006 tskirvin
### Updated how Google downloads work, when they changed their scheme.
# 1.0 2004-05 tskirvin
### Original, working version. I didn't really document it at all back then.