Informationen aus php-Seite auslesen

Hi,

ich will eine Seite basteln, auf der immer steht, wer in einem bestimmten Forum als Letzter gepostet hat. Das Forum ist ein „Woltlab Burning Board“ und arbeitet mit PHP.
Ist es möglich, irgendwie von einer anderen Seite aus auszulesen, wer der letzte Poster in einem Thema war? Und das dann auf der Seite anzuzeigen?
Kann man da mit Frames oder so etwas machen?

Vielen Dank

–WhiteAvenger

Hi,

ich will eine Seite basteln, auf der immer steht, wer in einem
bestimmten Forum als Letzter gepostet hat. Das Forum ist ein
„Woltlab Burning Board“ und arbeitet mit PHP.
Ist es möglich, irgendwie von einer anderen Seite aus
auszulesen, wer der letzte Poster in einem Thema war? Und das
dann auf der Seite anzuzeigen?
Kann man da mit Frames oder so etwas machen?

Hallo

Sowas ist schon möglich.
Haben Forum und die geplante Seite die gleiche Domain oder zumindest den gleichen Server?
Steht für die geplante Seite php zur Verfügung?
Kannst du am Forum selbst rumbasteln beziehungsweise auf dessen Datenbank zugreifen?

Gruß Johannes

Hallo Johannes,

Sowas ist schon möglich.
Haben Forum und die geplante Seite die gleiche Domain oder
zumindest den gleichen Server?
Steht für die geplante Seite php zur Verfügung?
Kannst du am Forum selbst rumbasteln beziehungsweise auf
dessen Datenbank zugreifen?

Nein, ja und nein.

Das Forum ist nicht meins, aber ich bin dort Member und will zu einem bestimmten Thread eine Seite haben, die aktuelle Infos zu dem Thread anzeigt - eben z.B. wer als Letzter gepostet hat.

Ich kann selber nicht wirklich PHP, aber wenn es nötig ist, kann ich mir die nötigen Grundkenntnisse aneignen (oder hier im PHP-Forum fragen :wink: ).

Das Forum ist nicht meins, aber ich bin dort Member und will
zu einem bestimmten Thread eine Seite haben, die aktuelle
Infos zu dem Thread anzeigt - eben z.B. wer als Letzter
gepostet hat.

Ich kann selber nicht wirklich PHP, aber wenn es nötig ist,
kann ich mir die nötigen Grundkenntnisse aneignen (oder hier
im PHP-Forum fragen :wink: ).

Mit (I)Frames kann man nur komplette Seiten einbinden. Außerdem wird es da Probleme mit dem Login geben, wenn es kein öffentliches Board ist.

Mit PHP (oder einer anderen Scriptsprache) ist es möglich, sich in dem Board einuloggen und die notwendigen Wörter auszulesen.

Johannes

Außerdem wird es da Probleme mit dem Login geben, wenn es kein
öffentliches Board ist.

OK, das könnte ein Problem werden, da hast du Recht.

Mit PHP (oder einer anderen Scriptsprache) ist es möglich,
sich in dem Board einuloggen und die notwendigen Wörter
auszulesen.

Und zwar wie?

Und könnte man dann eventuell aus der PHP-Seite auf meinem Server das Passwort auslesen, das ich zum Einloggen verwendet habe?

Und könnte man dann eventuell aus der PHP-Seite auf meinem
Server das Passwort auslesen, das ich zum Einloggen verwendet
habe?

PHP wird auf dem Server verarbeitet. Im Browser kommt nur HTML an. Wenn man es richtig macht, entsteht also keine Sicherheitslücke.

Mit PHP (oder einer anderen Scriptsprache) ist es möglich,
sich in dem Board einuloggen und die notwendigen Wörter
auszulesen.

Und zwar wie?

Anleitungen und Tutorials zu PHP finden sich in FAQ:2373.
Und dann hätte ich noch etwas PHP-Code aus einen verbotenen Script, das eine ähnliche Aufgabe hat: Dorfinformationen aus dem Browserspiel Travian auslesen.
Weil man dabei einen Browser simuliert, sollte man etwas Ahnung vom HTTP-Protokoll haben. Es gibt auch PHP-Klassen zur Browsersimulation, die eine eigene Cookieverwaltung und ähnliches haben. Dass könnte die Sache leichter machen.
Viel einfacher wäre es natürlich, wenn man direkt an die Datenbank rankäme, wo alles säuberlich sortiert ist.

// ----- Funktionsdefinition -----
function getstr ($haystack, $start, $end)
{
$expl1 = explode($start,$haystack,2);
$expl2 = explode($end,$expl1[1],2);
return $expl2[0];
}

function httpconn ($server, $send)
{
$fp = fsockopen ("$server", 80, $errno, $errstr, 30);
if (!$fp) { die („Fehler $errstr ($errno)
\n“); }
$rec1 = „“;
fputs ($fp, $send);
while (!feof($fp)) { $rec1 .= fgets($fp,128); }
fclose($fp);
return $rec1;
}

// ----- Loginseite öffnen -----

$sendstr = ‚).‘&’;
$poststr .= getstr($inhalt,‚Name:‘."\n".‚Passwort:‘."\n".’

1 Like

Hallo Johannes,

Viel einfacher wäre es natürlich, wenn man direkt an die
Datenbank rankäme, wo alles säuberlich sortiert ist.

Keine Chance, die Datenbank ist die des Forums von einem Browsergame, dementsprechend wird man mich nicht an die Forumsdatenbank ranlassen :wink:

Danke für den Code,

Genial wär es jetzt noch, wenn du mir verraten könntest, welcher Teil des Codes was macht, damit ich den entsprechenden Teil modifizieren und aus dem Forum das Richtige auslesen kann.

Die Seite, die ich auslesen will, sieht so aus: http://www.lessing.info/paul/arena/thread.htm
Das ist die aktuelle Seite einfach als .htm gespeichert. Aus dieser Seite würde ich gerne auslesen, dass der letzte Post von Jarl gemacht wurde.

Vielen Dank für die Hilfe

–WhiteAvenger

Hallo

Der Code ist nur der Teil für den Login, das Auslesen der gesuchten Informationen geht auf ähnliche Weise. Ich hab aber gerade nicht die Zeit, das anzupassen.

Aber sag mal, wäre es nicht einfacher, den letzten Autor aus der Boardübersicht auszulesen? Da müsste man nur die Spalte mit dem entsprechenden Board suchen und was da nach ‚Letzter Beitrag von:‘ oder so steht, wäre der Autor.

Johannes

Der Code ist nur der Teil für den Login, das Auslesen der
gesuchten Informationen geht auf ähnliche Weise. Ich hab aber
gerade nicht die Zeit, das anzupassen.

OK, danke, dann frage ich das mal im PHP-Forum.

Aber sag mal, wäre es nicht einfacher, den letzten Autor aus
der Boardübersicht auszulesen? Da müsste man nur die Spalte
mit dem entsprechenden Board suchen und was da nach ‚Letzter
Beitrag von:‘ oder so steht, wäre der Autor.

Ehrlich gesagt, glaube ich, das ist komplizierter.
Dazu müsste ich immer zuerst den Thread in der Boardübersicht identifizieren, und sobald in einem anderen Thread gepostet wird, ist der, um den es mir geht, nicht mehr der oberste.
Um aus der Seite selber auszulesen, würde ich einfach die Post-IDs auslesen und anhand der höchsten den letzten Post identifizieren.

Jeder Post fängt mit so einem Teil an:

Jarl

In der Mitte ist ein -Tag, der sowohl als Name als auch als ID die Post-Nummer hat. Da die Posts laufend durchnummeriert werden, würde ich einfach alle a-Tags durchlaufen und nach der höchsten Postnummer suchen - zwei Zeilen drunter ist der Username.

Wie gesagt, danke vielmals für deine Hilfe, für alles Weitere werde ich im PHP-Forum nachfragen.

Hallo

ich will eine Seite basteln, auf der immer steht, wer in einem
bestimmten Forum als Letzter gepostet hat. Das Forum ist ein
„Woltlab Burning Board“ und arbeitet mit PHP.
Ist es möglich, irgendwie von einer anderen Seite aus
auszulesen, wer der letzte Poster in einem Thema war? Und das
dann auf der Seite anzuzeigen?
Kann man da mit Frames oder so etwas machen?

Nachdem ich die letzten Beitrag von Johannes gelesen
habe, dachte ich - das ist mal was Schönes um
Abends zu entspannen :wink:

[readpaularena.php] ==>

<?php # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
$html = slurp\_page('[www.lessing.info](http://www.lessing.info)', '/paul/arena/thread.htm'); $regexp = "/([^/"; $ntotal = preg\_match\_all($regexp, $html, $matches); foreach(array\_reverse($matches[1]) as $boardmember) echo "$boardmember "; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # function slurp\_page($host, $page) { $html = ''; if( ($fs = fsockopen($host, 80, $errno, $errstr, 10)) ) { fwrite($fs, "GET $page HTTP/1.1\nHost: $host\nConnection: Close\n\n"); while(!feof($fs)) $html .= fgets($fs, 128); fclose($fs); } return $html; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # ?\> Du müßtest obiges auf einem php-fähigen Server unterbringen und ggf. noch zusätzliche Ausgaben eintragen. Grüße CMБ

Ehrlich gesagt, glaube ich, das ist komplizierter.

Sehe ich nicht so. Wenn du natürlich auch den Inhalt des Posts oder ähnliche haben willst, hat sich die Frage gleich erledigt.

Dazu müsste ich immer zuerst den Thread in der Boardübersicht
identifizieren, und sobald in einem anderen Thread gepostet
wird, ist der, um den es mir geht, nicht mehr der oberste.

Aber der Titel des Threads bleibt doch gleich? Da müsste man doch im Quelltext nur nach dem Titel suchen und kurz dahinter sollte der Name stehen

Um aus der Seite selber auszulesen, würde ich einfach die
Post-IDs auslesen und anhand der höchsten den letzten Post
identifizieren.

Da musst du zuerst die letzte Seite des Threads finden und dort im Quelltext auch noch den letzten Eintrag. Erscheint mir aufwändiger.

Johannes

Hallo Semjon,

Nachdem ich die letzten Beitrag von Johannes gelesen
habe, dachte ich - das ist mal was Schönes um
Abends zu entspannen :wink:

Danke, das ist total nett von dir.

Du müßtest obiges auf einem php-fähigen Server
unterbringen und ggf. noch zusätzliche Ausgaben
eintragen.

Die Seite, die ich auslesen will, ist aber nicht die .htm, die ich angegeben hatte - die hatte ich einfach aus dem Forum gespeichert und bei mir hochgeladen. Das Forum, um das es geht, ist http://board.kampf-um-mittelerde.de und der Thread ist http://board.kampf-um-mittelerde.de/thread.php?threa… , wobei wahrscheinlich http://board.kampf-um-mittelerde.de/thread.php?threa… sinnvoller ist. Allerdings kommt man dort eben ohne Login nicht hinein…

Da musst du zuerst die letzte Seite des Threads finden und
dort im Quelltext auch noch den letzten Eintrag. Erscheint mir
aufwändiger.

Guter Punkt - wahrscheinlich hast du Recht.

Auf jeden Fall will ich ja eigentlich erstmal wissen, wie ich aus der PHP-Seite auslese - was ich dann wo auslese, kann ich ja überlegen, wenn ich auslesen kann. :smile:

Hallo

Die Seite, die ich auslesen will, ist aber nicht die .htm, die
ich angegeben hatte - die hatte ich einfach aus dem Forum
gespeichert und bei mir hochgeladen. Das Forum, um das es
geht, ist http://board.kampf-um-mittelerde.de und der Thread ist
http://board.kampf-um-mittelerde.de/thread.php?threa…
wobei wahrscheinlich

http://board.kampf-um-mittelerde.de/thread.php?threa…
sinnvoller ist. Allerdings kommt man dort eben ohne Login nicht hinein

das ist dann schwieriger, Du müßtest die
Anmeldeprozedur für das Board in PHP nach-
basteln, also die Frontseite einlesen,
die Login-Form analysieren und ausgefüllt
zurückschicken.

Oder, wenn das Board über Cookies authentifiziert,
dann die Cookies aus dem Browser herauskopieren
und beim PHP-Request mitschicken. Auf jeden Fall
ist das dann etwas zum Tüfteln.

Wenn die Seite dann aber einmal da ias,
sollte sie wie oben ausgelesen werden könen.

Grüße

CMБ

Dann basteln wir doch mal

http://board.kampf-um-mittelerde.de/thread.php?threa…

Es fehlt noch ein Regex auf den ich keine Lust hab.

// ----- Funktionsdefinition -----

function httpconn ($server, $send)
{
$fp = fsockopen ("$server", 80, $errno, $errstr, 30);
if (!$fp) { die („Fehler $errstr ($errno)
\n“); }
$rec1 = „“;
fputs ($fp, $send);
while (!feof($fp)) { $rec1 .= fgets($fp,128); }
fclose($fp);
return $rec1;
}
//----- Login absenden -----

$sendstr = ([^/";
$ntotal = preg_match_all($regexp, $html, $matches);
foreach(array_reverse($matches[1]) as $boardmember) echo "$boardmember
";

1 Like

Hallo,

Dann basteln wir doch mal

http://board.kampf-um-mittelerde.de/thread.php?threa…

Ich hab’s erstmal proforma hinbekommen, aber!!

  1. Man muß zuerst einen 301 erwarten und die neue Location auslesen,
  2. dann sendet er die Seite als ‚Content-Encoding: gzip‘, sieht so aus:

[Server-Antwort mit kompletter Seite:]

HTTP/1.1 200 OK
Date: Wed, 02 Jul 2008 11:15:44 GMT
Server: Apache/1.3.39 (Unix) mod\_auth\_pam/1.1.1 mod\_fastcgi/2.4.6 mod\_ssl/2.8.30 OpenSSL/0.9.8g mod\_jk/1.2.25 FrontPage/5.0.2.2510
X-Powered-By: PHP/5.2.6
Set-Cookie: wbb2\_cookiehash=3646c81dfdcd92dae73ee8ac9e46efb0
**Content-Encoding: gzip**
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=windows-1252

2000
\x1F?\x08\x00\x00\x00\x00\x00xÚí=isÛF??Í\*ÿ?\x0ES#;5¼©??Dºd[?½¶\x13?¥Ä»s¬«A4
...
usw.

Gzip und PHP? Da muß ich erstmal nachschauen. Ach ja, er braucht
einfach nur *alle* Cookies, die auch der Brauser versendet. dann
gehts (s.o.).

Grüße

CMБ

Hallo nochmalб

Dann basteln wir doch mal

http://board.kampf-um-mittelerde.de/thread.php?threa…

OK, es läuft jetzt. Man braucht ja nur keinen gzip-content
als „Brauser“ nicht zuzulassen. Das hier geht mit einem
temporär eingerichteten User:

[readthrd.php] ==>

<?php $path = '/thread.php?threadid=44589&goto=lastpost';
$cookies = 'Cookie: wbb2\_userpassword=126b53ffb6f67fbca14dd0512fabdb59; ' . '\_\_utmz=103605395.1214995802.3.3.utmccn=(referral)|utmcsr=' . '[www.google.de|utmcct=/|utmcmd=referral](http://www.google.de%7Cutmcct=/%7Cutmcmd=referral); \_\_utma=103605395.' . '976376924.1214940326.1214981021.1214995802.3; wbb2\_userid=' . '29020; wbb2\_cookiehash=dff76e25f37a7efebe5216479042b96b; ' . '\_\_utmb=103605395; \_\_utmc=103605395' . "\n\n"; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # $request = 'Host: board.kampf-um-mittelerde.de User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,\*/\*;q=0.5 Accept-Language: en,en-us;q=0.8,de;q=0.5,de-de;q=0.3 Accept-Charset: ISO-8859-1,utf-8;q=0.7,\*;q=0.7 Keep-Alive: 300 Connection: keep-alive' . "\n"; # get 301 redirect $question = "GET $path HTTP/1.1\n" . $request . $cookies; $answer = slurp\_page('board.kampf-um-mittelerde.de', $question); preg\_match('/Location:\s\*([^\s]+)/', $answer, $match); $redirect = $match[1]; # get page $question = "GET /$redirect HTTP/1.1\n" . $request . $cookies; $html = slurp\_page('board.kampf-um-mittelerde.de', $question); $regexp = '|([^|'; $ntotal = preg\_match\_all($regexp, $html, $matches); # generate meaningful output: the last member # will be printed first from the reversed array $count = 0; foreach(array\_reverse($matches[1]) as $boardmember) echo ($count++ ? $boardmember : " **$boardmember**") . ' '; # done # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # function slurp\_page($host, $request) { $html = ''; if( ($fs = fsockopen($host, 80, $errno, $errstr, 16)) ) { fwrite($fs, $request); while(!feof($fs)) $html .= fgets($fs, 128); fclose($fs); } return $html; } ?\> Grüße CMБ

Ach ja, er
braucht
einfach nur *alle* Cookies, die auch der Brauser versendet.
dann
gehts (s.o.).

Die Cookies sind ja nur begrenzt gültig und es ist ja doof, nach deren Ablauf das Script aktualisieren zu müssen.

Da wäre es besser, die Cookies beim Login abzufangen und dann mit denen weiterzuarbeiten.

Hallo Semjon,

wow, der Code funktioniert! Danke!

Aber irgendwie listet er alle Leute auf, die bereits gepostet haben, und macht dabei den ersten fett. So wie ich den Code verstehe, sollte er aber die letzten Poster auflisten und dabei hochzählen, oder?

Wie würde man den Code umschreiben, damit nur der letzte Poster angezeigt wird?

Und dann habe ich noch eine Frage: Wo im Code wird angegeben, welcher Thread durchsucht werden soll? Das finde ich nicht, und das verwirrt mich… :-S

Danke

–WhiteAvenger

Danke - geht leider nicht :frowning:

Dann basteln wir doch mal

Vielen Dank, Johannes, aber irgendwie gibt mir das immer einen Fehler aus… Ich glaube, mit dem Anmelden stimmt da was nicht, obwohl ich als Username und Passwort meine eigenen angegeben habe.

Trotzdem danke

–WhiteAvenger