Pergunta

Eu sou relativamente novo para usando C #, e ter um aplicativo que lê partes do código-fonte em um site. Que todas as obras; mas o problema é que a página em questão exige que o usuário estar conectado para acesso este código-fonte. O meu programa precisa de uma maneira de inicialmente registrar o usuário no site- Depois que é feito, eu vou ser capaz de acessar e ler o código-fonte.

O site que precisa ser conectado a é: mmoinn.com/index.do?PageModule=UsersLogin

Eu procurei por todo o dia sobre como fazer isso e exemplos tentaram, mas não tiveram sorte.

Agradecemos antecipadamente

Nenhuma solução correta

Outras dicas

Você pode continuar a usar WebClient para POST (em vez de GET, que é a HTTP verbo você 're usando atualmente com DownloadString), mas eu acho que você vai achar que é mais fácil trabalhar com os (ligeiramente) as classes de nível inferior WebRequest e WebResponse.

Há duas partes para isso - o primeiro é para postar o formulário de login, o segundo está a recuperar o cabeçalho "Set-cookie" e enviar isso de volta para o servidor como "Cookie", juntamente com o seu pedido GET. O servidor usará esse cookie para identificá-lo a partir de agora (supondo que ele está usando a autenticação baseada em cookies que eu estou bastante confiante de que é como essa página retorna um cabeçalho Set-cookie que inclui "PHPSESSID").


postagem para o formulário de login

mensagens de formulário são fáceis de simular, é apenas um caso de formatar seus dados post da seguinte forma:

field1=value1&field2=value2

Usando o WebRequest e código que eu adaptado de Scott Hanselman , aqui está como você ia postar formulário de dados para seu formulário de login:

string formUrl = "http://www.mmoinn.com/index.do?PageModule=UsersAction&Action=UsersLogin"; // NOTE: This is the URL the form POSTs to, not the URL of the form (you can find this in the "action" attribute of the HTML's form tag
string formParams = string.Format("email_address={0}&password={1}", "your email", "your password");
string cookieHeader;
WebRequest req = WebRequest.Create(formUrl);
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
req.ContentLength = bytes.Length;
using (Stream os = req.GetRequestStream())
{
    os.Write(bytes, 0, bytes.Length);
}
WebResponse resp = req.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];

Aqui está um exemplo do que você deve ver no cabeçalho Set-cookie para o seu formulário de login:

PHPSESSID=c4812cffcf2c45e0357a5a93c137642e; path=/; domain=.mmoinn.com,wowmine_referer=directenter; path=/; domain=.mmoinn.com,lang=en; path=/;domain=.mmoinn.com,adt_usertype=other,adt_host=-

Lendo a página de trás do formulário de login

Agora você pode executar o seu pedido GET para uma página que você precisa estar logado para.

string pageSource;
string getUrl = "the url of the page behind the login";
WebRequest getRequest = WebRequest.Create(getUrl);
getRequest.Headers.Add("Cookie", cookieHeader);
WebResponse getResponse = getRequest.GetResponse();
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
    pageSource = sr.ReadToEnd();
}

EDIT:

Se você precisa ver os resultados do primeiro post, você pode recuperar o HTML ele voltou com:

using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
    pageSource = sr.ReadToEnd();
}

Coloque este diretamente abaixo cookieHeader = resp.Headers["Set-cookie"]; e depois inspecionar a corda realizada em pageSource.

Você pode simplificar as coisas um pouco, criando uma classe que deriva de WebClient, substituindo seu método GetWebRequest e definindo um objeto CookieContainer nele. Se você sempre definir a mesma instância CookieContainer, em seguida, a gestão cookie será feita automaticamente para você.

Mas a única maneira de chegar ao HttpWebRequest antes de ser enviado é para herdar de WebClient e substituir esse método.

public class CookieAwareWebClient : WebClient
{
    private CookieContainer cookie = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = cookie;
        }
        return request;
    }
}

var client = new CookieAwareWebClient();
client.BaseAddress = @"https://www.site.com/any/base/url/";
var loginData = new NameValueCollection();
loginData.Add("login", "YourLogin");
loginData.Add("password", "YourPassword");
client.UploadValues("login.php", "POST", loginData);

//Now you are logged in and can request pages    
string htmlSource = client.DownloadString("index.php");

Matthew Brindley , seu código trabalhou muito bom para algum site que eu precisava (com login), mas eu precisava para mudar para HttpWebRequest e HttpWebResponse caso contrário eu obter um 404 Bad Request do servidor remoto. Também eu gostaria de compartilhar minha solução alternativa usando seu código, e é que eu tentei fazer o login para um site baseado em moodle , mas não funcionou em sua etapa " recebendo a página por trás do formulário de login " porque quando com sucesso postagem o login, o 'Set-Cookie' Header não retornar nada, apesar de outros sites faz.

Então, eu acho que isso que temos de armazenar cookies para próximos pedidos, então eu adicionei isso.
Para o " postagem para o formulário de login " bloco de código:

var cookies = new CookieContainer();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(formUrl);
req.CookieContainer = cookies;


E Para o " Lendo a página de trás do formulário de login ":

HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
getRequest.CookieContainer = new CookieContainer();
getRequest.CookieContainer.Add(resp.Cookies);
getRequest.Headers.Add("Cookie", cookieHeader);


Fazendo isso, me deixa Ligar-me e obter o código fonte da página "por trás login" (moodle com base website) Eu sei que este é um uso vaga do CookieContainer e HTTPCookies porque podemos perguntar primeiro é existe uma previamente um conjunto de cookies salvos antes de enviar o pedido para o servidor. Isso funciona sem problema de qualquer maneira, mas aqui está uma boa informação para ler sobre WebRequest e WebResponse com projetos de amostra e tutorial:
Recuperando HTTP conteúdo em .NET
Como usar HttpWebRequest e HttpWebResponse no .NET

Às vezes, pode ajudar a desligar AllowAutoRedirect e definindo tanto POST login e página GET solicita o mesmo agente do usuário.

request.UserAgent = userAgent;
request.AllowAutoRedirect = false;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top