Консоль C # / Доступ сервера к веб-сайту - PullRequest
3 голосов
/ 27 марта 2012

Я работаю над проектом C #, где мне нужно получить данные с защищенного веб-сайта, у которого нет API или веб-служб.Мой план состоит в том, чтобы войти, перейти на нужную мне страницу и разобрать HTML-код, чтобы получить биты данных, которые мне нужны для входа в базу данных.Сейчас я тестирую консольное приложение, но в конечном итоге оно будет преобразовано в приложение шины службы Azure.

Для того, чтобы что-то получить, вы должны авторизоваться на их странице login.cfm, что означает, что мне нужно загрузить на страницу элементы управления вводом имени пользователя и пароля и нажать кнопку отправки.Затем перейдите к странице, которую мне нужно проанализировать.

Поскольку у меня нет «браузера» для анализа элементов управления, я пытаюсь использовать различные классы C # .NET для перехода на страницу, задайте имя пользователяи пароль, и нажмите «отправить», но ничего не работает.

Какие-либо примеры, которые я могу посмотреть, или .NET-классы, которые я должен рассмотреть, которые были разработаны для такого рода проектов?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Использование класса WebClient в System.Net

Для сохранения cookie-файлов сеанса вам необходимо создать собственный класс WebClient.

#region webclient with cookies
public class WebClientX : WebClient
{
    public CookieContainer cookies = new CookieContainer();
    protected override WebRequest GetWebRequest(Uri location)
    {
        WebRequest req = base.GetWebRequest(location);
        if (req is HttpWebRequest)
            (req as HttpWebRequest).CookieContainer = cookies;
        return req;
    }
    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse res = base.GetWebResponse(request);
        if (res is HttpWebResponse)
            cookies.Add((res as HttpWebResponse).Cookies);
        return res;
    }
}
#endregion

Использовать надстройку браузера, такую ​​как FireBugили инструменты разработки, встроенные в Chrome, для получения данных HTTP POST, отправляемых при отправке формы.Отправьте эти сообщения POST с помощью класса WebClientX и проанализируйте HTML-код ответа.

Самый быстрый способ анализа HTML , когда вы уже знаете, что формат , - это использование простого Regex.Match.Таким образом, вы будете выполнять действия в своем браузере, используя инструменты разработки для записи ваших POST, URL-адресов и HTML-содержимого, и затем вы будете выполнять те же задачи, используя WebClientX.

0 голосов
/ 28 марта 2012

Хорошо, вот полный код для входа на одну страницу, а затем чтение со 2-й страницы после входа в систему.

    class Program
        {
            static void Main(string[] args)
            {

                string uriString = "http://www.remotesite.com/login.cfm";

                // Create a new WebClient instance.
                WebClientX myWebClient = new WebClientX();

                // Create a new NameValueCollection instance to hold some custom parameters to be posted to the URL.
                NameValueCollection myNameValueCollection = new NameValueCollection();

                // Add necessary parameter/value pairs to the name/value container.
                myNameValueCollection.Add("userid", "myname");
                myNameValueCollection.Add("mypassword", "mypassword");

                Console.WriteLine("\nUploading to {0} ...", uriString);
                // 'The Upload(String,NameValueCollection)' implicitly method sets HTTP POST as the request method.            
                byte[] responseArray = myWebClient.UploadValues(uriString, myNameValueCollection);

                // Decode and display the response.
                Console.WriteLine("\nResponse received was :\n{0}", Encoding.ASCII.GetString(responseArray));

                Console.WriteLine("\n\n\n pausing...");
                Console.ReadKey();

                // Go to 2nd page on the site to get additional data
                Stream myStream = myWebClient.OpenRead("https://www.remotesite.com/status_results.cfm?t=8&prog=d");

                Console.WriteLine("\nDisplaying Data :\n");
                StreamReader sr = new StreamReader(myStream);
                StringBuilder sb = new StringBuilder();

                using (StreamReader reader = new StreamReader(myStream, System.Text.Encoding.UTF8))
                {
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        sb.Append(line + "\r\n");
                    }
                }

                using (StreamWriter outfile = new StreamWriter(@"Logfile1.txt"))
                {
                    outfile.Write(sb.ToString());
                }

                Console.WriteLine(sb.ToString());

                Console.WriteLine("\n\n\n pausing...");
                Console.ReadKey();

            }

        }

        public class WebClientX : WebClient
        {
            public CookieContainer cookies = new CookieContainer();
            protected override WebRequest GetWebRequest(Uri location)
            // public override WebRequest GetWebRequest(Uri location)
            {
                WebRequest req = base.GetWebRequest(location);
                if (req is HttpWebRequest)
                    (req as HttpWebRequest).CookieContainer = cookies;
                return req;
            }
            protected override WebResponse GetWebResponse(WebRequest request)
            {
                WebResponse res = base.GetWebResponse(request);
                if (res is HttpWebResponse)
                    cookies.Add((res as HttpWebResponse).Cookies);
                return res;
            }
        }
...