Treffteller
Løsningen er ganske generell og lager automatisk nye tellere for hver side som melder seg på for å bli talt. Løsningen er lite raffinert siden den ikke skiller mellom hvor de besøkende kommer fra og gjør heller ikke noe notat av når treffet skjer. Hovedkomponenten er et Python-script som:
- finner ut hvilken side som skal "telles". Dette gjøres ved å bruke: os.environ['DOCUMENT_URI'].
- ut av denne verdien lages et filnavn ved å erstatte alle tegn som ikke er bokstaver med _.
- dersom fila ikke finnes fra før lages den med 4 kommaseparerte verdier: år, måned, dag , antall treff(=0).
- Dersom fila finnes oppdateres antall treff med +1.
- De 4 verdiene returneres, printes. Det betyr at de legges som en del av den siden som tjeneren sender.
En side som ønsker å benytte seg av en slik teller inkluderer følgende:
<!--#exec cgi="../cgi-bin/hitcount/hitcounter.py" -->
forutsatt at scriptet heter hitcounter.py og at det er plassert som angitt relativt til siden som skal "telles". Filene som inneholder telledata legges i en egen katalog som scriptet kjenner stien til.
Scriptet hitcounter.py ser slik ut:
#! /usr/bin/python
import os,string,datetime
import cgitb; cgitb.enable()
print 'Content-type: text/html\n'
#------------------------------------
# HITCOUNTER
# Making and using a file based on DOCUMENT_URI for each counted page
# Each file has the following contet:
# start-year,start-month,start-day,count
# include something like this in the page that should be counted:
# <!--#exec cgi="../cgi-bin/hitcount/hitcounter.py" -->
# The page should have extension : .shtml
# Relative catalog for data
# each using page will get its own file in this catalog
localCat='../../countdata/'
# pick up the filename we will deal with
fileName=os.environ['DOCUMENT_URI']
# replace all non-letters with underscore
temp=fileName
for ix in range(0,len(temp)-1):
if not (temp[ix] in string.letters):
fileName=string.replace(fileName, temp[ix], '_')
filename=localCat+fileName
# if this file does not exist, we must establish it
txt=''
if not os.path.exists( filename):
now=datetime.date.today()
txt='%s,%s,%s,0'%(now.year,now.month,now.day)
else:
try:
file=open(filename,'r')
txt=file.read()
file.close()
except:
# something went wrong
txt='1814,5,17,0'
# pick up commaseparated pieces of the text
elts=string.split(txt,',')
count=int(elts[3])+1
elts[3]=str(count)
# return the message. change according to format wanted
months=['januar','februar','mars','april','mai','juni',
'juli','august','september','oktober','november','desember']
print '%s treff siden %s. %s %s'%(elts[3],elts[2],months[int(elts[1])-1],elts[0])
# write back
txt='%s,%s,%s,%s'%(elts[0],elts[1],elts[2],elts[3])
try:
outfile=open(filename,'w')
outfile.write(txt)
outfile.close()
except:
print 'Error writing file: '+filename
Installasjon
Hvis du vil installere en slik teller:
- kopier Python-koden ovenfor og plassere den i din cgi-bin katalog, eller en underkatalog. ( pass på rettigheter og format )
- etabler en katalog, f.eks. countdata utenfor cgi-bin katalogen og oppdatere stien i scriptet.
- inkluder noe slikt som: <!--#exec cgi="../cgi-bin/hitcount/hitcounter.py" --> i de filene du ønsker å telle. Husk at de skal ha typen .shtml.