Comunidad PHPeros
Lenguajes => PHP => Mensaje iniciado por: alpha en 19 de Septiembre de 2014, 06:02:18 am
-
Hola, he creado una clase para leer páginas web, bajarse archivos... la he utilizado para bajarme los paquetes de instalación de PHP y los de las extensiones PECL que suelo utilizar, por ejemplo.
Por supuesto su utilidad depende de la imaginación y necesidades de cada uno.
La historia y el código lo podéis leer en http://alphaonphp.blogspot.com.es/p/clase-wget.html
Para el que no quiera entretenerse con historias aquí está el meollo (también adjunto):
<?php
if (!defined('STDOUT')) {
define('STDOUT', fopen('php://stdout', 'w'));
}
if (!function_exists('curl_strerror')) {
function curl_strerror ($curl_error) {
return $curl_error;
}
}
if (!function_exists('simplexml_import_html')) {
function simplexml_import_html ($html) {
$doc = new DOMDocument();
@$doc->loadHTML($html);
$xml = simplexml_import_dom($doc);
return $xml;
}
}
class wget {
protected $curl = null;
protected $cookie_jar = '';
public function __construct ($useragent = null, $cookie_jar = '') {
$this->curl = curl_init();
$this->cookie_jar = $cookie_jar;
if (isset($useragent)) curl_setopt($this->curl, CURLOPT_USERAGENT, $useragent);
curl_setopt($this->curl, CURLOPT_ENCODING, '');
curl_setopt($this->curl, CURLOPT_PROGRESSFUNCTION, array($this, 'progress'));
curl_setopt($this->curl, CURLOPT_FILETIME, true);
curl_setopt($this->curl, CURLOPT_COOKIESESSION, true);
curl_setopt($this->curl, CURLOPT_COOKIEFILE, $this->cookie_jar);
curl_setopt($this->curl, CURLOPT_COOKIEJAR, $this->cookie_jar);
}
public function __destruct () {
curl_close($this->curl);
}
protected function progress () {
static $url = null;
static $progress_bar = null;
$curl_info = curl_getinfo($this->curl);
if ($url == $curl_info['url']) echo str_repeat("\x08", strlen($progress_bar));
$url = $curl_info['url'];
$progress_bar = null;
if ($curl_info['http_code'] == 200) {
$down_perc = 0;
if ($curl_info['size_download'] <= $curl_info['download_content_length']) $down_perc = (100 * $curl_info['size_download']) / $curl_info['download_content_length'];
$eta = 'N/A';
if ($curl_info['speed_download']) $eta = ($curl_info['download_content_length'] - $curl_info['size_download']) / $curl_info['speed_download'];
$progress_bar = sprintf('[%-30s] %3d%% %02.3fs %02.3fs', str_repeat('#', 30 * $down_perc / 100), $down_perc, $eta, $curl_info['total_time']);
}
echo $progress_bar, "\x20\x08";
}
public function set_auth ($user = null, $pass = null, $auth = null) {
if (empty($auth)) $auth = CURLAUTH_ANY;
curl_setopt($this->curl, CURLOPT_HTTPAUTH, $auth);
curl_setopt($this->curl, CURLOPT_USERPWD, $user . ':' . $pass);
}
public function set_ssl_verifypeer ($ssl_verifypeer = false) {
curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, $ssl_verifypeer);
}
public function set_verbose ($verbose = true) {
curl_setopt($this->curl, CURLOPT_VERBOSE, (bool) $verbose);
}
public function set_followlocation ($follow = true) {
curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, (bool) $follow);
}
public function set_maxredirs ($maxredirs = 0) {
curl_setopt($this->curl, CURLOPT_MAXREDIRS, (int) $maxredirs);
}
public function set_header_out ($header_out = true) {
curl_setopt($this->curl, CURLINFO_HEADER_OUT, (bool) $header_out);
}
public function set_header ($header = null) {
curl_setopt($this->curl, CURLOPT_HTTPHEADER, $header);
}
public function info_url ($url, $referer = null) {
curl_setopt($this->curl, CURLOPT_HTTPGET, true);
curl_setopt($this->curl, CURLOPT_URL, $url);
curl_setopt($this->curl, CURLOPT_REFERER, $referer);
curl_setopt($this->curl, CURLOPT_NOPROGRESS, true);
curl_setopt($this->curl, CURLOPT_NOBODY, true);
curl_setopt($this->curl, CURLOPT_FILE, STDOUT);
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
$body = curl_exec($this->curl);
$curl_info = curl_getinfo($this->curl);
$curl_info['body'] = $body;
$curl_info['curl_errno'] = curl_errno($this->curl);
$curl_info['curl_strerror'] = curl_strerror($curl_info['curl_errno']);
return $curl_info;
}
public function get_url ($url, $referer = null, $post_fields = null) {
curl_setopt($this->curl, CURLOPT_POST, is_array($post_fields));
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($this->curl, CURLOPT_HTTPGET, !is_array($post_fields));
curl_setopt($this->curl, CURLOPT_URL, $url);
curl_setopt($this->curl, CURLOPT_REFERER, $referer);
curl_setopt($this->curl, CURLOPT_NOPROGRESS, true);
curl_setopt($this->curl, CURLOPT_NOBODY, false);
curl_setopt($this->curl, CURLOPT_FILE, STDOUT);
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
$body = curl_exec($this->curl);
$curl_info = curl_getinfo($this->curl);
$curl_info['body'] = $body;
$curl_info['curl_errno'] = curl_errno($this->curl);
$curl_info['curl_strerror'] = curl_strerror($curl_info['curl_errno']);
return $curl_info;
}
public function get_file ($url, $filename = null, $referer = null, $progress = true) {
if (empty($filename)) $filename = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
if (!is_dir(dirname($filename))) mkdir(dirname($filename), 0775, true);
$file_handle = fopen($filename, 'w');
curl_setopt($this->curl, CURLOPT_HTTPGET, true);
curl_setopt($this->curl, CURLOPT_URL, $url);
curl_setopt($this->curl, CURLOPT_REFERER, $referer);
curl_setopt($this->curl, CURLOPT_NOPROGRESS, (!$progress));
curl_setopt($this->curl, CURLOPT_NOBODY, false);
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, false);
curl_setopt($this->curl, CURLOPT_FILE, $file_handle);
curl_exec($this->curl);
fclose($file_handle);
$curl_info = curl_getinfo($this->curl);
touch($filename, $curl_info['filetime']);
$curl_info['filename'] = $filename;
$curl_info['curl_errno'] = curl_errno($this->curl);
$curl_info['curl_strerror'] = curl_strerror($curl_info['curl_errno']);
return $curl_info;
}
}
?>