Question

Je suis relativement nouveau à l'aide de C #, et ont une application qui lit les parties du code source sur un site Web. Que tous les travaux; mais le problème est que la page en question, il faut que l'utilisateur soit connecté pour accéder à ce code source. Ce que mon programme a besoin d'un moyen de se connecter d'abord l'utilisateur dans le site- après cela est fait, je serai en mesure d'accéder et de lire le code source.

Le site qui doit être connecté en est: mmoinn.com/index.do?PageModule=UsersLogin

Je l'ai cherché toute la journée sur la façon de le faire et a essayé des exemples, mais ai pas eu de chance.

Merci d'avance

Pas de solution correcte

Autres conseils

Vous pouvez continuer à utiliser WebClient POST (au lieu de GET, qui est le HTTP verbe êtes actuellement en utilisant avec DownloadString), mais je pense que vous le trouverez plus facile de travailler avec les (un peu) des classes de niveau inférieur WebRequest et WebResponse.

Il y a deux parties à cette question - la première est d'afficher le formulaire de connexion, le second se remet l'en-tête et l'envoi « Set-Cookie » qui au serveur comme « Cookie » avec votre requête GET. Le serveur utilisera ce cookie pour vous identifier à partir de maintenant (en supposant qu'il utilise cookie d'authentification basée que je suis assez confiant, il est comme cette page retourne un en-tête Set-Cookie qui comprend « PHPSESSID »).


affichage sur le formulaire de connexion

messages de formulaire sont faciles à simuler, il est juste un cas de formatage de vos données post comme suit:

field1=value1&field2=value2

Utilisation WebRequest et le code de , voici comment vous postez les données de formulaire à votre formulaire de connexion:

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"];

Voici un exemple de ce que vous devriez voir dans l'en-tête Set-Cookie pour votre formulaire de connexion:

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

la page derrière obtenir le formulaire de connexion

Vous pouvez maintenant effectuer votre requête GET à une page que vous devez être connecté pour.

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:

Si vous voulez voir les résultats de la première POST, vous pouvez récupérer le code HTML, il est revenu avec:

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

Placez ce directement au-dessous cookieHeader = resp.Headers["Set-cookie"]; puis inspecter la chaîne tenue en texte source.

Vous pouvez simplifier les choses tout à fait un peu en créant une classe qui dérive de WebClient, remplaçant sa méthode GetWebRequest et la fixation d'un objet CookieContainer sur elle. Si vous définissez toujours la même instance CookieContainer, puis la gestion des cookies sera traitée automatiquement pour vous.

Mais la seule façon d'obtenir au HttpWebRequest avant qu'il ne soit envoyé est d'hériter de WebClient et de remplacer cette méthode.

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 , votre code a travaillé très bon pour un certain site Web que je avais besoin (avec login), mais je avais besoin pour changer HttpWebRequest et HttpWebResponse sinon je reçois un 404 Bad Request à partir du serveur distant. Aussi je voudrais partager ma solution en utilisant votre code, et est que je l'ai essayé de se connecter à un site Web basé sur moodle , mais il ne fonctionne pas à votre étape « Afficher l'aide derrière le formulaire de connexion » parce que quand avec succès afficherons la connexion, l'en-tête 'Set-Cookie' n'a pas retourné quoi que ce soit, malgré d'autres sites ne.

Je pense donc que là où nous devons stocker des cookies pour les demandes suivantes, donc j'ajouté cela.
Pour la " Affectations à la forme de connexion " bloc de code:

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


Et à la " la page derrière obtenir le formulaire de connexion ":

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


Faire cela, me laisse Me IDENTIFIER et obtenir le code source de la page « derrière login » (moodle base de site Web) Je sais que cela est une utilisation vague du CookieContainer et HTTPCookies parce que nous pouvons demander d'abord est il un ensemble précédemment de cookies enregistrés avant d'envoyer la demande au serveur. Cela fonctionne sans problème de toute façon, mais voici une bonne information à lire sur WebRequest et WebResponse avec des exemples de projets et tutoriel:
Récupération du contenu HTTP dans .NET
Comment utiliser HttpWebRequest et HttpWebResponse dans .NET

Parfois, il peut aider à éteindre AllowAutoRedirect et la mise à la fois POST de connexion et GET page demande le même agent utilisateur.

request.UserAgent = userAgent;
request.AllowAutoRedirect = false;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top