– fordi tiden kræver et MODSPIL

24. Mar 2007

Bannerbytte

 
Modspil.dk var indtil for nylig medlem af "Humanistisk Bannerbytte", en bannerbytte-ordning, der skulle gøre det muligt for humanistisk orienterede hjemmesider at linke til hinanden på en "fancy" måde.

Da den var mest aktiv, omfattede ordningen ca. 10 hjemmesider (bl.a. jeppesandvej.dk, leylatamer.com, humanisme.dk og faklen.dk), men da et par sider lukkedes, uden at flere kom til, besluttede vi, at fire år var længe nok og lukkede ordningen pr. 1. marts i år.

I tilfælde af, at det en dag skulle komme nogen til gavn, følger her det script, der foretager selve bannerbyttet. Det er skrevet i TCL, og ja, det er meget simpelt. Det udvælger banneret for en tilfældig medlemsside bortset fra den, det er ved at vises på, og genererer noget HTML, der viser det.

Nedenstående kode kunne f.eks. gemmes i en fil, der hedder "adfrm.tcl", og køres som CGI-script:
#!/usr/local/bin/tclsh8.3
#Replace top line with path to TCL on your system

package require math

####     CONFIGURATION OPTIONS     ####

#change this to wherever you store the banners
set ImageBase "/img"
#path to config file
set ConfigFile "banner/members.cfg"
# set to 1 to enable logging
set Logging 0

####     NO MORE CONFIGURATION REQUIRED    ####

#initialize indexes of positions in config file - this will 
#change, if/when this is reimplemented using a database

set IDIndex 0
set NameIndex 1
set URLIndex 2
set AltIndex 3
set ImgIndex 4

set height 60
set width 468
#Parse query string

if [info exists env(QUERY_STRING)] {
   set args $env(QUERY_STRING)
}
if ![info exists args] {
  #debugging
  set args $argv
 }
#The query string only contains the ID of the referring member site -
#include more params later? anyway ...
set id [lindex [split $args =] 1]

#open configuration file
set f [open $ConfigFile "r"]
set count 0
while {![eof $f]} {

 gets $f InputString
 set InputFields [split $InputString |]
 set CurrentId [lindex $InputFields $IDIndex]
 if {$CurrentId != $id} {
   incr count 1
   #Fill in the rest of these fields
   set ConfigLines($count) $InputString
 }
 if {$CurrentId == $id} {
   set SourceLine $InputString
 }
}

#filen har gjort sin pligt, filen kan gaa
close $f

set ChosenIndex [eval ::math::random 1 $count]

set ChosenSite [split $ConfigLines($ChosenIndex) |]

set ChosenID [lindex $ChosenSite $IDIndex]
set ChosenName [lindex $ChosenSite $NameIndex]
set ChosenURL [lindex $ChosenSite $URLIndex]
set ChosenAlt [lindex $ChosenSite $AltIndex]
set ChosenImageFile [lindex $ChosenSite $ImgIndex]
set OutputString [format "<a href=\"http://%s\" target=\"top\"> \
<img src=\"%s/%s\" border=\"0\" alt=\"%s\" height=\"$height\" width=\"$width\">\
</a>"  $ChosenURL $ImageBase $ChosenImageFile $ChosenAlt $height $width]
puts "Content-type: text/html\n"
puts $OutputString

# Now write an entry to the log

if { $Logging == 1 } {

   if {![info exists SourceLine]} {
      set SourceName "unknown"
    }

   if {![info exists SourceName]} {
      set SourceSite [split $SourceLine |]
      set SourceName [lindex $SourceSite $NameIndex]
   }

   set logfile [open "logs/banner_displays" "a"]
   set output "[exec date] $SourceName $ChosenURL $env(REMOTE_HOST) "
   puts $logfile $output
   close $logfile
}
Ordningens medlemmer sættes op i en konfigurationsfil, der skal være som i følgende eksempel:
1|Navn|www.url.com|Beskrivelse |bannerfil.jpg
2|Navn2|www.url2.com|Beskrivelse 2|bannerfil2.jpg
... 
Der må gerne være huller i talrækken, men det duer ikke at bruge det samme tal to gange.

For at vise banneret på en side, skal man bare inkludere nedenstående HTML-kode et vilkårligt sted på siden (med "DIN-URL" og "7" erstattet af bannerordningens adresse og sidens ID i konfigurationsfilen), og du er in business:
<iframe src="http://www.DIN-URL.dk/cgi-bin/adfrm.tcl?id=7" 
type="text/html" WIDTH="468" HEIGHT="60" MARGINWIDTH="0" 
MARGINHEIGHT="0" FRAMEBORDER="0" SCROLLING="no"> </iframe>
Ekstraopgaver
Her er et par ting, jeg har tænkt på at lave, mens ordningen fungerede, men som er lidt uaktuelle lige nu:

1) Udvid scriptet, så det udnytter log-filen til at fordele antal visninger af et banner på ordningens øvrige sider efter, hvor ofte den pågældende side selv viser banneret (altså: Mere reklame og hermed trafik til dem, der giver mest).
2) Lav scriptet om, så det bruger PHP i stedet for TCL - så det ikke er nødvendigt at køre det som CGI-script.

Disse opgaver overlader vi trygt i læserens hånd.

Kommentarer: