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.