Crear un contador gráfico en ASP

Introducción

Muchas de las páginas web que hemos visitado tienen un contador que indica las veces que ha sido visitada esta.

Estos contadores están hecho con un programa CGI, donde cuando se carga la página, una etiqueta HTML, normalmente la IMG, hace referencia al programa CGI, devolviendole este un gráfico que será representado por esta etiqueta y que muestra un número.

Hasta ahora, los contadores gráficos solo los tenian los que tuvieran permiso en su servidor para poner cgis. El resto podía cogerlos de sitios web que los ofrecían, generalmente poniendo publicidad.

Pero llegarón los sitios web que ofrecen almacenamiento de páginas ASP gratuitamente (http://www.domaindlx.com) , y con esto se ha abierto un montón de posibilidades, ya que el ASP es sencillo de programar, puedes acceder a bases de datos, crear cookies, páginas web dinamicamente, controlar el contenido, etc.

Por eso, me decidí a hacer algo diferente, algo que aún nadie se ha encargado de hacer, o al menos eso creo. Cogí un ejemplo de un contador que estaba hecho en C para un cgi, creado por Frans van Hoesel ([email protected]) y lo traducí a ASP, logrando así un contador de páginas web hecho en este lenguaje. Pero esto no quedó así, sino que lo fui adaptando a nuevas necesidades, con lo que al final creé un programa ASP que era capaz de controlar las visitas de un numéro ilimitado de sitios desde una base de datos, además de que servía igualmente para contar el número de veces que una página había sido visitada o el número de veces que un fichero había sido bajado de un servidor.

Pues bién, los ejemplos anteriores se basan en el codigo del programa ASP que a continuación os expongo, es de libre uso, aunque no estaría de más que si lo modificais y/o lo usuais, hagais una referencia a su creador, es decir, Oscar Rodriguez Parra [email protected]

Código del contador gráfico en ASP

El codigo se basa en el formato de imagen x11 bitmap, que consiste en una imagen en blanco y negro, cuyo formato es como sentencias en C, es decir, se usa la directiva #define para indicar el ancho y alto de la imagen, y los datos de la misma se guardan en un array estatico de caracteres en formato hexadecimal. Para quien sepa C, sabrá lo que digo :)

Los parametros que se le pueden pasar al programa ASP son tres (todos por metodo GET):

La tabla contadores que usa el programa tiene el siguiente formato:

NombreTipo DatoDescripción
codigoentero largo autonumérico clave primariaCodigo único que identifica a cada contador
urlcadena 150 caracteresURL del fichero o de la página web
hitsentero largoNúmero de visitas que lleva el contador

El resto es muy sencillo de entender, asi que os paso con el codigo. De todas formas, si teneis alguna duda podeís ver los ejemplos de los enlaces que he puesto arriba, y si la seguis teniendo, enviadme un email a [email protected]

<%@ LANGUAGE=VBScript %> <% ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' ' CONTADOR GRAFICO DE PAGINAS WEB O FICHEROS ' ' por Oscar Rodríguez Parra orp@softhome.net ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Definimos un array donde guardaremos todos los bytes que conforman los números graficos 'Son 160 posiciones porque son 10 numeros (del 0 al 9) que ocupan 16 lineas cada uno 'Cada 16 lineas se forma un número empezando por el 0, y cada bit de cada linea representa una 'columna dim numeros(160) numeros(0)= &hff numeros(1)= &hff numeros(2)= &hff numeros(3)= &hc3 numeros(4)= &h99 numeros(5)= &h99 numeros(6)= &h99 numeros(7)= &h99 numeros(8)= &h99 numeros(9)= &h99 numeros(10)= &h99 numeros(11)= &h99 numeros(12)= &hc3 numeros(13)= &hff numeros(14)= &hff numeros(15)= &hff numeros(16)=&hff numeros(17)= &hff numeros(18)= &hff numeros(19)= &hcf numeros(20)= &hc7 numeros(21)= &hcf numeros(22)= &hcf numeros(23)= &hcf numeros(24)= &hcf numeros(25)= &hcf numeros(26)= &hcf numeros(27)= &hcf numeros(28)= &hcf numeros(29)= &hff numeros(30)= &hff numeros(31)= &hff numeros(32)=&hff numeros(33)=&hff numeros(34)=&hff numeros(35)=&hc3 numeros(36)=&h99 numeros(37)=&h9f numeros(38)=&h9f numeros(39)=&hcf numeros(40)=&he7 numeros(41)=&hf3 numeros(42)=&hf9 numeros(43)= &hf9 numeros(44)= &h81 numeros(45)= &hff numeros(46)= &hff numeros(47)= &hff numeros(48)=&hff numeros(49)=&hff numeros(50)=&hff numeros(51)=&hc3 numeros(52)=&h99 numeros(53)=&h9f numeros(54)=&h9f numeros(55)=&hc7 numeros(56)=&h9f numeros(57)=&h9f numeros(58)=&h9f numeros(59)= &h99 numeros(60)= &hc3 numeros(61)= &hff numeros(62)= &hff numeros(63)= &hff numeros(64)=&hff numeros(65)= &hff numeros(66)= &hff numeros(67)= &hcf numeros(68)= &hcf numeros(69)= &hc7 numeros(70)= &hc7 numeros(71)= &hcb numeros(72)= &hcb numeros(73)= &hcd numeros(74)= &h81 numeros(75)=&hcf numeros(76)= &h87 numeros(77)= &hff numeros(78)= &hff numeros(79)= &hff numeros(80)=&hff numeros(81)= &hff numeros(82)= &hff numeros(83)=&h81 numeros(84)= &hf9 numeros(85)= &hf9 numeros(86)= &hf9 numeros(87)= &hcf numeros(88)= &h9f numeros(89)= &h9f numeros(90)= &h9f numeros(91)=&h99 numeros(92)=&hc3 numeros(93)=&hff numeros(94)=&hff numeros(95)=&hff numeros(96)=&hff numeros(97)= &hff numeros(98)= &hff numeros(99)= &hc7 numeros(100)=&hf3 numeros(101)= &hf9 numeros(102)= &hf9 numeros(103)= &hcf numeros(104)= &h99 numeros(105)= &h99 numeros(106)=&h99 numeros(107)= &h99 numeros(108)= &hc3 numeros(109)=&hff numeros(110)= &hff numeros(111)= &hff numeros(112)=&hff numeros(113)= &hff numeros(114)= &hff numeros(115)= &h81 numeros(116)=&h99 numeros(117)= &h9f numeros(118)= &h9f numeros(119)= &hcf numeros(120)= &hcf numeros(121)= &he7 numeros(122)= &he7 numeros(123)= &hf3 numeros(124)= &hf3 numeros(125)= &hff numeros(126)= &hff numeros(127)= &hff numeros(128)=&hff numeros(129)=&hff numeros(130)=&hff numeros(131)=&hc3 numeros(132)=&h99 numeros(133)=&h99 numeros(134)=&h99 numeros(135)=&hc3 numeros(136)=&h99 numeros(137)=&h99 numeros(138)=&h99 numeros(139)= &h99 numeros(140)= &hc3 numeros(141)= &hff numeros(142)= &hff numeros(143)= &hff numeros(144)=&hff numeros(145)=&hff numeros(146)=&hff numeros(147)=&hc3 numeros(148)=&h99 numeros(149)=&h99 numeros(150)=&h99 numeros(151)=&h99 numeros(152)=&h83 numeros(153)=&h9f numeros(154)=&h9f numeros(155)= &hcf numeros(156)= &he3 numeros(157)= &hff numeros(158)= &hff numeros(159)= &hff 'Abrimos la conexión para posteriormente abrir una base de datos de Access Set BD = Server.CreateObject("ADOdb.Connection") BD.Open "DRIVER={Microsoft Access Driver (*.mdb)}; " & "DBQ=" & Server.Mappath("/db/bbdd.mdb") 'Si recibimos el parámetro inc con valor y, entónces incrementamos el número de visitas if lcase(Request.QueryString("inc"))="y" then CadenaSQL="UPDATE contadores set hits=hits+1 where codigo=" & Request.QueryString("id") BD.Execute cadenaSQL end if 'A continuación recogemos los valores de las visitas realizadas y la url que apunta a la 'página web o fichero cadenaSQL="select hits,url from contadores where codigo=" & Request.QueryString("id") set ejecuta=BD.Execute(cadenaSQL) 'Si recibimos el parámetro dow con valor y, entónces es que queremos que se descargue el 'fichero, por lo que lo redireccionamos a la url del mismo (ya no se jecuta nada más) if lcase(Request.QueryString("dow"))="y" then Response.Redirect ejecuta.fields(1) 'Ahora creamos una cadena de 7 cifras donde almacenaremos el número de visitas dato=ejecuta.fields(0) numero=string(7-len(dato),"0") & dato 'Indicamos que el tipo MIME de datos que vamos a enviar al explorador es image/x-xbitmap, y que 'expira inmediatamente para que no se quede en la cache Response.ContentType = "image/x-xbitmap" Response.Expires=0 'Empezamos a crear la estructura del bitmap definiendo sus anchura y altura cadena="#define count_width 56" & vbcrlf cadena=cadena & "#define count_height 16" & vbcrlf cadena=cadena & "static char count_bits[]={" & vbcrlf 'Este bucle crea cada una de las 16 lineas de los 7 números que conforman el contador for i=0 to 15 for x=1 to 7 valor((asc(mid(numero,x,1))-&h30)*16+i) cadena=cadena & "," next next cadena=mid(cadena,1,len(cadena)-1) 'Y por fin imprimimos el ultimo caracter, se sale y el usuario verá el contador Response.Write cadena & "};" 'Esta función convierte un valor a un número hexadecimal en codigo C Sub Valor(i) cadena=cadena & "0x" if (numeros(i)/16)<10 then cadena=cadena & chr(int(numeros(i)/16) + &h30) else cadena=cadena & chr(int(numeros(i)/16) + 65-10) end if if (numeros(i) mod 16)<10 then cadena=cadena & chr(int(numeros(i)) mod 16 + &h30) else cadena=cadena & chr(int(numeros(i)) mod 16 + 65-10) end if end sub %>