[PHP]: Classe cURL – Come gestire le richieste e i login remoti con php


Come avevo promesso a molti utenti, finalmente pubblico la mia classe personale (forse ha qualche bug ancora, ma è comunque funzionale) per gestire le cURL.

In anzitutto, a cosa servono le cURL?

Le cURL sono funzioni native di PHP che permettono di prelevare pagine web intere semplicemente digitando l’indirizzo da salvare, ed ottenendo cosi il codice sorgente di tale pagina. Mi spiego meglio:

Supponiamo di voler salvare il codice sorgente di una pagina web, oppure di voler prendere dei dati che purtroppo stanno su un sito di terzi (chessò gli orari della metro, o i risultati di calcio in tempo reale)… per fare ciò le cURL sono ideali, e permettono addirittura di gestire il protocollo https sicuro e i login.


Ultimamente sono riuscito a prelevare il mio saldo postepay con 3 semplici richieste effettuate con questa mia classe, ma iniziamo subito a vedere il codice…

La classe

Questo il codice della classe da salvare nel file chiamato ad esempio curl.class.php:


	/*
		Classe cURL by Stefano Venneri
		Indirizzo web: http://www.sv-design.org
		E-mail: info@sv-design.org
		Copyright 2011
	*/

	class cUrl
	{
		public $ch;
		private $mk;
		private $lcookie = array();
		private $count = 0;

		public $followlocation = true;
		public $includeheader = false;
		public $encoding = "gzip,deflate";
		public $agent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 FirePHP/0.1.2";
		public $max_redirect = 20;

		public function cUrl()
		{
			$this->ch = curl_init();
			$this->mk = mktime();
			$this->lcookie[] = "req" . $this->count . $this->mk;
		}

		public function cGet($url, $refer = null)
		{
			curl_setopt($this->ch, CURLOPT_RETURNTRANSFER,1);

			$last_cookie = array_pop($this->lcookie);

			curl_setopt($this->ch, CURLOPT_COOKIEFILE, "/tmp/".$last_cookie);

			curl_setopt($this->ch, CURLOPT_URL, $url);

			curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, $this->followlocation);

			curl_setopt($this->ch, CURLOPT_HTTPGET, true);

			curl_setopt($this->ch, CURLOPT_HEADER, $this->includeheader);

			curl_setopt($this->ch, CURLOPT_ENCODING, $this->encoding);

			curl_setopt($this->ch, CURLOPT_USERAGENT, $this->agent);

			curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, false);

			if($refer == null)
			{
				curl_setopt($this->ch, CURLOPT_AUTOREFERER, true);
			}
			else
			{
				curl_setopt($this->ch, CURLOPT_REFERER, $refer);
			}

			curl_setopt($this->ch, CURLOPT_MAXREDIRS, $this->max_redirect);

			$this->count++;

			$this->lcookie[] = "req" . $this->count . $this->mk;

			curl_setopt($this->ch, CURLOPT_COOKIEJAR, "/tmp/".$this->lcookie);

			$buff = curl_exec($this->ch);

			return $buff;
		}

		public function cPost($url, $post, $refer = null)
		{
			$last_cookie = array_pop($this->lcookie);

			curl_setopt($this->ch, CURLOPT_COOKIEFILE, "/tmp/".$last_cookie);

			curl_setopt($this->ch, CURLOPT_URL, $url);

			curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, false);

			curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, $this->followlocation);

			if($refer == null)
			{
				curl_setopt($this->ch, CURLOPT_AUTOREFERER, true);
			}
			else
			{
				curl_setopt($this->ch, CURLOPT_REFERER, $refer);
			}

			curl_setopt($this->ch, CURLOPT_ENCODING, $this->encoding);

			curl_setopt($this->ch, CURLOPT_USERAGENT, $this->agent);

			curl_setopt($this->ch, CURLOPT_MAXREDIRS, $this->max_redirect);

			curl_setopt($this->ch, CURLOPT_POST, 1);

			curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post);

			$this->count++;

			$this->lcookie[] = "req" . $this->count . $this->mk;

			curl_setopt($this->ch, CURLOPT_COOKIEJAR, "/tmp/".$this->lcookie);

			$buf = curl_exec($this->ch);

			return $buf;
		}

		public function close()
		{
			curl_close ($this->ch);
		}
	}

L’esempio

Facciamo subito un esempio di come usare la classe:

  • Iniziamo con l’impostare la cattura degli output con il comando ob_start(); in quanto la classe restituisce automaticamente il contenuto ricevuto dalla richiesta
  • Ora dobbiamo includere la classe, e lo facciamo con: include ‘curl.class.php’;
  • Bene, ora non dobbiamo far altro che valorizzare l’oggetto per utilizzare la classe, quindi scriviamo: $curl = new cUrl();

Le funzioni

Le funzioni di questa classe sono solamente 3, questo per facilitare l’uso anche ai più inesperti… e sono:

cGet($url, $refer=null) // questa funzione serve ad effettuare una richiesta GET specificando facoltativamente un refer da settare negli header

cPost($url, $post, $refer = null) // come la funzione descritta prima, ma la richiesta è POST e il secondo parametro sono i dati da inviarsi nel formato: campo1=valore1&campo2=valore2 …ecc…

close() // serve a chiudere la connessione alla fine delle operazioni

I parametri

Prima di eseguire ogni funzione si possono settare dei parametri da utilizzare nelle richieste, quelli utilizzabili sono:

  • $followlocation (da richiamare come $curl->followlocation) – Valore booleano (true/false) che indica se seguire automaticamente gli autoredirect | DEFAULT: TRUE
  • $includeheader – Valore booleano (true/false) che indica se stampare anche gli header insieme al contenuto della pagina | DEFAULT: FALSE
  • $encoding – La codifica della pagina | DEFAULT: gzip,deflate
  • $agent – L’user-agent da indicare nelle richieste da eseguire | DEFAULT: Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 FirePHP/0.1.2
  • $max_redirect – Il numero massimo di autoredirect seguire prima di chiudere la connessione | DEFAULT: 20

Bene, dopo aver richiamato le funzioni ed aver messo in una variabile il contenuto da ottenere ( ad esempio: $prova = $curl->cGet(“http://www.google.it”); ), possiamo svuotare l’output del browser con ob_end_clean(); chiudere la connessione con $curl->close() e fare ciò che vogliamo con il contenuto della pagina richiesta, che nel nostro esempio si troverà nella variabile $prova.

Allegati

Allego la classe zippata per evitare problemi di copia-incolla. 😉

Scarica la classe cUrl



3 Commenti

  1. […] richesta di un nostro lettore (antonio), scriverò un piccolo tutorial in php su come usare la mia classe cURL per recuperare automaticamente il saldo disponibile dalla nostra […]

  2. antonio ha detto:

    Potresti pubblicare l’esempio per visualizzare il saldo PostaPay. Sarebbe comodissimo per la nostra associazione…

    Ciao 🙂

Lascia un commento a antonio

%d blogger hanno fatto clic su Mi Piace per questo: