Chat bot
Luigi
- perl
0 Malcolm Beck´s0 Malcolm Beck´s0 Struppi0 Malcolm Beck´s
0 Beat
0 Struppi0 Reiner0 Daniel Thoma
Hallo zusammen.
Ich möchte gleich zu anfang sagen: ICH habe einen EIGENEN Chat, der SELBST geschrieben wurde auf einem EIGENEN Webspace laufen. Ich moechte also KEINESWEGS einem anderen Chat schaden zufuegen!!! - naja ok das könnte jeder sagen ich hoffe einfach mal das ihr mir glaubt
Will man in meinem Chat etwas schreiben werden als parameter die verschluesselte IP genutzt (es ist nicht die beste moeglichkeit, i know).
query koennte also im normalfall so aussehen: http://domain.de/cgi-bin/chat.cgi?user=7gui378zo7tzr44r344rf&in=hallo+alles+klar
"user" traegt die verschluesselte IP, "in" traegt die nachricht bzw. einen befehl.
Soweit so schlecht. Jetzt wollte ich einen Bot schreiben, ein script (im moment nur ueber Perl-Interpreter/DOS aufrufbar) das sagen wir mal alle 10 minuten einen Spruch bringt.
Ich habe ganz simpel gedacht, klappt jedoch nicht so ganz.
UNGETESTETES SCRIPT (Ich habe im moment kein orginalscript mehr):
#!/usr/bin/perl -w
use strict;
use LWP::Simple;
my $spruch1 = "Die Sonne kommt taeglich";
my $spruch2 = "Der Mond kommt wenn die Sonne geht";
my $ausgabe1 = get("http://domain.de/cgi-bin/chat.cgi?user=7gui378zo7tzr44r344rf&in=$spruch1")
my $ausgabe2 = get("http://domain.de/cgi-bin/chat.cgi?user=7gui378zo7tzr44r344rf&in=$spruch2")
print $ausgabe1; #ausgabe wird brav getaetigt
sleep 30; #nun soll das script 30 sekunden warten
print $ausgabe2; # und jetzt sollte es einen zweiten Spruch senden, macht es aber nicht
Ich hab es schon mit schleifen, subs usw. probiert nichts klappt.
Wie stelle ich das ganze am besten an?
hi,
sleep 30; #nun soll das script 30 sekunden warten
ich kenne mich mit Perl nicht aus (leider oder noch nicht :), auf die schnelle habe ich auf 2 Seiten klammern um den Wert für Zeit gesehen ; wenn das aber der Fehler ist, müsste doch eigentlich eine Fehlermeldung ausgegeben werden.
mfg
hi,
wenn das aber der Fehler ist, müsste doch eigentlich eine Fehlermeldung ausgegeben werden.
[link:http://de.selfhtml.org/perl/intro.htm#programmierstil@title=use CGI::Carp qw(fatalsToBrowser);]
mfg
[link:http://de.selfhtml.org/perl/intro.htm#programmierstil@title=use CGI::Carp qw(fatalsToBrowser);]
Er redet von einem Kommandozeilenskript, da ist diese Modul überflüssig. Das brauchst du nur, wenn du ein Skript mit dem Browser von einem Server aufrufst.
Struppi.
hi,
@Beat:
Tu das nie in einem Script, das im Internet aufrufbar ist!
Fehler, egel in welcher Sprache, sind allein Sache des Scriptautoren!
Das ist klar, aber zum Entwickeln kommt man um die Errormeldungen nicht drumrum.
Er redet von einem Kommandozeilenskript, da ist diese Modul überflüssig. Das brauchst du nur, wenn du ein Skript mit dem Browser von einem Server aufrufst.
Ich war Neugierig und wollte das mal testen, ich hab eine Datei „test.pl“ erstellt und folgendes reingeschrieben:
#!/usr/bin/perl -w
use strict;
use LWP::Simple;
print 'test1';
sleep (5);
print 'test2';
Das macht aber was anderes als erwartet, ich hätte jetzt erwartet, das zuerst „test1“ ausgegeben wird, 5 Sekunden warten und dann „test2“ ausgegeben wird, aber das Script wartet 5 Sekunden und gibt beides gleichzeitig aus, warum?
mfg
Das macht aber was anderes als erwartet, ich hätte jetzt erwartet, das zuerst „test1“ ausgegeben wird, 5 Sekunden warten und dann „test2“ ausgegeben wird, aber das Script wartet 5 Sekunden und gibt beides gleichzeitig aus, warum?
schreib mal in das Skript: $|++;
Struppi.
Das ist klar, aber zum Entwickeln kommt man um die Errormeldungen nicht drumrum.
Was hindert dich daran,diese Meldungen in eine nahe liegende Datei umzuleiten.
Meldungen mitten im kaputten HTML sind nicht hilfreich.
hier eine Alternative:
BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>error.txt")
or die "Unable to append to error.txt: $!\n";
carpout(*LOG);
}
Er redet von einem Kommandozeilenskript, da ist diese Modul überflüssig. Das brauchst du nur, wenn du ein Skript mit dem Browser von einem Server aufrufst.
Ich war Neugierig und wollte das mal testen, ich hab eine Datei „test.pl“ erstellt und folgendes reingeschrieben:
#!/usr/bin/perl -w
use strict;
use LWP::Simple;print 'test1';
sleep (5);
print 'test2';
>
> Das macht aber was anderes als erwartet, ich hätte jetzt erwartet, das zuerst „test1“ ausgegeben wird, 5 Sekunden warten und dann „test2“ ausgegeben wird, aber das Script wartet 5 Sekunden und gibt beides gleichzeitig aus, warum?
ein Tipp:
print 'test1', "\n";
sleep (5);
print 'test2', "\n";
sleep (5); # nur zur besseren Beobachtung
mfg Beat
--
Woran ich arbeite:
[X-Torah](http://www.elcappuccino.ch/cgi/tok.pl?extern=1-pub-com3306-1)
><o(((°> ><o(((°>
<°)))o>< ><o(((°>o
hi,
Was hindert dich daran,diese Meldungen in eine nahe liegende Datei umzuleiten.
Meine Unwissenheit zu Perl.
BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>error.txt")
or die "Unable to append to error.txt: $!\n";
carpout(*LOG);
}
Interessant, woher bezieht Perl den Pfad für die error.txt? Ich hab die Datei in meinem Admin-Verzeichnis gefunden
C:\Dokumente und Einstellungen\Administrator.***
print 'test1', "\n";
sleep (5);
print 'test2', "\n";
sleep (5); # nur zur besseren Beobachtung
Ja, so funktioniert es, auch ohne das letzte sleep, fragt sich nur, warum das Script mit „\n“ erst richtig arbeitet, gibt es da einen Grund für?
@Struppi:
$|++;
Perl ist hässlich -- FULL ACK! ;)
Was auch immer das sein mag, es funktioniert ;)
mfg
BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>error.txt")
or die "Unable to append to error.txt: $!\n";
carpout(*LOG);
}Interessant, woher bezieht Perl den Pfad für die error.txt? Ich hab die Datei in meinem Admin-Verzeichnis gefunden
Tja, eigentlich sollte das aktuelle Verzeichnis, das sein wo das Skript ist. Aber das liegt an der Konfiguration des Servers, ich weiß allerdings auch nicht wo das eingestellt wird.
Ja, so funktioniert es, auch ohne das letzte sleep, fragt sich nur, warum das Script mit „\n“ erst richtig arbeitet, gibt es da einen Grund für?
weil der Ausgabepuffer geleert wird.
@Struppi:
$|++;
Perl ist hässlich -- FULL ACK! ;)
Was ist an einer Variabel häßlich?
Was auch immer das sein mag, es funktioniert ;)
http://de.selfhtml.org/perl/sprache/vordefiniert.htm#skalare
Struppi.
hi,
Tja, eigentlich sollte das aktuelle Verzeichnis, das sein wo das Skript ist.
Davon war ich auch ausgegangen, das aufrufende Script befand sich auf dem Desktop.
$|++;
Was ist an einer Variabel häßlich?
Sowas sehe ich bewusst zum ersten mal, in PHP kenne ich nur Variablen mit Namen.
Was auch immer das sein mag, es funktioniert ;)
http://de.selfhtml.org/perl/sprache/vordefiniert.htm#skalare
Danke für den Link.
mfg
Hallo Malcolm!
Interessant, woher bezieht Perl den Pfad für die error.txt? Ich hab die Datei in meinem Admin-Verzeichnis gefunden
C:\Dokumente und Einstellungen\Administrator.***
Ergänzend zu Struppi:
Ohne weitere Angaben nimmt Perl das Current Working Directory. Das ist das Verzeichnis, von wo aus Perl aufgerufen ist.
Wenn du die cmd.exe (die Windows »Eingabeaufforderung«) über Start/Ausführen aufrufst, wird unter XP immer
C:\Dokumente und Einstellungen\Username
als Startverzeichnis genommen, unter Vista ist es:
C:\Users\Username
Hättest Du vor dem Skript-Schreiben zwei mal cd .. gemacht,
wärest Du direkt in C:\ und Deine Datei wäre dort angelegt worden.
Aber auch Perl liefert Dir mit http://de.selfhtml.org/perl/funktionen/dateiverwaltung.htm#chdir@title=chdir() eine Möglichkeit, ein anderes Verzeichnis zu bestimmen.
Viele Grüße aus Frankfurt/Main,
Patrick
hi Onkel P!
Wenn du die cmd.exe (die Windows »Eingabeaufforderung«) über Start/Ausführen aufrufst, wird unter XP immer
C:\Dokumente und Einstellungen\Username
Das Problem hatte ich ja auch sogar mal, hatte aber vergessen, woran es lag.
Aber auch Perl liefert Dir mit http://de.selfhtml.org/perl/funktionen/dateiverwaltung.htm#chdir@title=chdir() eine Möglichkeit, ein anderes Verzeichnis zu bestimmen.
Danke für den Link. Jetzt habe ich schon mal einen errorhandler, wenn ich mal anfange, zu Perlen ;)
Und so sieht er aus:
BEGIN {
use CGI::Carp qw(carpout);
chdir("Desktop/");
open(LOG, ">>error.txt")
or die "Unable to append to error.txt: $!\n";
carpout(*LOG);
}
Die Module in Perl sind schon eine feine Sache.
mfg
wenn das aber der Fehler ist, müsste doch eigentlich eine Fehlermeldung ausgegeben werden.
[link:http://de.selfhtml.org/perl/intro.htm#programmierstil@title=use CGI::Carp qw(fatalsToBrowser);]
Tu das nie in einem Script, das im Internet aufrufbar ist!
Fehler, egel in welcher Sprache, sind allein Sache des Scriptautoren!
mfg Beat
UNGETESTETES SCRIPT (Ich habe im moment kein orginalscript mehr):
my $spruch1 = "Die Sonne kommt taeglich";
my $spruch2 = "Der Mond kommt wenn die Sonne geht";my $ausgabe1 = get("http://domain.de/cgi-bin/chat.cgi?user=7gui378zo7tzr44r344rf&in=$spruch1")
my $ausgabe2 = get("http://domain.de/cgi-bin/chat.cgi?user=7gui378zo7tzr44r344rf&in=$spruch2")
Hier rufst du die Seite zweimal unmittelbar hintereinander mit dem Spruch auf. Und du vergißt, dass hier die Parameter kodiert werden müssen. Leider finde ich grad kein Modul dafür, ich benutze dazuz immer die (undokumentierte) Funktion CGI::escape().
sleep 30; #nun soll das script 30 sekunden warten
print $ausgabe2; # und jetzt sollte es einen zweiten Spruch senden, macht es aber nicht
Natürlich nicht, du hast in $ausgabe2 hat nur die Antwort der bereits gesendeten Abfrage gespeichert.
Struppi.
Hier rufst du die Seite zweimal unmittelbar hintereinander mit dem Spruch auf. Und du vergißt, dass hier die Parameter kodiert werden müssen. Leider finde ich grad kein Modul dafür, ich benutze dazuz immer die (undokumentierte) Funktion CGI::escape().
Ich nutze immer das:
sub escape
{
shift() if ref($_[0]);
my $toencode = shift;
return undef unless defined($toencode);
$toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
return $toencode;
}
sub unescape
{
shift() if ref($_[0]);
my $todecode = shift;
return undef unless defined($todecode);
$todecode =~ tr/+/ /; # pluses become spaces
$todecode =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
return $todecode;
}
Viele Grüße,
Reiner
Hier rufst du die Seite zweimal unmittelbar hintereinander mit dem Spruch auf. Und du vergißt, dass hier die Parameter kodiert werden müssen. Leider finde ich grad kein Modul dafür, ich benutze dazuz immer die (undokumentierte) Funktion CGI::escape().
Ich nutze immer das:
Das sieht dem Code des CGI Moduls verdammt ähnlich, du nutzt sogar die gleichen Namen für die Parameter.
Allerdings ist in dem Modul noch eine Routine eingebaut um die Kodierung EBCD zu unterstützen.
Struppi.
Hier rufst du die Seite zweimal unmittelbar hintereinander mit dem Spruch auf. Und du vergißt, dass hier die Parameter kodiert werden müssen. Leider finde ich grad kein Modul dafür, ich benutze dazuz immer die (undokumentierte) Funktion CGI::escape().
Ich nutze immer das:
Das sieht dem Code des CGI Moduls verdammt ähnlich, du nutzt sogar die gleichen Namen für die Parameter.
Allerdings ist in dem Modul noch eine Routine eingebaut um die Kodierung EBCD zu unterstützen.
Hi Struppi,
ja, ich hatte mir das irgendwann mal da "rausgeklaut".
Danke übrigens für den Hinweis. Bisher hatte ich damit kein Problem - oder habe es nicht bemerkt.... ;-)
Viele Grüße,
Reiner
Hallo Struppi,
Leider finde ich grad kein Modul dafür
Wie wäre es mit URI::Escape?
Grüße
Daniel