WinBatch Tech Support Home

Database Search

If you can't find the information using the categories below, post a question over in our WinBatch Tech Support Forum.

TechHome

WinHttpRequest

Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.

Query Yahoo GeoCode

 Keywords: JSON Yahoo GeoCode API MSScriptControl.ScriptControl Javascript 

This script illustrates querying and parsing JSON data for Yahoo's geocode API. The script is commented and the outputs reflect the queries suggested in the script. You will need your own appid (free, easy to get and link inlcuded in script) to test this.

Rather than using a .wsc for the JSON parsing I used the MsScriptControl which worked well.

Yahoo permits about a 100 times more queries per daya than Google which makes it more useful for building a lookup database.

This is bare-bones introductory stuff, but more and more sites employ JSON so it makes for good practice.

;Winbatch 2011A - Querying with the Yahoo Geocode API
;                 Specifically looking for WOEID
;                 Then apply it to get weather for that address
;
;UPDATE:  original post: Stan Littlefield September 26, 2011
;Stan Littlefield July 28, 2012
;////////////////////////////////////////////////////////////////////////////////////////////////
GoSub udfs
IntControl(73,1,0,0,0)

addusa =1
cText=""
cINI=DirScript():"temp.ini"
If FileExist(cINI) Then FileDelete(cINI)
cLoc="1600 Pennsylvania Avenue, NW Washington, DC 20500"
cLoc=StrReplace(cLoc," ","%%20")
cWOEID=""
;a Yahoo Developer id is required
;http://developer.yahoo.com/geo/geoplanet/
;the above url is a good starting point
id="[yahoo appid]" ;put your actual appid in
If addusa==1
   cURL="http://where.yahooapis.com/geocode?location=%cLoc%&countrycode=US&gflags=ACR&appid=%id%&flags=JTR";
Else
   cURL="http://where.yahooapis.com/geocode?location=%cLoc%&gflags=ACR&appid=%id%&flags=JTR";
EndIf
oHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
oHTTP.Open("GET", cURL, @FALSE)
oHTTP.Send()
oHTTP.WaitForResponse()
cData=oHTTP.ResponseText
;for debugging //
Message("",cData)
;////////////////

oHTTP=0
;parse JSON
oScript=CreateObject("MSScriptControl.ScriptControl")
oScript.language = "javascript"
oScript.addcode(CreateCode()) ;adds jscript function from UDF

If StrIndex(cData,"Results",0,@FWDSCAN) ;valid data is returned
   cText = oScript.Eval(StrCat( "getit('",cData,"')") )
   cText="[Main]":@CRLF:cText
   FilePut(cINI,cText)
Else
   Display(2,"No Data Returned","Could Not Parse":@CRLF:cLoc)
EndIf

If FileExist(cINI) Then cWOEID = IniReadPvt("Main","WOEID","",cINI)

If cWOEID<>""
   cText=""
   ;default is XML
   ;cURL="http://weather.yahooapis.com/forecastrss?w=":cWOEID
   ;but I found out you could request as JSON
   cURL="http://weather.yahooapis.com/forecastjson?w=":cWOEID
   oHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
   oHTTP.Open("GET", cURL, @FALSE)
   oHTTP.Send()
   oHTTP.WaitForResponse()
   cData=oHTTP.ResponseText
   ;debug///////////
   Message("",cData)
   ;///////////////
   oScript.addcode(CreateCode1()) ;adds jscript function from UDF
   cText = oScript.Eval(StrCat( "geturl('",cData,"')") )
   IniWritePvt("Main","URL",cText,cINI)
   FilePut(cINI,StrReplace(FileGet(cINI),@CRLF:@CRLF,@CRLF))
   Message("",FileGet(cINI))
EndIf

oScript=0
Exit

:WBERRORHANDLER
oScript=0
ErrorProcessing(1,1,0,0)
Exit

;///////////////////////////////////////////////////////////////////////////////////////////////

:udfs

#DefineSubRoutine CreateCode() ;for .ini output
var=""
var=var:"function getit(jdata)":@CRLF
var=var:"{":@CRLF
var=var:"   var J= eval('(' + jdata + ')');":@CRLF
var=var:"   var oCount=J.ResultSet.Results.length;":@CRLF
var=var:'   var S = "";':@CRLF
var=var:'   for(i = 0; i < oCount; i++) {':@CRLF
var=var:'      S=S.concat("Locale=",J.ResultSet.Locale,"\n");':@CRLF
var=var:'      S=S.concat("Quality=",J.ResultSet.Quality,"\n");':@CRLF
var=var:'      S=S.concat("Country=",J.ResultSet.Results[i].countrycode,"\n");':@CRLF
var=var:'      S=S.concat("State=",J.ResultSet.Results[i].statecode,"\n");':@CRLF
var=var:'      S=S.concat("City=",J.ResultSet.Results[i].city,"\n");':@CRLF
var=var:'      S=S.concat("County=",J.ResultSet.Results[i].county,"\n");':@CRLF
var=var:'      S=S.concat("Areacode=",J.ResultSet.Results[i].areacode,"\n");':@CRLF
var=var:'      S=S.concat("TimeZone=",J.ResultSet.Results[i].timezone,"\n");':@CRLF
var=var:'      S=S.concat("Zipcode=",J.ResultSet.Results[i].uzip,"\n");':@CRLF
var=var:'      S=S.concat("Latitude=",J.ResultSet.Results[i].latitude,"\n");':@CRLF
var=var:'      S=S.concat("Longitude=",J.ResultSet.Results[i].longitude,"\n");':@CRLF
var=var:'      S=S.concat("WOEID=",J.ResultSet.Results[i].woeid,"\n");':@CRLF
var=var:'      S=S.concat("WOEType=",J.ResultSet.Results[i].woetype,"\n");':@CRLF
var=var:'      S=S.concat("\n");':@CRLF
var=var:'   }':@CRLF
var=var:'   return S;':@CRLF
var=var:'}':@CRLF
Return (var)

#EndSubRoutine


#DefineSubRoutine CreateCode1()
var=""
var=var:"function geturl(jdata)":@CRLF
var=var:"{":@CRLF
var=var:"   var J= eval('(' + jdata + ')');":@CRLF
var=var:'   var S = "";':@CRLF
var=var:'      S=S.concat(J.url,"\n");':@CRLF
var=var:'   return S;':@CRLF
var=var:'}':@CRLF
Return (var)

#EndSubRoutine


#DefineFunction isObject(obj)
Return(VarType(obj)>=1024)
#EndFunction

#DefineSubRoutine ErrorProcessing(deleteIni,showerr,logfile,Err_Array)
If VarType(Err_Array) ==256
   WbError = Err_Array[0]
   wberrorhandlerline = Err_Array[1]
   wberrorhandleroffset = Err_Array[2]
   wberrorhandlerassignment = Err_Array[3]
   wberrorhandlerfile = Err_Array[4]
   wberrortextstring = Err_Array[5]
   wberroradditionalinfo = Err_Array[6]
   wberrorinsegment = Err_Array[7]
Else
   WbError = LastError()
EndIf
WbTextcode = WbError
If WbError==1668||WbError==2669||WbError==3670
   WbError = ItemExtract(1,IntControl(34,-1,0,0,0),":")
   WbTextcode = -1
EndIf
WbErrorString = IntControl(34,WbTextcode,0,0,0)
WbErrorDateTime = TimeYmdHms()
If deleteIni
   WbErrorFile = StrCat(ShortCutDir( 'AppData', 0, 0 ),'\WinBatch\Settings\')
   If ! DirExist(WbErrorFile) Then WbErrorFile = DirWindows(0)
   WbErrorFile = StrCat(WbErrorFile,"WWWBATCH.INI")
   FileDelete(WbErrorFile)
   IniWritePvt(WbErrorDateTime,"CurrentScript",WbErrorHandlerFile      ,WbErrorFile)
   IniWritePvt(WbErrorDateTime,"ErrorValue"   ,WbError                 ,WbErrorFile)
   IniWritePvt(WbErrorDateTime,"ErrorString"  ,WbErrorString           ,WbErrorFile)
   IniWritePvt(WbErrorDateTime,"ScriptLine"   ,WbErrorHandlerLine      ,WbErrorFile)
   IniWritePvt(WbErrorDateTime,"ScriptOffset" ,WbErrorHandlerOffset    ,WbErrorFile)
   IniWritePvt(WbErrorDateTime,"VarAssignment",WbErrorHandlerAssignment,WbErrorFile)
   IniWritePvt(WbErrorDateTime,"VarInSegment" ,WbErrorInSegment,WbErrorFile)
   IniWritePvt("","","",WbErrorFile)
EndIf
WbErrorMsgText = StrCat(WbErrorDateTime,@CRLF)
WbErrorMsgText = StrCat(WbErrorMsgText,"Current Script: ",WbErrorHandlerFile,@CRLF)
WbErrorMsgText = StrCat(WbErrorMsgText,"Error# [",WbError,"]",@CRLF)
WbErrorMsgText = StrCat(WbErrorMsgText,"Error Text: ",wberrortextstring,@CRLF)
WbErrorMsgText = StrCat(WbErrorMsgText,"[Extended Information] ",wberroradditionalinfo,@CRLF,@CRLF)
WbErrorMsgText = StrCat(WbErrorMsgText,"On Line:",@CRLF,WbErrorHandlerLine,@CRLF)
;WbErrorMsgText = StrCat(WbErrorMsgText,"Offset: ",WbErrorHandlerOffset,@CRLF)
If (WbErrorHandlerAssignment>"") Then %WbErrorHandlerAssignment% = "UNKNOWN"
WbErrorMsgText = StrCat(WbErrorMsgText,"Assignment/Variable: ",WbErrorHandlerAssignment,@CRLF)
If (WbErrorInSegment>"") Then WbErrorMsgText = StrCat(WbErrorMsgText,"In UDF/UDS: ",WbErrorInSegment,@CRLF)
If logfile
   cSep = StrCat(StrFill("=",50),@CRLF)
   cLogFile = StrCat(DirScript(),"log.err")
   If ! FileExist(cLogFile) Then FilePut(cLogFile,StrCat("Error Log",@CRLF,cSep))
   FilePut(cLogFile,StrCat(FileGet(cLogFile),WbErrorMsgText,cSep))
   Display(2,"An Error Occured",StrCat("written to ",cLogFile))
Else
   If showerr
      WbErrorMsgText = StrCat(WbErrorMsgText,"[THIS ERROR NOT WRITTEN TO LOG FILE]",@CRLF)
      Message("An Error Was Encountered",WbErrorMsgText)
   EndIf
EndIf
Return(1)
#EndSubRoutine

Return
;///////////////////////////////////////////////////////////////////////////////////////////////


Article ID:   W18212
Filename:   Query Yahoo GeoCode.txt
File Created: 2012:07:30:07:50:46
Last Updated: 2012:07:30:07:50:46