Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.
Keywords: JSON Yahoo GeoCode API MSScriptControl.ScriptControl Javascript
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