Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde a todos.
Estou tentando aprender a usar o curl, mas estou tendo um pouco de dificuldades na parte de fazer login em paginas.
Eu estou testando em site que eu mesmo fiz. Comecei com esse script basico:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);
E apareceu o site para mim...
O problema começa agora. Procurei diversos lugares como fazer o login no curl, mas nenhum funcionou.
ini_set( 'display_errors', TRUE );
error_reporting( E_ALL | E_STRICT );
$ch = curl_init();
// Define a URL original (do formulário de login)
curl_setopt($ch, CURLOPT_URL, 'http://www.meusite.com.br/index.php');
// Habilita o protocolo POST
curl_setopt ($ch, CURLOPT_POST, 1);
// Imita o comportamento patrão dos navegadores: manipular cookies
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
// Define o tipo de transferência (Padrão: 1)
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_USERPWD,"login:admin&senha:12345");
// Executa a requisição
$store = curl_exec ($ch);
// Define uma nova URL para ser chamada (após o login)
curl_setopt($ch, CURLOPT_URL, 'http://www.meusite.com.br/principal.php');
// Executa a segunda requisição
$content = curl_exec ($ch) or die( curl_error( $ch ) );
if(curl_exec($ch) === false) {
echo 'Erro no cURL: ' . curl_error($ch);
} else {
echo 'Sucesso!';
}Simplesmente não aparece nada, branco, nenhum erro, NADA...
Curl é tão complicado assim, ou eu to sendo tão burro que não vejo o erro???
Agradeço desde já qualquer ajuda...
É um sistema de login simples, digita o login e a senha e o script faz um teste se o login e senha existem no banco de dados, se existir ele deixar passar, se não, volta para a pagina de login...
Troquei o CURLOPT_USERPWD pelas linhas abaixo, mesmo problema, nada aparece.
$data = array('login' => 'admin', 'senha' => '12345');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);estranho.
dá um echo em $content, em vez de mostrar apenas "sucesso" ou "erro"
O que eu tinha perguntado antes era que tipo de autenticação a página permite: com formulários ou via HTTP Auth. Era referente à página de login que você acesa via cURL, não o script que usa o cURL
Fiz o que você pediu, nada...
/*
if(curl_exec($ch) === false) {
echo 'Erro no cURL: ' . curl_error($ch);
} else {
echo 'Sucesso!';
}echo $content;
Não sei se isso vai ajudar...
Eu retirei o "or die( curl_error( $ch ) );"
E agora o If funcionou, ta mostrando "Sucesso", mas não aparece nada. E com o echo no $content continua sem aparecer nada...
deixa o CURL_HEADER em 1, pata vermos o header HTTP
e, de novo, use $content no iF, não uma nova chamado a curl_exec
Fiz assim, ta certo? AInda continua dando o mesmo problema, nao mostra nada...
curl_setopt ($ch, CURLOPT_HEADER, true);
if($content === false) {
echo 'Erro no cURL: ' . curl_error($ch);
} else {
echo 'Sucesso!';
}vocÊ colocou antes de curl_exec?
e você não deu echo em $content?
Posta o código completo, como ele está atualmente.
O codigo completo como esta agora
ini_set( 'display_errors', TRUE );
error_reporting( E_ALL | E_STRICT );
$ch = curl_init();
// Define a URL original (do formulário de login)
curl_setopt($ch, CURLOPT_URL, 'http://www.meusite.com.br/adm/index.php');
// Habilita o protocolo POST
curl_setopt ($ch, CURLOPT_POST, 1);
// Imita o comportamento patrão dos navegadores: manipular cookies
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
// Define o tipo de transferência (Padrão: 1)
curl_setopt ($ch, CURLOPT_HEADER, true);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$data = array('login' => 'admin', 'senha' => 'passwd');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// Executa a requisição
$store = curl_exec ($ch);
// Define uma nova URL para ser chamada (após o login)
curl_setopt($ch, CURLOPT_URL, 'http://www.meusite.com.br/adm/index2.php');
// Executa a segunda requisição
$content = curl_exec($ch);
if($content === false) {
echo 'Erro no cURL: ' . curl_error($ch); echo 'Sucesso!';
}
// Encerra o cURL
curl_close ($ch);
e o que está aparecendo?
de novo, você não deu echo em $content. aí não mostrará os headers HTTP mesmo...
Apareceu isso aqui
HTTP/1.1 100 Continue HTTP/1.1 302 Moved Temporarily Connection: close Date: Thu, 13 Jan 2011 17:06:48 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET Set-Cookie: PHPSESSID=uck01u0bmh4m4gk2lf4a1uo2p0; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Location: index.php Content-type: text/html Content-Length: 0
Ou seja, requisição correta
Porém, o HTTP informa que foi movido
Use FOLLOW_LOCATION para o cURL seguir automaticamente esses redirecionamentos
O resultado agora foi diferente, mas não o esperado. Ele voltou para a pagina index.php, sendo que eu queria que ele fosse para a index2.php. Mas alterou o destino de index2.php para logar.php, ele foi para a pagina index2.php. Ou seja, aparentemente funcionou.
Uma ultima pergunta, meu script funciona do seguinte forma.
1-index.php - Preenche os dados de acesso(login e senha), e envia esses dados para o logar.php
2-logar.php - Verifica se os dados estão corretos, se estiverem corretos, vai para o index2.php, se não estiverem, volta para o index.php
A minha pergunta é, como eu faria para acessar uma pagina que não fosse a index2.php? Se eu quisesse acessar direto a fotos.php? Tem como usando o curl?
o CURL_HEADER retorna uma string com o cookie gerado. basta pegar a string e criar um cookie com CURL_COOKIE, se não me engano
Você criou a variável $content. Pode usá-la no if, em vez de chamar curl_exec de novo
Talvez o problema seja o CURLOPT_USERPWD. Nunca o usei, mas suponho que seja para autenticação HTTP, não para autenticação com formulário, como costumamos ver por aí. Que tipo de autenticação sua página suporta?