Obtener valor del dolar con ASP (2 metodos)

Buscando en varios lugares y despues de usar la primera de las 2 soluciones que muestro a continuacion decidi a intentarlo usando un webservice como el del Banco de Mexico pero al parecer hay un error con su servicio, asi que usare los datos proporcionados via RSS por el DOF (Diario oficial de la Federacion).

Como comente, usaremos 2 metodos para que puedan utilizar el que mejor les acomode, el primero sera usando informacion de HSBC y usando un lector de codigo tomado con XMLHTTP, el segundo es usando el metodo MSXML2.DOMDocument y recorriendo un RSS con el.

Primer metodo, usando como fuente HSBC de Mexico necesitaremos crear una funcion muy simple:
Function tipo_cambio()
'    on error resume next
      Set xml = Server.CreateObject("Microsoft.XMLHTTP")
      xml.Open "GET", "http://www.hsbc.com.mx/1/2/es/personas/divisas", False
      xml.Send
         Cadena = CSTR(xml.responseText)
         PosIni1 = InStr(Cadena,"Americano")
         PosIni2 = InStr(PosIni1,Cadena,"$")
         PosFin  = InStr(PosIni2, Cadena,"<")
       DolarCompra = MID(Cadena, PosIni2-2, PosFin-PosIni2)
         PosIni1 = PosFin
         PosIni2 = InStr(PosIni1,Cadena,"$")
         PosFin  = InStr(PosIni2, Cadena,"<")
       DolarVenta = MID(Cadena, PosIni2-2, PosFin-PosIni2)
      Set xml = Nothing
     
      if instr(DolarCompra,chr(32)) then DolarCompra=replace(DolarCompra,chr(32),"")

    dolar_compra=CDbl(MID(DolarCompra,InStr(DolarCompra,">")+1,LEN(DolarCompra)))
    dolar_venta=CDbl(MID(DolarVenta,InStr(DolarVenta,">")+1,LEN(DolarVenta)))

end function
Este metodo lee todo el codigo de la pagina indicada y busca un punto de inicio y otro de final para la lectura de la informacion, aqui sacamos el tipo de compra y de venta.

Para obtener el valor simplemente lo llamamos asi: dolar=tipo_cambio()
En lo personal lo que hago es crear un archivo donde guardo todas las funciones y lo incluyo en el top de mis paginas y ya nada mas llamo a la funcion que necesito,

El segundo metodo es usando RSS (Repito que intente usar un webservice pero no encontre uno "oficial")

La funcion para este metodo es un poco mas larga pero haciendo algunos ajustes puede servirte para muchas mas cosas ;-)
Function LeeXml(responseText)
 Dim xmlResponse
 Dim xnodelist
 Dim indicadores
 Dim id, uf, usd, euro, utm, tcm, fecha

 indicadores = ""
 If Len(responseText) <> 0 Then
  Set xmlResponse = CreateObject("MSXML2.DOMDocument")
  xmlResponse.async = false
  xmlResponse.loadXml responseText
  Set xnodelist = xmlResponse.documentElement.selectNodes("/rss/channel/item")
  Dim objItem

  For Each objItem In xnodelist
   titulo = objItem.selectSingleNode("title").Text
   descripcion = objItem.selectSingleNode("description").Text
   pubDate = objItem.selectSingleNode("pubDate").Text
   if titulo="DOLAR" then dolar=descripcion
  Next

  indicadores = dolar
 End If

 LeeXml = indicadores
End Function

Function InvocarWebService (strSoap, strSOAPAction, strURL, ByRef xmlResponse)
    Dim xmlhttp
    Dim blnSuccess

  Set xmlhttp = server.CreateObject("WinHttp.WinHttpRequest.5.1")
        xmlhttp.Open "POST", strURL
        xmlhttp.setRequestHeader "Man", "POST " & strURL & " HTTP/1.1"
        xmlhttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
        xmlhttp.setRequestHeader "SOAPAction", strSOAPAction
        call xmlhttp.send(strSoap)

        If xmlhttp.Status = 200 Then
            blnSuccess = True
        Else
           blnSuccess = False
        End If

  xmlResponse = xmlhttp.ResponseText
        InvocarWebService = blnSuccess
        Set xmlhttp = Nothing
End Function
A este metodo falta agregarle en el archivo donde llamaras la funcion algo asi:
<%strFecha = Request.Form("fecha")
strSoap = "<?xml version='1.0' encoding='utf-8'?>"& _
"<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>"& _
"</soap:Envelope>"
strSOAPAction = "Indicadores/Indicadores"
%>
 Y lo llamas asi:
<%
Dim xmlResponse
If InvocarWebService (strSoap, strSOAPAction, "http://www.dof.gob.mx/indicadores.xml", xmlResponse) Then
     'Response.Write(LeeXml(xmlResponse))
    dolar=formatcurrency(LeeXml(xmlResponse),2)
    response.write dolar
Else
    Response.Write "*** Ha ocurrido un Error ***"
End If
Set xmlResponse = Nothing
%>
 En este caso, tomo el valor resultante en la variable dolar, le doy formato con 2 decimales y luego lo imprimo

0 comentarios: