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ä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ä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\"> </td><td class=\"eingabe\">%s</td></tr>" % ( captchas.image() ) print "<tr><td class=\"eingabe\"> </td><td align=\"center\" class=\"eingabe\"><input type=\"submit\" name=\"senden\" value=\"Senden\" /> <input type=\"reset\" name=\"senden\" value=\"Löschen\"/></td></tr>" print "<tr><td class=\"eingabe\">Verfü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ä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\">|<<</a> | <a href=\"?start=%d\" class=\"navi\"><</a> | > | >>|</td></tr>" % zur elif start < 10: print "<tr><td align=\"right\" class=\"navi\" colspan=\"2\">|<< | < | <a href=\"?start=%d\" class=\"navi\">></a> | <a href=\"?start=%d\" class=\"navi\">>>|</a></td></tr>" % (vor, ende) else: print "<tr><td align=\"right\" class=\"eingabe\" colspan=\"2\"><a href=\"?start=0\" class=\"navi\">|<<</a> | <a href=\"?start=%d\" class=\"navi\"><</a> | <a href=\"?start=%d\" class=\"navi\">></a> | <a href=\"?start=%d\" class=\"navi\">>>|</a></td></tr>" % (zur, vor, ende) print "<tr><td colspan=\"2\"> </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\"> </td></tr>" if len(templist) <= (start + 10): print "<tr><td align=\"right\" class=\"navi\" colspan=\"2\"><a href=\"?start=0\" class=\"navi\">|<<</a> | <a href=\"?start=%d\" class=\"navi\"><</a> | > | >>|</td></tr>" % zur elif start < 10: print "<tr><td align=\"right\" class=\"navi\" colspan=\"2\">|<< | < | <a href=\"?start=%d\" class=\"navi\">></a> | <a href=\"?start=%d\" class=\"navi\">>>|</a></td></tr>" % (vor, ende) else: print "<tr><td align=\"right\" class=\"navi\" colspan=\"2\"><a href=\"?start=0\" class=\"navi\">|<<</a> | <a href=\"?start=%d\" class=\"navi\"><</a> | <a href=\"?start=%d\" class=\"navi\">></a> | <a href=\"?start=%d\" class=\"navi\">>>|</a></td></tr>" % (zur, vor, ende) print "</table>" print_footer()