Z pewnością każdy zaawansowany webmaster natrafił na problem wysłania danych POST bez pisania formularza. Osobiście też natknąłem się na ten problem przy próbie pobrania linków do galerii do gier korzystając z serwisów gry.wp.pl oraz gamespot.com.
Na przykładzie tego pierwszego serwisu postaram się wytłumaczyć zastosowaną technikę. Więc zaczynamy.
Pierwszym krokiem będzie otwarcie serwisu, do którego chcemy przesłać dane POST, w tym przypadku będzie to serwis gry.wp.pl.
Następnie należy otworzyć źródło strony i wyszukać w nim fragment z formularzem. W tym przypadku:
Kod:
<form action="http://gry.wp.pl/core.html?filtr=0,0&x=szukaj" name="WPng" method="POST"><nobr>
<input type="hidden" name="fromBox" value="1"> <input type="text" name="szukaj" class="WPS1" size="16">
..
<input align="absmiddle" type="image" border="0" src="http://i.wp.pl/a/i/sg/wps.gif" name="Szukaj" width="56" height="26" hspace="1">
..
</form>
Teraz w celu przesłania danych POST do strony należy otworzyć stronę poprzez fsockopen(), następnie przesłać nagłówki...
Kod:
<?php
$url = 'gry.wp.pl';
$fp = fsockopen($url, 80, $errno, $errstr, 1);
$out = "POST /core.html?filtr=0,0&x=szukaj HTTP/1.0\r\n";
$out .= "Host: $url\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
/**
* Tu podajemy długość całego łańcucha zmiennych POST (patrz niżej)
*/
$out .= "Content-Length: 13\r\n";
$out .= "\r\n";
/**
* Tu kolejno podajemy zmienne POST oddzielając je & (tak jak w GET)
*/
$out .= "szukaj=FRAZA\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp))
{
$echo .= fgets($fp, 128);
}
fclose($fp);
echo substr($echo,185);
?>
Ponadto nagłówki można podejrzeć w mozilli (narzędzia > narzędzia programistyczne > nagłówki http).
Jak widać w powyższym kodzie - wystarczy otworzyć url, oraz wpisać odpowiednie dane (które czerpiemy bezpośrednio z formularza).
Myślę, że udało mi się opisać w zrozumiały sposób częsty problem programistów.
Pozdrawiam,
AndyPSV
contact:
andypsv@irc.pl