Pergunta

Preciso de algumas informações de um site que não seja meu, para obter essas informações necessárias para fazer login no site para coletar as informações, isso acontece através de um formulário HTML. Como posso fazer essa criação de tela autenticada em C#?

Informação extra:

  • Autenticação baseada em biscoitos.
  • Pós -ação necessária.
Foi útil?

Solução

Você faria o pedido como se tivesse acabado de preencher o formulário. Supondo que seja a postagem, por exemplo, você faz uma solicitação de postagem com os dados corretos. Agora, se você não puder fazer login diretamente na mesma página que deseja raspar, precisará rastrear qualquer cookies definido após sua solicitação de login e incluí -los na sua solicitação de raspagem para permitir que você permaneça conectado.

Pode parecer:

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest;
http.KeepAlive = true;
http.Method = "POST";
http.ContentType = "application/x-www-form-urlencoded";
string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword;
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData);
http.ContentLength = dataBytes.Length;
using (Stream postStream = http.GetRequestStream())
{
    postStream.Write(dataBytes, 0, dataBytes.Length);
}
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;
// Probably want to inspect the http.Headers here first
http = WebRequest.Create(url2) as HttpWebRequest;
http.CookieContainer = new CookieContainer();
http.CookieContainer.Add(httpResponse.Cookies);
HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse;

Pode ser.

Outras dicas

Você pode usar um Webbrowser ao controle. Basta alimentá -lo com o URL do site e depois usar o DOM para definir o nome de usuário e a senha nos campos certos e, eventualmente, enviar um clique para o botão Enviar. Dessa forma, você não se importa com nada além dos dois campos de entrada e o botão Enviar. Sem manuseio de biscoitos, sem análise de HTML crua, sem cheirar http - tudo o que é feito pelo controle do navegador.

Se você for assim, mais algumas sugestões:

  1. Você pode impedir que o controle carregue suplementos como o Flash - pode economizar algum tempo.
  2. Depois de fazer o login, você pode obter as informações necessárias do DOM - não é necessário analisar o HTML bruto.
  3. Se você deseja tornar a ferramenta ainda mais portátil, caso o site mude no futuro, poderá substituir sua manipulação explícita de DOM por uma injeção de JavaScript. O JS pode ser obtido de um recurso externo e, uma vez chamado, pode fazer a população dos campos e o envio.

Para alguns casos, httpResponse.Cookies estará em branco. Use o CookieContainer em vez de.

CookieContainer cc = new CookieContainer();

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest;
http.KeepAlive = true;
http.Method = "POST";
http.ContentType = "application/x-www-form-urlencoded";

http.CookieContainer = cc;

string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword;
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData);
http.ContentLength = dataBytes.Length;
using (Stream postStream = http.GetRequestStream())
{
    postStream.Write(dataBytes, 0, dataBytes.Length);
}
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;
// Probably want to inspect the http.Headers here first
http = WebRequest.Create(url2) as HttpWebRequest;

http.CookieContainer = cc;

HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse;

Como uma adição a Dlambin responde, é necessário ter

http.AllowAutoRedirect=false;

Por outro lado

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;

Ele fará outra solicitação para o URL inicial e você não poderá recuperar o URL2.

Você precisa usar o httpwebrequest e fazer uma postagem. Este link deve ajudá -lo a começar. A chave é que você precisa observar a forma HTML da página da qual você está tentando postar para ver todos os parâmetros que o formulário precisa para enviar a postagem.

http://www.netomatix.com/httppostdata.aspx

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top