HttpWebRequest в .NET - вход на веб-страницу - PullRequest
0 голосов
/ 03 октября 2010

Привет - простой вопрос впереди!

СОСТОЯНИЕ :

Я зашел так далеко, я реализовал решение, где я получаюпеченье с сеансом, но он все еще не работает.В инструменте анализатора я вижу разницу между моим приложением и использованием реального веб-сайта следующим образом:

REAL: ASPSESSIONIDSCRAASDB = EFFBFPEAKOBJGLAPNABPLLCB;проходит = 15;ChatCannel = 1

ПРОГРАММА: ASPSESSIONIDSCRAASDB = KPGBFPEAHNDLENDEOAEELMPJ

Программа работает так, как будто она не вошла в систему, даже если я сохранил сеанс в виде файла cookie ..


Я пытаюсь создать небольшую программу, помогающую мне играть в нишевую интернет-игру (только расчеты и прочее) ..

В любом случае - мне нужно войти!Система входа в систему основана на сессиях ..

Итак ... Я попробовал это:

string url = "http://server1.online-trucker.dk";

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

StreamWriter post = new StreamWriter(req.GetRequestStream());
post.Write("Username=MyUsername&Password=MyPassword");
post.Close();

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
resp.GetResponseStream();
string kage = GetContentFromStream(resp.GetResponseStream()); 

Будучи немного наивным, я ожидаю, что "kage" должен содержать ответ после нажатиякнопку «Войти», и мой маленький сканер должен был войти в систему.

HTML-код, с которым я играю:

       Brugernavn:
   <input type="text" name="Username" size="10" STYLE="font-size: 10px; background-color: #CCCCCC; border: 1px solid #666666;">
   Kode:<input type="password" name="Password" size="10" STYLE="font-size: 10px; background-color: #CCCCCC; border: 1px solid #666666;">
   <input type="submit" name="Logind" value="Logind" STYLE="font-size: 10px; background-color: #CCCCCC; border: 1px solid #666666;"> 

Но если у вас есть немного знаний о WebRequest,Я уверен, что вы сейчас будете смеяться!: -)

Что я хочу сделать:

  • Введите имя пользователя / пароль
  • Нажмите "Log ind"
  • Иметь возможность играть во всем домене сайта, теперь активная сессия

Я очень надеюсь, что кто-то поможет!

Ответы [ 2 ]

2 голосов
/ 04 октября 2010

Сеансы обычно хранятся с файлами cookie, поэтому вам необходимо назначить контейнер cookie для вашего запроса, который можно использовать повторно.Таким образом, при условии, что ваш логин с правильными параметрами запроса вам поможет следующее:

var cookieJar = new CookieContainer();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.CookieContainer = cookieJar;
//...make req...
req = (HttpWebRequest)WebRequest.Create(url); // request to the second page
req.CookieContainer = cookieJar; // pass inn the same cookie container

Я включил класс-обертку загрузки, который отслеживает файлы cookie, поддерживает gzip и отслеживает правильную кодировкустр.Используйте это так:

var dl = new Downloader("Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)")
var pageOne = dl.GetPage( "http://www.cnn.com/", null );
var pageTwo = dl.GetPage( "http://edition.cnn.com/2010/WORLD/europe/10/02/missing.balloonists/index.html", dl.Url);


public class Downloader
{
    static CookieContainer _cookieJar = new CookieContainer();
    private readonly string _userAgent;

    public Encoding Encoding { get; set; }
    public WebHeaderCollection Headers { get; set; }
    public Uri Url { get; set; }

    public static void ClearBag()
    {
        _cookieJar = new CookieContainer();
    }

    public Downloader(string userAgent)
    {
        Encoding = Encoding.GetEncoding("ISO-8859-1");
        _userAgent = userAgent;
    }

    public string GetPage(string url, string referer)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.CookieContainer = _cookieJar;

        if (!string.IsNullOrEmpty(referer))
            request.Referer = referer;
        if (!string.IsNullOrEmpty(_userAgent))
            request.UserAgent = _userAgent;

        request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
        request.Headers.Add("Cache-Control", "no-cache");

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            Headers = response.Headers;
            Url = response.ResponseUri;
            return ProcessContent(response);
        }
    }

    private string ProcessContent(HttpWebResponse response)
    {
        SetEncodingFromHeader(response);

        Stream s = response.GetResponseStream();
        if (response.ContentEncoding.ToLower().Contains("gzip"))
            s = new GZipStream(s, CompressionMode.Decompress);
        else if (response.ContentEncoding.ToLower().Contains("deflate"))
            s = new DeflateStream(s, CompressionMode.Decompress);  

        MemoryStream memStream = new MemoryStream();
        int bytesRead;
        byte[] buffer = new byte[0x1000];
        for (bytesRead = s.Read(buffer, 0, buffer.Length); bytesRead > 0; bytesRead = s.Read(buffer, 0, buffer.Length))
        {
            memStream.Write(buffer, 0, bytesRead);
        }
        s.Close();
        string html;
        memStream.Position = 0;
        using (StreamReader r = new StreamReader(memStream, Encoding))
        {
            html = r.ReadToEnd().Trim();
            html = CheckMetaCharSetAndReEncode(memStream, html);
        }            
        return html;
    }

    private void SetEncodingFromHeader(HttpWebResponse response)
    {
        string charset = null;
        if (string.IsNullOrEmpty(response.CharacterSet))
        {
            Match m = Regex.Match(response.ContentType, @";\s*charset\s*=\s*(?<charset>.*)", RegexOptions.IgnoreCase);
            if (m.Success)
            {
                charset = m.Groups["charset"].Value.Trim(new[] { '\'', '"' });
            }
        }
        else
        {
            charset = response.CharacterSet;
        }
        if (!string.IsNullOrEmpty(charset))
        {
            try
            {
                Encoding = Encoding.GetEncoding(charset);
            }
            catch (ArgumentException)
            {
            }
        }
    }

    private string CheckMetaCharSetAndReEncode(Stream memStream, string html)
    {
        Match m = new Regex(@"<meta\s+.*?charset\s*=\s*(?<charset>[A-Za-z0-9_-]+)", RegexOptions.Singleline | RegexOptions.IgnoreCase).Match(html);
        if (m.Success)
        {
            string charset = m.Groups["charset"].Value.ToLower();
            if ((charset == "unicode") || (charset == "utf-16"))
            {
                charset = "utf-8";
            }

            try
            {
                Encoding metaEncoding = Encoding.GetEncoding(charset);
                if (Encoding != metaEncoding)
                {
                    memStream.Position = 0L;
                    StreamReader recodeReader = new StreamReader(memStream, metaEncoding);
                    html = recodeReader.ReadToEnd().Trim();
                    recodeReader.Close();
                }
            }
            catch (ArgumentException)
            {
            }
        }
        return html;
    }
}
1 голос
/ 03 октября 2010

Многие из этих сайтов делают все возможное для предотвращения автоматических входов в систему, как вы пытаетесь сделать здесь.Вы должны убедиться, что отправляете точные данные, которые они ожидают.Один из способов, которые я обычно делаю, - это запускать анализатор пакетов и проверять HTTP-пакеты, которые летят туда-сюда, когда я вхожу в систему обычным способом.Как только у меня будет базовый уровень для работы, нужно просто получить код, имитирующий поведение.

Хорошее бесплатное приложение для отслеживания пакетов - WireShark.http://www.wireshark.org

...