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):
- id es el número que identifica el contador que se usará
- inc que si es igual a y hará que se incremente el contador
- dow que si es igual a y hará que se redireccione al fichero que este asociado con el contador
La tabla contadores que usa el programa tiene el siguiente formato:
Nombre | Tipo Dato | Descripción |
codigo | entero largo autonumérico clave primaria | Codigo único que identifica a cada contador |
url | cadena 150 caracteres | URL del fichero o de la página web |
hits | entero largo | Nú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
%>