Lately I've found a real interest in hacking around web 2.0 APIs. What i really love about this new web and all it's REST interfaces is that all the data is there, and the ability to do whatever you want to it is there also. At most it's fiddling with a few URLs, maybe chaining a few together. You can make your own APIs into any service you want.
Todays I wanted to play around with the Google Street View. It seems really interesting, but google doesn't offer a public API. I wanted a way to type in an address and find the Street View pictures around that address. Eventually i might make a wrapper api and probably a rails plugin, but for now i was just interested in seeing how it worked. This is what i ended up with
First things first, view the source and see how it get's the information. Unfortunately, Google presents the street view in a flash application. This usually makes my job harder because I can't look in the source code to see where it's pulling the images from. Luckily, I have Firefox's LiveHTTPHeaders plugin.
LiveHTTPHeaders is a plugin that allows you to see all the calls that your browser makes. Whenever it pulls in a website, an image, a script, it will be logged here.
The SWF file still pulls in all it's images via AJAX(ish) calls. Now that i've found an area with some street view info i can see where it's getting the images from. Launch the HTTPHeader plugin -> Drag Street View around a bit to pull in new images -> View plugin logs.
Many of the urls called here are uninteresting. JS Callbacks, Arrow images, but we've hit gold with the urls accessing cbk (whatever that stands for)
Ex A: http://cbk0.google.com/cbk?output=tile&panoid=dFe0IGjaC3rLQGHUTChJDQ&zoom=3&x=5&y=2
Well what do we have here. It's a URL that gives us one frame of the panorama. It has a few parameters: output=tile, panoid=garbage, zoom=3, x=5, y=2. You'll notice that you can fiddle with different parameters. Changing x=? will turn the camera side to side and y=? will move it up and down. I'm guessing zoom will zoom in and out, but a lot of times they only offer one zoom. This is the key to hacking these things, just play around and see what makes it tick.
Cool! once we've got a location, we now know how to navigate around it. Now we just need to know how to find a location in the first place. It looks like we need to mess with panoid. My first guess was this was some type of hash of the lat/long values. It might be, but it's nothing we can generate. Luckily, with some googling for 'panoid' and google maps i stumbled across this URL.
Ex B: http://maps.google.com/cbk?output=xml&ll=37.4451,-122.125577
Voila, we give it a latitude and longitude, it gives us the pano_id. It also gives us some information on what we can do with it: zoom levels, what streets you're one, etc. But all i want from this now is the panoid.
So now we can take any latitude and longitude, plug it into example B, then take the pano_id from there and plug it into example A. If that location has street view data, we're golden.
Now, lat lons are a little user-unfriendly. Luckily most maps services offer a geolocation public API to convert addresses and places of interest to Lat/longs. I used http://geokit.rubyforge.org/, a rails plugin to do it. Since these APIs are public i'm not going to go into detail on how to use them, but once you have one working we can now go from
Address -> lat lon -> panoid -> Glorious street view data.
This isn't the most useful of experiments since there's only data in a few select areas, but it's cool to try out in san francisco and a few others. It will be much cooler when they get some serious coverage, but by then they'll have changed the API I'm sure.
If anyone writes a plugin or wrapper for this let me know!