example - Ingresar al sitio remoto con PHP cURL
php curl string (5)
Así es como resolví esto en ImpressPages:
//initial request with login data
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ''http://www.example.com/login.php'');
curl_setopt($ch, CURLOPT_USERAGENT,''Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36'');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, ''cookie-name''); //could be empty, but cause problems on some hosts
curl_setopt($ch, CURLOPT_COOKIEFILE, ''/var/www/ip4.x/file/tmp''); //could be empty, but cause problems on some hosts
$answer = curl_exec($ch);
if (curl_error($ch)) {
echo curl_error($ch);
}
//another request preserving the session
curl_setopt($ch, CURLOPT_URL, ''http://www.example.com/profile'');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
$answer = curl_exec($ch);
if (curl_error($ch)) {
echo curl_error($ch);
}
Soy nuevo en el uso de cURL y es difícil encontrar buenos recursos para ello. Lo que estoy tratando de hacer es iniciar sesión en un sitio remoto, haciendo que curl haga el formulario de inicio de sesión y luego devolver que fue exitoso.
El código que tengo no parece funcionar y solo trata de mostrar la página principal del sitio.
$username="[email protected]";
$password="mypassword";
$url="http://www.myremotesite.com/index.php?page=login";
$cookie="cookie.txt";
$postdata = "email=".$username."&password=".$password;
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_REFERER, $url);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_POST, 1);
$result = curl_exec ($ch);
echo $result;
curl_close($ch);
Qué estoy haciendo mal. Después de que esto funcione, quiero redireccionar a otra página y obtener contenido de mi sitio.
Lo dejé pasar un buen rato, pero volví a visitarlo más tarde. Dado que esta pregunta se ve regularmente Esto es finalmente lo que terminé usando que funcionó para mí.
//username and password of account
$username = trim($values["email"]);
$password = trim($values["password"]);
//set the directory for the cookie using defined document root var
$dir = DOC_ROOT."/ctemp";
//build a unique path with every request to store
//the info per user with custom func.
$path = build_unique_path($dir);
//login form action url
$url="https://www.site.com/login/action";
$postinfo = "email=".$username."&password=".$password;
$cookie_file_path = $path."/cookie.txt";
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
//set the cookie the site has for certain features, this is optional
curl_setopt($ch, CURLOPT_COOKIE, "cookiename=0");
curl_setopt($ch, CURLOPT_USERAGENT,
"Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $_SERVER[''REQUEST_URI'']);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
curl_exec($ch);
//page with the content I want to grab
curl_setopt($ch, CURLOPT_URL, "http://www.site.com/page/");
//do stuff with the info with DomDocument() etc
$html = curl_exec($ch);
curl_close($ch);
Panama Jack Example no funciona para mí - Da un error fatal: Llama a la función indefinida build_unique_path (). Utilicé este código - (más simple - mi opinión):
// options
$login_email = ''[email protected]'';
$login_pass = ''alabala4807'';
$cookie_file_path = "/tmp/cookies.txt";
$LOGINURL = "http://alabala.com/index.php?route=account/login";
$agent = "Nokia-Communicator-WWW-Browser/2.0 (Geos 3.0 Nokia-9000i)";
// begin script
$ch = curl_init();
// extra headers
$headers[] = "Accept: */*";
$headers[] = "Connection: Keep-Alive";
// basic curl options for all requests
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
// set first URL
curl_setopt($ch, CURLOPT_URL, $LOGINURL);
// execute session to get cookies and required form inputs
$content = curl_exec($ch);
// grab the hidden inputs from the form required to login
$fields = getFormFields($content);
$fields[''email''] = $login_email;
$fields[''password''] = $login_pass;
// set postfields using what we extracted from the form
$POSTFIELDS = http_build_query($fields);
// change URL to login URL
curl_setopt($ch, CURLOPT_URL, $LOGINURL);
// set post options
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS);
// perform login
$result = curl_exec($ch);
print $result;
function getFormFields($data)
{
if (preg_match(''/()/is'', $data, $matches)) {
$inputs = getInputs($matches[1]);
return $inputs;
} else {
die(''didnt find login form'');
}
}
function getInputs($form)
{
$inputs = array();
$elements = preg_match_all("/(]+>)/is", $form, $matches);
if ($elements > 0) {
for($i = 0;$i $el = preg_replace(''//s{2,}/'', '' '', $matches[1][$i]);
if (preg_match(''/name=(?:["/'])?([^"/'/s]*)/i'', $el, $name)) {
$name = $name[1];
$value = '''';
if (preg_match(''/value=(?:["/'])?([^"/'/s]*)/i'', $el, $value)) {
$value = $value[1];
}
$inputs[$name] = $value;
}
}
}
return $inputs;
}
$grab_url=''http://grab.url/alabala'';
//page with the content I want to grab
curl_setopt($ch, CURLOPT_URL, $grab_url);
//do stuff with the info with DomDocument() etc
$html = curl_exec($ch);
curl_close($ch);
var_dump($html);
die;
Tenía la misma pregunta y encontré esta respuesta en este sitio web .
Y lo cambié solo un poco (el curl_close en la última línea)
$username = ''myuser'';
$password = ''mypass'';
$loginUrl = ''http://www.example.com/login/'';
//init curl
$ch = curl_init();
//Set the URL to work with
curl_setopt($ch, CURLOPT_URL, $loginUrl);
// ENABLE HTTP POST
curl_setopt($ch, CURLOPT_POST, 1);
//Set the post parameters
curl_setopt($ch, CURLOPT_POSTFIELDS, ''user=''.$username.''&pass=''.$password);
//Handle cookies for the login
curl_setopt($ch, CURLOPT_COOKIEJAR, ''cookie.txt'');
//Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
//not to print out the results of its query.
//Instead, it will return the results as a string return value
//from curl_exec() instead of the usual true/false.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//execute the request (the login)
$store = curl_exec($ch);
//the login is now done and you can continue to get the
//protected content.
//set the URL to the protected file
curl_setopt($ch, CURLOPT_URL, ''http://www.example.com/protected/download.zip'');
//execute the request
$content = curl_exec($ch);
curl_close($ch);
//save the data to disk
file_put_contents(''~/download.zip'', $content);
Creo que esto era lo que estabas buscando. ¿Estoy en lo cierto?
Y una pregunta relacionada útil. Acerca de cómo mantener una sesión viva en cUrl: https://.com/a/13020494/2226796
Ver el origen de la página de inicio de sesión. Busque la etiqueta HTML del form
. Dentro de esa etiqueta, se verá algo como action=
Use ese valor como $url
, no la URL del formulario en sí.
Además, mientras esté allí, verifique que los recuadros de entrada tengan el nombre con el que los haya enumerado.
Por ejemplo, un formulario de inicio de sesión básico se verá similar a:
<form method=''post'' action=''postlogin.php''>
Email Address: <input type=''text'' name=''email''>
Password: <input type=''password'' name=''password''>
</form>
Usando el formulario anterior como ejemplo, cambie su valor de $url
a:
$url="http://www.myremotesite.com/postlogin.php";
Verifique los valores que ha enumerado en $postdata
:
$postdata = "email=".$username."&password=".$password;
y debería funcionar bien.