Zu diesem Stück Code gibts eigentlich nich viel zu sagen. Es ist ein Gästebuch was ohne viel Spielzeug auskommt. Die Einträge werden einfach in einer Textdatei gespeichert und das wars. Der ganze Spaß hat noch kleine Spielereien, welche aber bald auch abschaltbar bzw. einfacher Konfigurierbar sein werden. Der Code steht unter der GPL Version 2. Das Gästebuch ist mit Absicht schlicht gehalten, da ich einfaches Design mag und eh nicht so der Fan bin von überladenen Webseiten. Des Weiteren bin ich einfach nur faul ;-) Wäre sehr nett, wenn der Link auf meine Seite erhalten bleiben würde ;-) Das ganze in Aktion sieht man im Gästebuch

Die Features sind:


Die Funktionsweise der Smileys is ganz einfach. es existiert ein Verzeichnis für die Bilder, in diesem Verzeichnis erstellt man dann eine Config (hier z.b. smileys.conf). Diese hat den folgenden Aufbau:

:-) grinsen.jpg

was dann eine Smiley in der Form :-) entspricht. Das Ganze macht man für alle Smileys die man gern drin haben will und schon ist das fertig. Der Vorteil ist, man kann die Bilder mit anderen Bildern in einem Verzeichnis speichern und sobald man die Config angepasst hat, sind die neuen Smileys beim Nächsten aufruf des Scripts verfügbar. Nachteil, bisher werden die Links zu den Bildern direkt in der “Datenbank” gespeichert... Sprich wenn man einen Bild aus der Smiley-Datei löscht wird nur die “Alternative angezeigt. Mal sehen, ob ich das noch ändern werde.

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
 
########################################################################
## File: guestbook.py                                                 ##
## Author: Christian Manes <guschdel@guschdel.net>                    ##
## Date: 03/12/2006                                                   ##
## License: GPL version 2 see http://www.gnu.org for more information ##
##          or have a look at the license.txt shiped with the code    ##
########################################################################
 
import sys
import os
import string
import time 
import cgi
import cgitb; cgitb.enable()
import CaptchasDotNet
 
 
# Captchas.net Parameter setzen
captchas = CaptchasDotNet.CaptchasDotNet (
    client   = 'demo',
    secret   = 'secret',
    alphabet = 'abcdefghkmnopqrstuvwxyz',
    letters  = 6,
    width    = 240,
    height   = 80
    )
 
# Alle Inhalte aus dem Formular einlesen
 
form = cgi.FieldStorage(keep_blank_values = True)
 
if form.has_key("senden"):
    senden = form.getvalue("senden")
    if senden == "Senden":
        senden = True
    else:
        senden = False
else:
    senden = False
    
if form.has_key("name"):
    name = cgi.escape(form.getvalue("name")).strip()
else:
    name = ""
 
if form.has_key("email"):
    email = cgi.escape(form.getvalue("email")).strip()
else:
    email = ""
 
if form.has_key("webseite"):
    webseite = cgi.escape(form.getvalue("webseite")).strip()
else:
    webseite = ""
 
if form.has_key("text"):
    text = cgi.escape(form.getvalue("text")).strip()
else:
    text = ""
 
 
if form.has_key("random"):
    random = form.getvalue("random")
else:
    random = ""
 
if form.has_key("password"):
    password = form.getvalue("password")
else:
    password = ""
 
if form.has_key("start"):
    start = int(cgi.escape(form.getvalue("start")))
    if start is "":
        start = 0
else:
    start = 0
 
def errormsg(msg):
  print "<h2 align=\"center\" style=\"color: red;\">%s</h2>" % (msg)
 
def print_header():
    print "Content-type: text/html"
    print ""
    print """
    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
    <title>guschdel's G&auml;stebuch in Python</title>
    <style type="text/css">
      body { color: #ffffff; background-color: #000000; }
      td.eingabe { font-size: 80%; }
      td.gb { color: #000000; background-color: #dddddd; }
      a.navi { color: #ffffff; text-decoration: none; }
      td.navi { color: #ffffff; font-size: 70%; }
    </style>
    <link rel="SHORTCUT ICON" href="./icons/pyfav.png" type="image/png" />
  </head>
  <body>
    <h3 align=\"center\">Ins G&auml;stebuch eintragen:</h3>
"""
 
def print_footer():
    print "</body></html>"
 
def check_captchas(random_string, password):
    # ueberpruefen ob das Captcha nicht schon mehrmals verwendet wurde
    if not captchas.validate(random_string):
        return 1
    # Passwort ueberpruefen
    else:
        if not captchas.verify(password):
            return 2
        else:
            return 0
 
 
scriptname = sys.argv[0].split(os.sep)
file = "gb.dat"
 
smiley_dir = "./icons/smileys/"
smiley_conf = "smileys.conf"
smileys = {}
try:
    fh = open(smiley_dir + smiley_conf, "r")
except IOError:
    pass
else:
    templist = fh.readlines()
    for i in templist:
        tmp_smile = i.split(" ")
        smileys[tmp_smile[0].strip()] = smiley_dir + tmp_smile[1].strip()
    fh.close()
 
datum = time.strftime("%d.%m.%Y um %H:%M")
 
checked = check_captchas(random, password)
 
print_header()
 
if senden is True:
    if (name is not "") and (text is not ""):
        if checked == 0:
            for key in smileys.keys():
              text = text.replace(key, "<img src=\""+ smileys[key] +"\" alt=\"" + key + "\" />")
            if webseite is not "":
              webseite = "<small>[<a href=\""+ webseite +"\" style=\"text-decoration: none;\" target=\"_blank\">Homepage</a>]</small>"
            if email is not "":
              email = email.replace("@", "_at_")
              email = email.replace(".", "_dot_")
              temp = "<a href=\"mailto:" + email + "\" style=\"text-decoration: none;\">" + name + "</a> " + webseite + "||"+ datum +" ||" + text + "\n"
            else:
              temp = name + " " + webseite + "||" + datum + "||" + text + "\n"
            try:
              fh = open(file, "a")
            except IOError:
              errormsg("Konnte nicht in Datenbank schreiben!!!")
              sys.exit(1)
            else:
              fh.write(temp)
              fh.close
              email = ""
              name = ""
              webseite = ""
              text = ""
        elif checked == 1:
            errormsg("Jedes Captcha darf nur einmal verwendet werden!")
        elif checked == 2:
            errormsg("Das Passwort ist falsch, bitte noch einmal versuchen!")
    else:
        if name is "":
            errormsg("Es wurde kein Name eingegeben!")
        if text is "":
            errormsg("Es wurde kein Text eingegeben!")
      
 
print "<form action=\"" + scriptname[-1] + "\" method=\"post\">"
print "<input type=\"hidden\" name=\"random\" value=\"%s\" />" % ( captchas.random () )
print "<table align=\"center\" width=\"500\">"
print "<tr><td class=\"eingabe\" align=\"right\">Name:</td><td class=\"eingabe\"><input type=\"text\" name=\"name\" value=\"%s\" /></td></tr>" % name
print "<tr><td class=\"eingabe\" align=\"right\">Email:</td><td class=\"eingabe\"><input type=\"text\" name=\"email\" value=\"%s\" /></td></tr>" % email
print "<tr><td class=\"eingabe\" align=\"right\">Webseite:</td><td class=\"eingabe\"><input type=\"text\" name=\"webseite\" value=\"%s\" /></td></tr>" % webseite
print "<tr><td valign=\"top\" class=\"eingabe\" align=\"right\">Nachricht:</td><td class=\"eingabe\"><textarea name=\"text\" cols=\"30\" rows=\"5\" >%s</textarea></td></tr>" % text
print "<tr><td class=\"eingabe\" align=\"right\">Captcha-Passwort:</td><td class=\"eingabe\"><input type=\"text\" name=\"password\" size=\"10\" /></td></tr>"
print "<tr><td class=\"eingabe\" align=\"right\">&nbsp;</td><td class=\"eingabe\">%s</td></tr>" % ( captchas.image() )
print "<tr><td class=\"eingabe\">&nbsp;</td><td align=\"center\" class=\"eingabe\"><input type=\"submit\" name=\"senden\" value=\"Senden\" /> &nbsp; <input type=\"reset\" name=\"senden\" value=\"Löschen\"/></td></tr>"
print "<tr><td class=\"eingabe\">Verf&uuml;gbare Smileys:</td><td>"
if len(smileys) == 0:
    print "Smileys konnten nicht geladen werden!"
else:
    for key in smileys.keys():
      print "<img src=\"" + smileys[key]+ "\" alt=\""+ key +"\" title=\""+ key +"\" /> "
print "</td></tr>"
print "</table>"
print "</form><br />"
print "<p align=\"center\" style=\"font-size: 70%;\"><a href=\"http://validator.w3.org/check?uri=referer\"><img src=\"http://www.w3.org/Icons/valid-xhtml10\" alt=\"Valid XHTML 1.0 Transitional\" height=\"31\" width=\"88\" border=\"0\" /></a><a href=\"http://jigsaw.w3.org/css-validator/\"><img style=\"border:0;width:88px;height:31px\" src=\"http://jigsaw.w3.org/css-validator/images/vcss\" alt=\"Valid CSS!\" /></a><br />powered by <a href=\"http://www.guschdel.net\" style=\"text-decoration: none; color: #aaaaaa;\">guschdel.net</a></p>"
print "<hr width=\"75%\" />"
 
try:
    fh = open(file, "r")
except IOError:
    print "<font color=\"red\"><h1 align=\"center\">Konnte nicht aus der Datenbank lesen!!!</h1></font></body></html>" 
    sys.exit(1)
else:
    templist = fh.readlines()
    fh.close()
 
print "<h2 align=\"center\">Bisherige Eintr&auml;ge:</h2>"
print "<table width=\"500\" align=\"center\">"
 
i = start
if start > 10:
    zur = (10 * round(start / 10)) - 10
else:
    zur = 0
if start >= ( len(templist)):
    vor = 10 * round(len(templist) / 10)
    start = vor
else:
    vor = start + 10
 
ende = 10 * round(len(templist) / 10)
 
if (len(templist) - start) < 10:
    x = len(templist) - start
else:
    x = 10
 
if len(templist) <= (start + 10):
    print "<tr><td align=\"right\" class=\"navi\" colspan=\"2\"><a href=\"?start=0\" class=\"navi\">|&lt;&lt;</a> | <a href=\"?start=%d\" class=\"navi\">&lt;</a> | &gt; | &gt;&gt;|</td></tr>" % zur
elif start < 10:
    print "<tr><td align=\"right\" class=\"navi\" colspan=\"2\">|&lt;&lt; | &lt; | <a href=\"?start=%d\" class=\"navi\">&gt;</a> | <a href=\"?start=%d\" class=\"navi\">&gt;&gt;|</a></td></tr>" % (vor, ende)
else:
    print "<tr><td align=\"right\" class=\"eingabe\" colspan=\"2\"><a href=\"?start=0\" class=\"navi\">|&lt;&lt;</a> | <a href=\"?start=%d\" class=\"navi\">&lt;</a> | <a href=\"?start=%d\" class=\"navi\">&gt;</a> | <a href=\"?start=%d\" class=\"navi\">&gt;&gt;|</a></td></tr>" % (zur, vor, ende)
print "<tr><td colspan=\"2\">&nbsp;</td></tr>"
 
for i in range(x):
    if (i + start) <= len(templist):
        inhalt = templist[int(start + i)].split("||")
        print "<tr><td width=\"100\" class=\"gb\"><strong>Nummer:</strong></td><td class=\"gb\">%d</td></tr>" % (int(i + start) + 1)
        print "<tr><td width=\"100\" class=\"gb\"><strong>Name:</strong></td><td class=\"gb\">%s</td></tr>" % inhalt[0]
        print "<tr><td width=\"100\" class=\"gb\"><strong>Datum:</strong></td><td class=\"gb\">%s</td></tr>" % inhalt[1]
        print "<tr><td valign=\"top\" width=\"100\" class=\"gb\"><strong>Nachricht:</strong></td><td class=\"gb\">%s</td></tr>" % inhalt[2] 
        print "<tr><td colspan=\"2\">&nbsp;</td></tr>"
 
if len(templist) <= (start + 10):
    print "<tr><td align=\"right\" class=\"navi\" colspan=\"2\"><a href=\"?start=0\" class=\"navi\">|&lt;&lt;</a> | <a href=\"?start=%d\" class=\"navi\">&lt;</a> | &gt; | &gt;&gt;|</td></tr>" % zur
elif start < 10:
    print "<tr><td align=\"right\" class=\"navi\" colspan=\"2\">|&lt;&lt; | &lt; | <a href=\"?start=%d\" class=\"navi\">&gt;</a> | <a href=\"?start=%d\" class=\"navi\">&gt;&gt;|</a></td></tr>" % (vor, ende)
else:
    print "<tr><td align=\"right\" class=\"navi\" colspan=\"2\"><a href=\"?start=0\" class=\"navi\">|&lt;&lt;</a> | <a href=\"?start=%d\" class=\"navi\">&lt;</a> | <a href=\"?start=%d\" class=\"navi\">&gt;</a> | <a href=\"?start=%d\" class=\"navi\">&gt;&gt;|</a></td></tr>" % (zur, vor, ende)
 
print "</table>"
 
print_footer()
 
 
computerecke/guestbook.txt · Zuletzt geändert: 13/03/2007 01:19 von guschdel
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki

Diese Webseite wurde mit einer modifizierten Version von DokuWiki erstellt
Impressum

Ihre IPv4 ist: 38.107.179.218
Seite wurde in 0.035 Sekunden erstellt
-->