#!/usr/bin/perl use LWP::UserAgent; use JSON; use Data::Dumper; use utf8; my $WOEID = $ARGV[0]; my $APPID = '<enter your appid here>'; my $YAHOO = "http://where.yahooapis.com/v1/place/$WOEID?format=json&appid=$APPID"; my $FBASE = "http://www.freebase.com/view/guid/"; my $WPDIA = "http://en.wikipedia.org/wiki/index.html?curid="; my $FBQRY = "http://api.freebase.com/api/service/search"; my $DEBUG = 0; my $ua = LWP::UserAgent->new; my $response = $ua->get($YAHOO); mydie("Cannot connect to Yahoo API: ".$response->status_line) unless $response->is_success; my $json = $response->decoded_content; my $jsonobj = from_json($json); my $placeName = $$jsonobj{'place'}{'name'}; my $minLat = $$jsonobj{'place'}{'boundingBox'}{'southWest'}{'latitude'}; my $minLon = $$jsonobj{'place'}{'boundingBox'}{'southWest'}{'longitude'}; my $maxLat = $$jsonobj{'place'}{'boundingBox'}{'northEast'}{'latitude'}; my $maxLon = $$jsonobj{'place'}{'boundingBox'}{'northEast'}{'longitude'}; my $query = qq|$placeName&type=/location/citytown&prefixed=true&indent=1&limit=10&blacklist=fus&mql_output=[{"name":null,"key":{"namespace":"/wikipedia/en_id","value":null}}]&mql_filter=[{"type":"/location/location","geolocation":{"latitude>":$minLat,"latitude<":$maxLat,"longitude>":$minLon,"longitude<":$maxLon},"key":{"namespace":"/wikipedia/en_id","value":null}}]|; my $FBURL = $FBQRY . "?query=" . $query; print "FB URL: ".$FBURL."\n" if $DEBUG; my $response = $ua->get($FBURL); mydie("Cannot connect to Freebase: ".$response->status_line) unless $response->is_success; $json = $response->decoded_content; $jsonobj = from_json($json); print $json if $DEBUG; my $status = $$jsonobj{'status'}; print "$status\n" if $DEBUG; if ($status =~ "200"){ # if results array is empty then there is something not working here # (i.e. the coordinates passed by Yahoo are not consistent with the # ones in freebase) my $topcity = $$jsonobj{'result'}[0]; my %output; $output{'woeid'} = $WOEID; $output{'name'} = $$topcity{'name'}; $output{'wpURI'} = $WPDIA . $$topcity{'key'}{'value'}; $output{'fbURI'} = $FBASE . substr $$topcity{'guid'}, 1; my $jsonOutput = new JSON; my $output_json = $jsonOutput->pretty->encode(\%output); utf8::encode($output_json); print $placeName."\n\n"; print $output_json; }else{ # die or signal error } exit; #---------------------------------------------------------------------------- sub mydie{ my ($error) = @_; die "[x] $error\n"; }