FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Sockets und HTTP-Streams in Perl

Sockets und HTTP-Streams in Perl 2005-09-30 13:47
Popcorn
Ich komme seit zwei Tagen nicht wirklich weiter. Ich möchte das Grundgerüst für Bots im Rapidchat bauen. Beim ersten Kontakt bekommt man eine ID zugewiesen. Dann baut sich der Chat-Screen auf und im Frameset gibt es einen Frame namens main, in dem, in Verbindung mit einer ID, immer die aktuellen Chatnachrichten empfangen werden.

Schreiben ist kein Problem. Nur immer wenn ich den Inhalt per Get-Request anzapfen möchte, bleibt er schon an dieser Request-Stelle stehen. Eigentlich hatte ich die Hoffnung, dass er dort weitermacht und ich alles weitere vom Socket abzapfen kann.

Die Lektüre der Module hat mich auch nicht wirklich weiter gebracht. Und Google gibt mir für diese Fall leider keine Abschreibbeispiele. ;) Weiß jemand was er von mir will?

#!/usr/bin/perl -w BEGIN { $| = 1; open (STDERR, ">&STDOUT"); print qq~Content-type: text/html\n\n~; } $SIG{'ALRM'} =\&alarm_handle; alarm(60); use LWP::UserAgent; use LWP::Simple; use HTTP::Request::Common; use IO::Socket::INET; my $browser = LWP::UserAgent->new; # Hello $request = HTTP::Request->new('GET', '[url=http://chat.rapidchat.de/login?network=4247&language=ger]http://chat.rapidchat.de/login?network=4247&language=ger[/url]'); $parse = $browser->request($request)->as_string; #Unique ID / Keycode extrahieren $parse = substr($parse, index($parse, "uid_keycode") + 15, 500); $parse = substr($parse, 0, index($parse, '"')); $uid_keycode = $parse; $socket = IO::Socket::INET->new(PeerAddr => '80.237.244.4', PeerPort => 'http(80)', Proto => 'tcp') or die "Could not connect to 80.237.244.4:80 $@\n"; print 'Schicke Get-Request und hänge mich auf'; $request = HTTP::Request->new('GET', '[url=http://chat.rapidchat.de/chat?keycode=]http://chat.rapidchat.de/chat?keycode=[/url]'.$uid_keycode.'§ion=main'); $browser->request($request); print "Geht weiter?"; for($i = 0; $i < 10; $i++) { my $response = $browser->post('[url=http://chat.rapidchat.de/]http://chat.rapidchat.de/[/url]', ['keycode' => $uid_keycode, 'section' => 'console', 'errortemplate' => '4247', 'command' => 'Hallo! Ich bin ein Bot der zählen kann- '.$i]); $socket->read($data, 1024) until $socket->atmark; print "Rapidchat-Server sagt:".$data; sleep(5); } close($socket); exit; sub alarm_handle { alarm(0); exit 0; }
Der Chat sieht so aus: http://www.fusion-clan.de/chat.php

Re: Sockets und HTTP-Streams in Perl 2005-09-30 14:06
Anonymer User
warum machste den scheiss auch in perl? nimm doch lieber java, c# oder sonstwas… ABER NICHT PERL *kotz*

Re: Sockets und HTTP-Streams in Perl 2005-09-30 14:17
TriPhoenix
warum machste den scheiss auch in perl? nimm doch lieber java, c# oder sonstwas… ABER NICHT PERL *kotz*

Hm? Perl ist für kleine Skriptereien doch gut brauchbar, solange es kein größeres Projekt wird.

Das Problem liegt nebenbei darin, dass der HTTP-Strom der Chatseite nicht endet und HTTP::Get dahe rnie zurückkehrt. Kann man mit nem IO::Socket::INET und manuellem HTTP-Request aber richten.

Re: Sockets und HTTP-Streams in Perl 2005-09-30 16:40
Anarch
Das Problem liegt nebenbei darin, dass der HTTP-Strom der Chatseite nicht endet und HTTP::Get dahe rnie zurückkehrt. Kann man mit nem IO::Socket::INET und manuellem HTTP-Request aber richten.

Connection: close

mit auf den Weg geben…

Re: Sockets und HTTP-Streams in Perl 2005-09-30 16:46
TriPhoenix
Das Problem liegt nebenbei darin, dass der HTTP-Strom der Chatseite nicht endet und HTTP::Get dahe rnie zurückkehrt. Kann man mit nem IO::Socket::INET und manuellem HTTP-Request aber richten.

Connection: close

mit auf den Weg geben…

Stimmt, obwohl das hier irrelevant ist, da die empfangene Datei sowieso nie endet [img]http://www.fb18.de/gfx/28.gif[/img] Aber schönerer Stil ists auf jeden Fall [img]http://www.fb18.de/gfx/14.gif[/img]

Re: Sockets und HTTP-Streams in Perl 2005-09-30 17:00
Anarch
Stimmt, obwohl das hier irrelevant ist, da die empfangene Datei sowieso nie endet [img]http://www.fb18.de/gfx/28.gif[/img] Aber schönerer Stil ists auf jeden Fall [img]http://www.fb18.de/gfx/14.gif[/img]

Ich hab das nicht ausprobiert - was zur Hölle soll das werden? Nach dem Audio/Videostream sieht das ja nicht aus :-)

Re: Sockets und HTTP-Streams in Perl 2005-09-30 20:47
TriPhoenix
Ich hab das nicht ausprobiert - was zur Hölle soll das werden? Nach dem Audio/Videostream sieht das ja nicht aus :-)

Browserbasierter Chat halt. Dort wird das Textfenster über eine Nicht-Endende HTML-Datei gespickt mit JavaScript für Nicklisten etc. simuliert. Und als Keepalive kommt in idle-Zeiten ein \n über die Leitung. Eklig? Bestimmt [img]http://www.fb18.de/gfx/28.gif[/img] Aber es funktioniert erstaunlich gut.

Re: Sockets und HTTP-Streams in Perl 2005-10-01 10:17
1baumann
warum machste den scheiss auch in perl? nimm doch lieber java, c# oder sonstwas… ABER NICHT PERL *kotz*
weil c# viel plattformunabhängiger, weiter verbreitet und überhaupt berechnungsuniverseller ist? /rant

Jedenfalls hatte ich grad gestern dasselbe Problem und vielleicht ist die Lösung trotz anderer Sprache ähnlich: Wenn ich XMLHttpRequests von Javascript aus losschick, dann passiert garnichts, solange ich nur get(xy) sag, sondern musste auch noch ein send(null) dahinterher sagen, weil sonst der Serveur erstmal garnix in die frisch geöffnete Verbindung schrieb. Vielleicht hilft's ja.

Re: Sockets und HTTP-Streams in Perl 2005-10-03 14:30
Anonymer User
Das Problem liegt nebenbei darin, dass der HTTP-Strom der Chatseite nicht endet und HTTP::Get dahe rnie zurückkehrt. Kann man mit nem IO::Socket::INET und manuellem HTTP-Request aber richten.
Bevor man soweit ausholt, würde ich ausprobieren, die Variante von LWP::UserAgent->request aufzurufen, bei der man einen callback-Block übergibt. Der Block wird dann AFAIR jeweils ausgeführt, wenn ein Antwortpaket empfangen wird.

LEIFer

Re: Sockets und HTTP-Streams in Perl 2005-10-03 14:41
Popcorn
So wirklich weitergekommen bin ich noch nicht. Inzwischen hängt sich der Socket genau so wie der Request auf. Ich werde mir die Antworten noch mal nach meiner Prüfung intensiv zu Gemüte führen. Danke jedenfalls.