Luigi: Chat bot

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?

  1. 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

    1. 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

      1. [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.

        1. 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

          1. 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.

          2. 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  
            
            
            1. 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

              1. 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.

                1. 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

              2. 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

                --
                _ - jenseits vom delirium - _

                   Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
                1. 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

      2. 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

        --
        Woran ich arbeite:
        X-Torah
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
  2. 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.

    1. 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

      1. 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.

        1. 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

    2. Hallo Struppi,

      Leider finde ich grad kein Modul dafür

      Wie wäre es mit URI::Escape?

      Grüße

      Daniel