From 4b350fb5e986459d250b954db625d6299d6bd630 Mon Sep 17 00:00:00 2001 From: miyagawa Date: Tue, 14 Dec 2004 10:50:39 +0000 Subject: Initial revision git-svn-id: http://svn.bulknews.net/repos/public/WebService-Google-Suggest/trunk@1503 65690182-5df0-0310-9871-95da5a3706e7 --- lib/WebService/Google/Suggest.pm | 115 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 lib/WebService/Google/Suggest.pm (limited to 'lib') diff --git a/lib/WebService/Google/Suggest.pm b/lib/WebService/Google/Suggest.pm new file mode 100644 index 0000000..33446ba --- /dev/null +++ b/lib/WebService/Google/Suggest.pm @@ -0,0 +1,115 @@ +package WebService::Google::Suggest; + +use strict; +use vars qw($VERSION); +$VERSION = '0.01'; + +use Carp; +use LWP::UserAgent; +use URI::Escape; + +use vars qw($CompleteURL); +$CompleteURL = "http://www.google.com/complete/search?hl=en&js=true&qu="; + +sub new { + my $class = shift; + my $ua = LWP::UserAgent->new(); + $ua->agent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); + bless { ua => $ua }, $class; +} + +sub ua { $_[0]->{ua} } + +sub complete { + my($self, $query) = @_; + my $url = $CompleteURL . uri_escape($query); + + my $response = $self->ua->get($url); + $response->is_success or croak "Google doesn't respond well: ", $response->code; + + my $content = $response->content(); + $content =~ /^sendRPCDone\(frameElement, ".*?", new Array\((.*?)\), new Array\((.*?)\), new Array\(""\)\)\;$/ + or croak "Google returns unrecognized format: $content"; + my($queries, $results) = ($1, $2); + my @queries = map { s/^"(.*?)"$/$1/; $_ } split /, /, $queries; + my @results = map { s/^"([\d,]+) results?"$/$1/; tr/,//d; $_+0 } + split /, /, $results; + return map { +{ query => $queries[$_], + results => $results[$_] } } 0..$#queries; +} + +1; +__END__ + +=head1 NAME + +WebService::Google::Suggest - Google Suggest as an API + +=head1 SYNOPSIS + + use WebService::Google::Suggest; + + my $suggest = WebService::Google::Suggest->new(); + my @suggestions = $suggest->complete("goog"); + for my $suggestion (@suggestions) { + print "$suggestion->{query}: $suggestion->{results} results\n"; + } + +=head1 DESCRIPTION + +WebService::Google::Suggest allows you to use Google Suggest as a Web Service API to retrieve completions to your search query or partial query. This module is based on Adam Stiles' hack (http://www.adamstiles.com/adam/2004/12/hacking_google_.html). + +=head1 METHODS + +=over 4 + +=item new + + $suggest = WebService::Google::Suggest->new(); + +Creates new WebService::Google::Suggest object. + +=item complete + + @suggestions = $suggest->complete($query); + +Sends your C<$query> to Google web server and fetches suggestions for +the query. Suggestions are in a list of hashrefs, for example with +query "Google": + + @suggestions = ( + { query => "google", results => 122000000 }, + { query => "google toolbar", results => 2620000 }, + ... + ); + +Note that C value does NOT contain commas and "results" text. + +=item ua + + $ua = $suggest->ua; + +Returns underlying LWP::UserAgent object. It allows you to change +User-Agent (Windows IE by default), timeout seconds and various +properties. + +=back + +=head1 AUTHOR + +Tatsuhiko Miyagawa Emiyagawa@bulknews.netE + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +This module gives you B. + +=head1 SEE ALSO + +http://www.adamstiles.com/adam/2004/12/hacking_google_.html + +http://www.google.com/webhp?complete=1&hl=en + +http://labs.google.com/suggest/faq.html + +=cut -- cgit 1.4.1