Archiv verlassen und diese Seite im Standarddesign anzeigen : URL per cURL öffnen
Hallo,
bin mal gespannt ob mir jemand helfen kann... is glaub nen büschen komplizierter (kommt mir jedenfalls so vor ;))
Also ich muss eine URL im Intranet mittels cURL öffnen und den inhalt graben.
Das Problem ist mit fopen oder fsockopen fehlen mir einige daten, diese werden nur angezeigt wenn ich per browser die seite öffne und eine sessionid zugewiesen bekomme.
Per curl bekomme ich diese sid, aber irgendwie zeigt der mir den inhalt der seite nicht an. Sicher weil ich nur den Header hole...
Jetzt komm ich aber nicht weiter. Ich hab die Manual hoch und runter gelesen aber leider kein vernünftiges Ergebniss erziehlt.
Stand der dinge:
(Zeigt mir einige leere Bildflächen und unformatierte Links mehr nicht)@$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$url");
curl_setopt($ch, CURLOPT_HEADER, true);
@curl_exec($ch);
@curl_close($ch);
*nochmal auf mich aufmerksam mach*
Original geschrieben von Nordin
Per curl bekomme ich diese sid, aber irgendwie zeigt der mir den inhalt der seite nicht an. Sicher weil ich nur den Header hole...[/PHP]
Ja warum machst du das denn dann ...?
jahlives 15-03-2006, 10:13 Warum denn nicht mit fsockopen + fgets + fputs ?
Die Session ID wirst du auch so übergeben bekommen.
Also zuerst eine Verbindung erstellen mittels fockopen + url, die gesamte Antwort empfangen und einen request (fputs() ) nach der gewünschten Seite absetzen. Dann den gesamten Inhalt der Datei auf eine Var speichern und auf Weiterleitungen prüfen. In solchen Fällen findet beim ersten Aufruf der Seite eine Weiterleitung auf dieselbe Seite statt nur mit der Session ID angehängt. Diese Id steht jedoch ganz sicher im Header, den der Server für die Datei zurückschickt.
Wenn du die neue URL aufgerufen hast, speicherst du diese wieder auf eine Var und suchst darin nach dem HTTP Status Code 200 (Seite gefunden und alles i.O).
Dann zerlegst du den Inhalt der Datei und suchst dir die Bereiche raus, die du brauchst.
Gruss
tobi
p.s. schau dir das Manual zum Thema an
Original geschrieben von jahlives
Warum denn nicht mit fsockopen + fgets + fputs ?Gute Frage... Da war mal was. *grübel*
Ich glaube der Grund warum ich das nicht damit gemacht hab ist:
Ich hänge in einem Intranet, der Proxy lässt mich nicht mit diesen Befehlen komunizieren. Ja, irgendwie so war das mal... Darum hab ich mich mit cURL befast...
Aber gut dann muss ich es mit deiner Variante bei den Intranetseiten machen und im Internet werd ich dann später versuchen...
Ich dank dir jedenfalls erstmal für deine Antwort! SUPER!
jahlives 15-03-2006, 10:42 Ich hänge in einem Intranet, der Proxy lässt mich nicht mit diesen Befehlen komunizieren
Also wenn der Proxy GET Requests filtert, wie findest du denn Google ;)
Der Proxy kriegt doch nicht mit ob der GET Request von einem Browser, von PHP oder deiner Kaffeemaschine ausgelöst wurde. Solange er konform ist wird der durch jeden Proxy durchgereicht, ansonsten tschüss Internet...
Gruss
tobi
hmmm hast recht.
Aber irgendetwas war da... Ich komm noch drauf, is schon ne weile her als ich an diesem problemchen saß... ;)
Verdammt ich bekomm das nicht hin...
Hab eben auch noch mal gesucht hier im Forum... aber nix passendes gefunden. Ist nen büschen kompliziert für mich... wenn du nen Thema dazu hier irgendwo kennst wär ich dir dankbar wenn mir den link mal gibst.
Oder was natürlich noch besser wär, für meine zwecke diesen codeschnippsel mal schnell posten ;) aber ich denk das ist zuviel des guten *g*
Also mit cURL komm ich immerhin soweit das er mir die seite aufbauen will aber kurioserweise sucht der alle links (href und src) auf meinem Server... des heißt ich müsste irgendwie noch sagen das er auf http://xxxx.de/ordener/ gucken soll.
Aber wie?
function get_results($url) {
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_URL, "$url"); // aufzurufende URL
curl_setopt ($ch, CURLOPT_HEADER, 0); // Header in die Ausgabe aufnehmen
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // gibt Transfer zurück, anstatt die Ausgabe vorzunehmen
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/4.0");// User-Agent-Feld im HTTP Header
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0); // folgt alle LOCATION:
$result = curl_exec ($ch);
curl_close ($ch);
return $result;
}
echo get_results($url);
Original geschrieben von Nordin
aber kurioserweise sucht der alle links (href und src) auf meinem Server...
Wer ist "er"?
Der Browser? Ja, natürlich vervonnständigt der relative Links in Bezug auf die Domain, von der er die Daten abgerufen hat.
des heißt ich müsste irgendwie noch sagen das er auf http://xxxx.de/ordener/ gucken soll.
Entweder alle relativen Links raussuchen und ergänzen (RegExp) [1], oder ggf. einfach mit dem Hinzufügen eines base-targets versuchen.
[1] Das wird kompliziert bei relativen Links, die nicht bezug auf das Domain Root nehmen ...
Hab es mittlerweile noch so:
<?php
function get_results($url) {
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_URL, "$url");
curl_setopt ($ch, CURLOPT_REFERER, "$url_ref");
// <-- $url_ref enthält die Adresse wo er die Dokumente findet die per link gecklickt werden
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/4.0");
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0);
$result = curl_exec ($ch);
curl_close ($ch);
return $result;
}
echo get_results($url);
?>
Aber hier ist immernoch das Problem das der den Ref ignorriert...
Mit base target hab ich es noch nicht versucht... danke. werd es mal probieren
Super Danke bist der größte! Es funktioniert!!
<?php
function get_results($url) {
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_URL, "$url");
curl_setopt ($ch, CURLOPT_REFERER, "$url_ref");
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/4.0");
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0);
$result = curl_exec ($ch);
curl_close ($ch);
return $result;
}
print "
<head>
<base href='".$url_ref."'>
</head>
";
echo get_results($url);
?>
Nur scheinbar bekomm ich noch keine gültige SID (der Seiteninhalt ist noch leer)
jahlives 15-03-2006, 15:31 Ich kenne dieses Paket jetzt nicht wirklich, aber der Server wird versuchen dich weiterzuleiten mit einer Session Id. Wenn ich dann aber diese Zeile
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0);
//mein Vorschlag
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
lese dann denke ich, dass es eine 1 sein müsste. Weil du willst ja, dass er den Angaben in Location (im Header) folgt.
Gruss
tobi
Hmm meine Manual sagt aber folgendes:
PHP Manual 4.0
CURLOPT_FOLLOWLOCATION: Bei Setzen dieser Option auf einen Wert ungleich 0 (Null) wird jedem "Location: " (Ein Feld des HTTP-Headers) gefolgt. Zu beachten ist, dass dies rekursiv geschieht.
Hat vieleicht noch jemand eine Idee wie ich den Header mehrere Werte mit übergeben kann?
Weil scheinbar fehlt mir noch keep-alive und einige andere Werte...
PS: Da soll mal einer sagen das ich schnell aufgebe... Ist mittlerweile der vierte Tag an dem ich das versuche hinzubekommen.
jahlives 16-03-2006, 10:42 Hmm meine Manual sagt aber folgendes:
quote:
--------------------------------------------------------------------------------
PHP Manual 4.0
CURLOPT_FOLLOWLOCATION: Bei Setzen dieser Option auf einen Wert ungleich 0 (Null) wird jedem "Location: " (Ein Feld des HTTP-Headers) gefolgt. Zu beachten ist, dass dies rekursiv geschieht.
--------------------------------------------------------------------------------
0 != 0 ??????????? eher 0 == 0 oder ? Also setze den Wert auf 1 oder was auch immer, aber nicht auf 0.
Gruss
tobi
Ok... hab mal 1 gesetzt... aber geändert hat sich scheinbar nichts... funktioniert genau so wie mit ner 0.
Liegt sicher daran das dort keine neuen Locations angegeben werden...
Trotzdem mein Problem mir fehlt der Inhalt der Seite. Ich bekomm nur die Bilder und Tabellen (alles richtig formatiert)
Also ich geb es auf mit cURL... Aber ich würd dann noch die Variante von jahlives probieren.
Kann mir da jemend helfen? Oder gab es darüber schonmal ein Thema?
Original geschrieben von jahlives
Warum denn nicht mit fsockopen + fgets + fputs ?
Die Session ID wirst du auch so übergeben bekommen.
Also zuerst eine Verbindung erstellen mittels fockopen + url, die gesamte Antwort empfangen und einen request (fputs() ) nach der gewünschten Seite absetzen. Dann den gesamten Inhalt der Datei auf eine Var speichern und auf Weiterleitungen prüfen. In solchen Fällen findet beim ersten Aufruf der Seite eine Weiterleitung auf dieselbe Seite statt nur mit der Session ID angehängt. Diese Id steht jedoch ganz sicher im Header, den der Server für die Datei zurückschickt.
Wenn du die neue URL aufgerufen hast, speicherst du diese wieder auf eine Var und suchst darin nach dem HTTP Status Code 200 (Seite gefunden und alles i.O).
Dann zerlegst du den Inhalt der Datei und suchst dir die Bereiche raus, die du brauchst.
Gruss
tobi
p.s. schau dir das Manual zum Thema an
Sooo ich hätte da mal immernoch nen problem.
Ich weiß das ich es so ähnlich schon einmal gepostet hatte aber dort hab ich es immer mit cURL versucht. Jetzt möchte ich es mit fsockopen + fputs + fgets versuchen.
Also vornweg nochmal eine kleine Erklärung:
Ich möchte direckt auf diesen Link verweisen:
http://intranet.xxxxx.org/PE/mainframe.php?&path=1,2,22&execsite=1&cid=
Nur das Problem ist das der Inhalt dieser Seite nur genneriert wird wenn ich eine gültige SessionID mit übergebe.
Die SessionID bekomme ich vermutlich hier:
http://intranet.xxxxx.org/PE/index.php?path=1
Wie kann ich jetzt mit fsockopen, fgets und fputs eine gültige SID holen und bei einer Anfrage wieder mitsenden, so das ich die Seite wenn ich diesen Link aufrufe angeseigt bekomme?
Meine ersten versuche sind alle gescheitert. Ich hab auch eine PHP-Manual in der ich mich zu fsockopen einwenig belesen hab. Aber ich schafe einfach nicht eine gültige SID wieder mit zusenden. Bzw. ich bin zu blöd dafür. :confused:
Bitte helft mir...
Ok gut...
ich hab jetzt was fertig gemacht... (nach großem suchen im netz teilweise selber verfasst)
Jetzt hab ich eigentlich nur nen kleines bis großes Problem ich bekomme mindesten 1000 mal folgende Fehlermeldung immer im wechsel:
PHP Warning: feof(): supplied argument is not a valid stream resource in /var/www/html/martin/test/send2host.php on line 51
PHP Warning: fgets(): supplied argument is not a valid stream resource in /var/www/html/martin/test/send2host.php on line 52
Hat jemand eine Ahnung woran das liegt?
Hier mein Hauptprogramm: function sendToHost($host,$method,$path,$params,$cookies=array(),$useragent=0)
{
// Supply a default method of GET if the one passed was empty
if (empty($method))
$method = 'GET';
$method = strtoupper($method);
$fp = fsockopen($host,80);
$data = '';
foreach ($params as $key => $val) {
$pair = $key.'='.urlencode($val);
if (empty($data))
$data = $pair;
else
$data .= '&'.$pair;
}
if ($method != 'POST')
$path .= '?' . $data;
fputs($fp, "$method $path HTTP/1.0\n");
if (!empty($cookies)) {
fputs($fp, "Cookie: ");
foreach ($cookies as $key => $val) {
$pair = $key.'='.urlencode($val).';';
fputs($fp, $pair);
}
fputs($fp, "\n");
}
fputs($fp, "Host: $host\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
fputs($fp, "Content-length: " . strlen($data) . "\n");
if ($useragent)
fputs($fp, "User-Agent: $useragent\n");
fputs($fp, "Connection: close\n\n");
if ($method == 'POST')
fputs($fp, $data);
$header = '';
$content = '';
$bHead = TRUE;
while (!feof($fp)) { // <--- Zeile 51
$buf = fgets($fp); // <--- Zeile 52
if ($bHead) {
$header .= $buf;
$buf = trim($buf);
if (empty($buf))
$bHead = FALSE;
}
else
$content .= $buf;
}
fclose($fp);
return array($header, $content);
}
function getCookies($header) {
$cookies = array();
if (preg_match_all("/Set-Cookie: ([^=]*)=([^,;\r\n ]*)/s", $header, $match)) {
$cnt = count($match[0]);
for ($i = 0;$i < $cnt; $i++)
$cookies[$match[1][$i]] = urldecode($match[2][$i]);
}
return $cookies;
}
?>
Aufgerufen werden diese Funktionen so:<?php
include('send2host.php');
$host = 'intranet.xxxxx.org';
$method = 'GET';
$path = '/PE/mainframe.php';
# $params = array();
/* oder z.B.
$params['id'] = 125;
$params['forum'] = 'mysql';
*/
$params[path] = '1,2,22';
$cookies = array();
/* oder z.B.
$cookies['thwb_cookie'] = 'hier mußt du eintragen was du im browser findest';
$cookies['SID'] = 'und hier nun die wirkliche SID';
*/
$useragent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1';
list($head, $contents) = sendToHost($host,$method,$path,$params,$cookies,$useragent);
$cookies = getCookies($head);
/* So zeigt man einfach die Seite an
echo $contents;
*/
/* Das ist der Header */
echo "<pre>HEADER:$head</pre>";
/* Und die Cookies? */
echo "<pre>COOKIES:";print_r($cookies);echo "</pre>";
?>
//EDIT
Mein error_log ist nach 30sec bei krasse 10MB wenn ich das script ausführe... und wie gesagt immer nur mit den oben genannten Fehler im wechsel...
Das macht sicher die while-schleife... aber warum?
Sehe ich das richtig, dass du dich einfach blind darauf verlässt, dass fsockopen() "funktioniert" hat - und du nicht mal eine rudimentäre Fehlerbehandlung machst ...?
Ne nee nich ganz... kurioser Weise funktioniert es aber wieder...
Bin mir selber nich ganz schlüssig an was es lag.
Ok danke soweit erstmal für euer Bemühen und Ausdauer mit mir.
|
-
- |