php - test - print file_get_contents
file_get_contents from url que solo se puede acceder después de iniciar sesión en el sitio web (2)
Me gustaría hacer un script php que pueda capturar una página de un sitio web. Piense file_get_contents ($ url) .
Sin embargo, este sitio web requiere que complete un formulario de inicio de sesión de nombre de usuario / contraseña para poder acceder a cualquier página. Me imagino que una vez que haya iniciado sesión, el sitio web envía a su navegador una cookie de autenticación y con cada solicitud de navegador consiguiente, la información de la sesión se transfiere al sitio web para autenticar el acceso.
Quiero saber cómo puedo simular este comportamiento del navegador con un script php para obtener acceso y capturar una página de este sitio web.
Más específicamente, mis preguntas son:
- ¿Cómo envío una solicitud que contiene mis datos de inicio de sesión para que el sitio web responda con la información de la sesión / cookie?
- ¿Cómo leo la información de la sesión / cookie?
- ¿Cómo devuelvo la información de esta sesión con cada solicitud consiguiente ( file_get_contents , curl ) al sitio web?
Gracias.
La extensión http pecl puede hacerlo, también PEAR :: HTTP_Client , Snoopy y muchas otras muchas bibliotecas / clases. Si (por el motivo que sea) desea lograr esto con file_get_contents
, puede usar las opciones de contexto de flujo para el envoltorio http para establecer los parámetros POST y de cookie y stream_get_meta_data para leer los encabezados de respuesta, incluidas las cookies.
Curl es muy adecuado para hacerlo. No necesita hacer nada especial más que configurar las opciones CURLOPT_COOKIEJAR
y CURLOPT_COOKIEFILE
. Una vez que haya ingresado al pasar los campos de formulario desde el sitio, la cookie se guardará y Curl usará esa misma cookie para solicitudes posteriores automáticamente, como lo ilustra el siguiente ejemplo.
Tenga en cuenta que la función siguiente guarda las cookies en cookies/cookie.txt
por lo que debe asegurarse de que el directorio / archivo exista y pueda escribirse.
$loginUrl = ''http://example.com/login''; //action from the login form
$loginFields = array(''username''=>''user'', ''password''=>''pass''); //login form field names and values
$remotePageUrl = ''http://example.com/remotepage.html''; //url of the page you want to save
$login = getUrl($loginUrl, ''post'', $loginFields); //login to the site
$remotePage = getUrl($remotePageUrl); //get the remote page
function getUrl($url, $method='''', $vars='''') {
$ch = curl_init();
if ($method == ''post'') {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, ''cookies/cookies.txt'');
curl_setopt($ch, CURLOPT_COOKIEFILE, ''cookies/cookies.txt'');
$buffer = curl_exec($ch);
curl_close($ch);
return $buffer;
}