Como usar o webclient em um site seguro?
-
09-06-2019 - |
Pergunta
Preciso automatizar um processo envolvendo um site que utiliza um formulário de login.Preciso capturar alguns dados nas páginas seguintes à página de login.
Eu sei como copiar páginas normais, mas não aquelas que estão atrás de um site seguro.
- Isso pode ser feito com a classe .NET WebClient?
- Como eu faria login automaticamente?
- Como eu manteria o login nas outras páginas?
Solução
Uma maneira seria automatizar um navegador - você mencionou o WebClient, então acho que você pode estar se referindo ao WebClient no .NET.
Dois pontos principais:
- Não há nada de especial em https relacionado ao WebClient - ele simplesmente funciona
- Os cookies normalmente são usados para realizar autenticação – você precisará capturá-los e reproduzi-los
Aqui estão os passos que eu seguiria:
- GET o formulário de login, capture o cookie na resposta.
- Usando Xpath e HtmlAgilityPack, encontre os nomes e valores dos campos "tipo de entrada = oculto".
- POST para a ação do formulário de login com nome de usuário, senha e valores de campo ocultos no corpo da solicitação.Inclua o cookie nos cabeçalhos da solicitação.Novamente, capture o cookie na resposta.
- OBTENHA as páginas desejadas, novamente, com o cookie nos cabeçalhos da solicitação.
Na etapa 2, menciono um método um tanto complicado para automatizar o login.Normalmente, você pode postar com nome de usuário e senha diretamente na ação conhecida do formulário de login, sem obter o formulário inicial ou retransmitir os campos ocultos.Alguns sites possuem validação de formulário (diferente da validação de campo) em seus formulários o que faz com que esse método não funcione.
HtmlAgilityPack é uma biblioteca .NET que permite transformar html mal formado em um XmlDocument para que você possa XPath sobre ele.Bem útil.
Finalmente, você pode se deparar com uma situação em que o formulário depende do script do cliente para alterar os valores do formulário antes de enviar.Talvez seja necessário simular esse comportamento.
Usar uma ferramenta para visualizar o tráfego http para este tipo de trabalho é extremamente útil - recomendo ieHttpHeaders, Violinista, ou Firebug (guia da rede).
Outras dicas
Você pode simular facilmente a entrada do usuário.Você pode enviar o formulário na página da web do seu programa, enviando uma solicitação post\get para um site.
O formulário de login típico é semelhante a:
<form name="loginForm" method="post" Action="target_page.html">
<input type="Text" name="Username">
<input type="Password" name="Password">
</form>
Você pode enviar uma solicitação de postagem ao site fornecendo valores para os campos Nome de usuário e Senha.O que acontece depois que você envia sua solicitação depende muito do site, normalmente você será redirecionado para alguma página.Suas informações de autorização serão armazenadas em sessões\cookie.Portanto, se você raspar o cliente e puder manter a sessão da web\entende cookies, você poderá acessar páginas protegidas.
Não está claro na sua pergunta qual linguagem/estrutura você usará.Por exemplo, existe uma estrutura para captura de tela (incluindo funcionalidade de login) escrita em perl - WWW::Mecanizar
Observe que você pode enfrentar alguns problemas se o site no qual está tentando fazer login usar scripts java ou algum tipo de CAPTCHA.
Você pode esclarecer por favor?A classe WebClient de que você fala é aquela em HTTPUnit/Java?
Nesse caso, sua sessão deverá ser salva automaticamente.
Não está claro na sua pergunta a qual classe (ou idioma) WebClient você está se referindo.
Se tiver um Java Runtime você pode usar a classe Apache HttpClient;aqui está um exemplo que escrevi usando Groovy que acessa a API Delicious por SSL:
def client = new HttpClient()
def credentials = new UsernamePasswordCredentials( "username", "password" )
def authScope = new AuthScope("api.del.icio.us", 443, AuthScope.ANY_REALM)
client.getState().setCredentials( authScope, credentials )
def url = "https://api.del.icio.us/v1/posts/get"
def method = new PostMethod( url )
method.addParameter( "tag", tag )
client.executeMethod( method )