ugrás a tartalomhoz

Távoli url elérése HITELESÍTÉSSEL

mATTIAS · 2007. Ápr. 30. (H), 15.55
Sziasztok!

Régóta működnek weboldalaim, melyek más weboldalak tartalmaitól függenek, mindeddig nem volt szükség hitelesítésre, minden további nélkül el tudtam érni a távoli oldal forrását ezzel az osztályal (lejjebb)

Most azonban az lenne a feladatom, hogy a script magától bejelentkezzen az oldalra, majd cookie-val hitelesítse magát.

5letem szerint először megpingelné a távoli oldalt a megfeleő hitelesítő változókkal, ezután a szerver visszaad valamit, miszerint csináljon a böngésző (a script) egy cookie-t. Ezután a cookie-t mellékelve a HTTP HEADERBEN már mint bejelentkezett felhasználó kapnám a weblap forrását vissza.

Az első kérdés, hogy működhet-e az elképzelésem.

A második, hogy egy ilyen szerver-kliens komunikáció hogyan zajlik HTTP HEADER szinten, pl egy cookie-val való hitelesítés stb.

Előre is köszi a segítséget!



A most használt osztály:


class HTTPRequest
{
   var $_fp;        // HTTP socket
   var $_url;        // full URL
   var $_host;        // HTTP host
   var $_protocol;    // protocol (HTTP/HTTPS)
   var $_uri;        // request URI
   var $_port;        // port
   
   // scan url
   function _scan_url()
   {
       $req = $this->_url;
       
       $pos = strpos($req, '://');
       $this->_protocol = strtolower(substr($req, 0, $pos));
       
       $req = substr($req, $pos+3);
       $pos = strpos($req, '/');
       if($pos === false)
           $pos = strlen($req);
       $host = substr($req, 0, $pos);
       
       if(strpos($host, ':') !== false)
       {
           list($this->_host, $this->_port) = explode(':', $host);
       }
       else 
       {
           $this->_host = $host;
           $this->_port = ($this->_protocol == 'https') ? 443 : 80;
       }
       
       $this->_uri = substr($req, $pos);
       if($this->_uri == '')
           $this->_uri = '/';
   }
   
   // constructor
   function HTTPRequest($url)
   {
       $this->_url = $url;
       $this->_scan_url();
   }
   
   // download URL to string
   function DownloadToString()
   {
       $crlf = "\r\n";
       
       // generate request
       $req = 'GET ' . $this->_uri . ' HTTP/1.0' . $crlf
           .    'Host: ' . $this->_host . $crlf
           .    $crlf;
       
       // fetch
       $this->_fp = fsockopen(($this->_protocol == 'https' ? 'ssl://' : '') . $this->_host, $this->_port);
       fwrite($this->_fp, $req);
       while(is_resource($this->_fp) && $this->_fp && !feof($this->_fp))
           $response .= fread($this->_fp, 1024);
       fclose($this->_fp);
       
       // split header and body
       $pos = strpos($response, $crlf . $crlf);
       if($pos === false)
           return($response);
       $header = substr($response, 0, $pos);
       $body = substr($response, $pos + 2 * strlen($crlf));
       
       // parse headers
       $headers = array();
       $lines = explode($crlf, $header);
       foreach($lines as $line)
           if(($pos = strpos($line, ':')) !== false)
               $headers[strtolower(trim(substr($line, 0, $pos)))] = trim(substr($line, $pos+1));
       
       // redirection?
       if(isset($headers['location']))
       {
           $http = new HTTPRequest($headers['location']);
           return($http->DownloadToString($http));
       }
       else 
       {
           return($body);
       }
   }
}

 
1

Megvan!

mATTIAS · 2007. Május. 24. (Cs), 10.30
Megtaláltam a megoldást, illetve a könnyebbiket, curl használatával egész egyszerű a megoldás, megosztom nehogy valaki sokáig keresse, mint én!



$ch = curl_init("http://site.com?valtozo_get1=ertek1&valtozo_get2=ertek2");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3");
curl_setopt($ch, CURLOPT_HEADER, 1);
//curl_setopt($ch, CURLOPT_POST, 1);
//curl_setopt($ch, CURLOPT_POSTFIELDS, "valtozo_post1=ertek1&valtozo_post2=ertek2");
curl_setopt($ch, CURLOPT_COOKIE, "valtozo1=ertek1;valtozo2=ertek2");

$eredmeny = curl_exec($ch);
curl_close($ch);