Windows Script Host as JSON shell

When hosted by your server, the web_send library turns your Firebug console into a command line for your server-side application. The same code can also be run by the Windows Script Host, a standard part of all Windows releases since Windows 98. Doing so has two big advantages:

As a result, you have a command line for all JSON resources on the Web. The world is at your fingertips!


All of the required files are in the same subversion repository used for web_send. Just double-click the jsh.lnk file to launch the shell.

Using the shell

Launching the shell opens a rather plain looking DOS command shell with a '; ' prompt in the top left corner. At this prompt, you can enter any JavaScript to be eval()'d. The computed value is output as a JSON string, prefixed by '// '. Both the lib.Q and lib.web libraries have been loaded and are in the global scope, along with ADSAFE and JSON; so you can enter commands just as you do in the Firebug console. For example:

; 1 + 1
// 2

; var factory = lib.web._ref(null,
; var drum =, 'makeDrum', [])
; var hits = lib.Q.get(drum, 'hits')
; hits
// 0

;, 'bang', [ 1 ])
; hits = lib.Q.get(drum, 'hits')
; hits
// 1

Multi-line expressions

To enter a multi-line JavaScript expression, just follow the JSLint coding style. In particular, the shell assumes that any line that ends with an open bracket, binary operator, comma, or semi-colon will be followed by another line. For example:

;, 'bang', [ 2 ])
; hits = lib.Q.get(drum, 'hits')
; lib.Q.when(hits, function (value) {
      ADSAFE.log('hits = ' + value);
  }, function (reason) {
      ADSAFE.log('failed: ' + reason);
// hits = 3

If the shell expects a continuation of the previous line, it outputs a two space indent; otherwise, it outputs the '; ' prompt. Together with the '// ' prefix for output, these conventions mean you can copy and paste the entire screen to replay a scripting session.


Now that you're free from the Same Origin Policy, try out what the Web has to offer.

Google AJAX Search API

Google offers a JSON-enabled public search API. Using this service from a web_send shell is a breeze. For example:

; var search = lib.web._ref(null,
; var results = lib.Q.get(search, 'Paris Hilton')
; var feelingLucky = lib.Q.when(results, function (value) {
      return value.responseData.results[0].url;
; feelingLucky
// ""

Yahoo! Query Language

Yahoo offers a JSON-enabled query engine for structured data on the Web. A wide array of data sources can be accessed via the YQL service. For example:

; var yql = lib.web._ref(null,
      '', { format: 'json' })
; var sf = lib.Q.get(yql,
      'select * from geo.places where text="san francisco, ca"')
; var x = lib.Q.when(sf, function (value) {
; x
// {
//  "latitude": "37.77916",
//  "longitude": "-122.420067"
// }

These queries can sometimes take a little longer, so you may have to check the value of 'x' a few times before the promise resolves.


Twitter provides JSON-enabled access to user comments. For example:

; var twitter = lib.web._ref(null,
; var prez = lib.Q.get(twitter, 'from:BarackObama')
; var lastWord = lib.Q.when(prez, function (value) {
      return value.results[0].text;
; lastWord
// "Join Organizing for America to fight for real health care reform.
Host or at tend a Health Care Organizing Kickoff:

This one can take a while to resolve (when it comes back at all ;).


Flickr offers a JSON-enabled services API. Unfortunately, an API key is required for even the simplest of queries. The key will be granted in real time though. For example:

; var flickrKey = // your flickr API key here
; var flickr = lib.web._ref(null,
; var lingLing = lib.web._ref(flickr, '', {
      api_key: flickrKey,
      format: 'json',
      nojsoncallback: 1,
      method: 'flickr.panda.getPhotos',
      panda_name: 'ling ling' })
; var luckyTitle = lib.Q.when(lib.Q.get(lingLing), function (value) {
; luckyTitle
// "jam"