php cURL log in jsp website e retorna HTML

Estou tentando usar o cURL para fazer login em um site jsp / tomcat (nós chamaremos https://unknown.com por motivos de privacidade) e devolvemos o HTML de uma página. Observei o painel do Net no firebug e o painel de cookies com o Firecookie para delinear o manual das etapas abaixo:

  1. Abra a raiz da web – https://unknown.com
  2. Redirecionado para https://unknown.com/common/frames.jsp -Cookie Criado: JSESSIONID
  3. Preencha j_username e j_password
  4. Postar “j_username = user & j_password = pass & submit = logon” para https://unknown.com/common/j_security_check
  5. Redirecione para https://unknown.com/common/frames.jsp
  6. O usuário seleciona o link da página inicial onde o HTML a ser retornado é.

Então, basicamente, não tenho muita experiência com a CURL e não estou tendo muita sorte, eu realmente preciso começar com a compreensão das etapas que a CURL exigirá para fazer login no site e ir para a página de destino.

EDIT: Aqui está o meu código:

//user login information $username = "user"; $password = "pass"; $postData = "j_username=".$username."&j_password=".$password."&logon=submit"; $cookie_file = "/tmp/curl_cookies.txt"; //$fp = fopen($cookie_file, "w"); //fclose($fp); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://unknown.com/common/j_security_check'); curl_setopt($ch, CURLOPT_POSTFIELDS,$postData); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3"); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_setopt($ch, CURLOPT_REFERER, "https://unknown.com/common/Frames.jsp"); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); curl_close($ch); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://unknown.com/claritymatch/ClarityBatchViewer.jsp?id=123'); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3"); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); curl_close($ch); echo $data; 

Não funciona quando eu executo pela primeira vez o arquivo .php, mas na segunda vez que ele traz o HTML de destino – como posso obtê-lo apenas trazê-lo pela primeira vez? Além disso, uma vez que estou armazenando o cookie JSESSIONID no arquivo indicado acima, não terei problemas com o ID da session que não mudaria ou mudaria conforme necessário?

Aqui estão algumas sugestões para sua situação …

  • Reutilize a mesma alça de curvatura por simplicidade
    Isso reduz a necessidade de duplicar opções para cada solicitação. Defina a maioria das suas opções no início e faça isso apenas uma vez. Eu me refiro principalmente a opções de cookie, user-agent, follow-location etc.
    Em seguida, você pode definir o URL e o método de solicitação para cada solicitação individual que você fizer.
    Você pode até obter desempenho adicional, adicionando um header Keep-Alive ao seu pedido, então, se o servidor remoto o suportar, a mesma conexão será usada para fazer várias solicitações sem ter que se reconectar cada vez.

  • Defina CURLOPT_FOLLOWLOCATION como true e comece desde o início
    Tente seguir exatamente o que você vê o navegador. Ou seja, solicite a raiz da web; se o site redirecioná-lo para o URL de verificação de segurança, o CURL seguirá aquele redirect e capturar todos os cookies definidos no processo. Uma solicitação CURL pode resultar em várias solicitações HTTP se um redirecionamento for enviado. Em seguida, vá para “preencher” o formulário de login.

  • Use http_build_query () para os dados da sua postagem
    Não há nada de errado com a forma como você configura sua string de postagem, mas os dados devem ser codificados por url. O uso de http_build_query() com uma matriz é mais fácil de manipular e resultará em uma seqüência codificada por url que você pode alimentar diretamente para o CURL.

Veja também a resposta que postei há alguns dias para uma pessoa tentando fazer algo parecido. Eu também postei algumas referências para algumas outras respostas que contêm amostras completas de solicitação de múltiplos URLs usando cURL; apenas olhar para essas respostas deve ajudá-lo a ter uma idéia de como fazer o que deseja. Especialmente veja esta resposta, que foi a primeira referência na publicação que mencionei, pois mostra como fazer login no Google ao fazer várias solicitações de postagem e, finalmente, obter uma solicitação.