Serveradmindowntime
ServerAdmin Downtime - rockin' ASCII art, retail API CLI browser for BASH.
Install / Use
/learn @speeves/ServeradmindowntimeREADME
ServerAdmin Downtime
ServerAdmin Downtime is a command-line web services browser. It is my tongue-in-cheek entry for Recommerce Hack Day (http://www.recommerceday.com) on Sept. 17, 2011. It allows one to search various APIs, and browse ASCII art versions of their catalog. It has a simple, driver interface, allowing you to add any searchable JSON-returning web server API. It was fun to participate with the Zappos team, and Sierra Trading Post, whos APIs are currently implemented.
Use a BLACK BACKGROUND for best results!
INSTALL
I have successfully tested this on a bare Debian Squeeze with the following additional packages:
apt-get install imagemagick html2text spidermonkey-bin
NOTE: spidermonkey-bin has been dropped from Ubuntu 11.04 Natty, so I compiled from source for the competition.
ADD DRIVERS
- copy an existing driver: cp /appinstall/location/drivers/Sierra_Trading_Post.sh /appinstall/location/drivers/Zappos.sh
- create a matching images folder to hold your related images mkdir /appinstall/location/images/Zappos
- copy your favorite homepage image into the new folder, (NOTE: I found that large letters at about 1200xsomething worked nicely) cp mylogo.jpg /appinstall/location/images/Zappos
- copy your favorite error photo into the same folder cp myerror.jpg /appinstall/location/images/Zappos
- open your driver file in your favorite editor emacs /appinstall/location/drivers/Zappos.sh 5a. modify your driver variables:
DRIVERNAME="Sierra_Trading_Post" HOMEPAGEPIC="sierra2.jpg" APIURL="http://apps.sierratradingpost.com/api/1.0/products/search" SIERRAAPIKEY="MYAPIKEY"
to:
DRIVERNAME="Zappos" HOMEPAGEPIC="zappos.jpg" APIURL="http://api.zappos.com/Search" APIPRODUCTURL="http://api.zappos.com/Product/id/" ZAPPOSAPIKEY="MYAPIKEY"
5b. change setitemvariables() to reflect the JSON for your API
setitemvariables() { ITEMID=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].Id") ITEMNAME=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].Name") ITEMURL=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].Url") ITEMWEBURL=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].WebUrl")
# REVIEWS
ITEMREVIEWSURL=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].Reviews.ReviewsUrl")
ITEMREVIEWSCOUNT=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].Reviews.ReviewCount")
ITEMREVIEWSAVERAGERATING=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].Reviews.AverageRating")
# SIZES
ITEMSIZES=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].SizesAvailable.SIZE")
# IMAGE
ITEMIMAGEMEDIUM=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].Images.PrimaryMedium")
ITEMIMAGESMALL=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].Images.PrimarySmall")
#DESCRIPTION
ITEMDESCRIPTIONHTMLSIMPLE=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].DescriptionHtmlSimple")
# PRICING
ITEMLISTPRICE=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].ListPrice")
ITEMFINALPRICE=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Result[${ITER}].FinalPrice")
}
to:
setitemvariables() { ITEMSTATUSCODE=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.statusCode")
ITEMSTYLEID=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.results[${ITER}].styleId")
ITEMPRICE=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.results[${ITER}].price")
ITEMORIGINALPRICE=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.results[${ITER}].originalPrice")
ITEMPRODUCTURL=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.results[${ITER}].productUrl")
ITEMCOLORID=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.results[${ITER}].colorId")
ITEMPRODUCTNAME=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.results[${ITER}].productName")
ITEMBRANDNAME=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.results[${ITER}].brandName")
ITEMTHUMBNAILIMAGEURL=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.results[${ITER}].thumbnailImageUrl")
ITEMPERCENTOFF=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.results[${ITER}].percentOff")
ITEMPRODUCTID=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.results[${ITER}].productId")
ITEMTERM=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.term")
ITEMCURRENTRESULTCOUNT=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.currentResultCount")
ITEMTOTALRESULTCOUNT=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.totalResultCount")
}
6c. unset those variables in unsetitemvariables():
unsetitemvariables() { unset ITEMID unset ITEMNAME unset ITEMURL unset ITEMWEBURL
# REVIEWS
unset ITEMREVIEWSURL
unset ITEMREVIEWSCOUNT
unset ITEMREVIEWSAVERAGERATING
# SIZES
unset ITEMSIZES
# IMAGE
unset ITEMIMAGE
#DESCRIPTION
unset ITEMDESCRIPTIONHTMLSIMPLE
# PRICING
unset ITEMLISTPRICE
unset ITEMFINALPRICE
}
to:
unsetitemvariables() { unset ITEMSTATUSCODE
unset ITEMSTYLEID
unset ITEMPRICE
unset ITEMORIGINALPRICE
unset ITEMPRODUCTURL
unset ITEMCOLORID
unset ITEMPRODUCTNAME
unset ITEMBRANDNAME
unset ITEMTHUMBNAILIMAGEURL
unset ITEMPERCENTOFF
unset ITEMPRODUCTID
unset ITEMTERM
unset ITEMCURRENTRESULTCOUNT
unset ITEMTOTALRESULTCOUNT
}
6d. do the same with setsearchresultcount()
setsearchresultcount() { RESULTCOUNT=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.Count") }
to:
setsearchresultcount() { RESULTCOUNT=$(echo ${SEARCHJSON} | ${JSAWKME} "return this.totalResultCount") }
6e. etc. etc. etc. You get the 'picture'...
THANKS
- Crystal Chang, the boss of the Zappos API team, for contacting me and inviting me out to the competition. (Thank you!)
- The rest of the Zappos API team, and developers, who made me feel welcome and kept me safe on Fremont St. (That's you, Will!)
- Mike Tran from Sierra Trading Post (http://www.sierratradingpost.com) hanging out and supporting my wild ideas! (I still think there is something to that concierge idea of yours!)
- Micha Niskin, creator of jsawk, without which I would still be figuring out a way to parse my JSON with BASH. (https://github.com/micha)
- For everything!
