С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14

Авторизация через webBrowser1

07.11.2018, 13:44. Показов 1900. Ответов 16

Студворк — интернет-сервис помощи студентам
Пытаюсь авторизоваться на сайте и перейти на другую страницу.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void button1_Click(object sender, EventArgs e)
        {
 
            // Начальная страница
            webBrowser1.Navigate("http://server/application/login/");
            pause_wb();
            webBrowser1.Document.GetElementById("username").InnerText = "user1";
            pause_wb();             
            webBrowser1.Document.GetElementById("password").SetAttribute("value", "pass1");
            pause_wb();
 
            webBrowser1.Document.GetElementById("userSignIn").InvokeMember("click");
            pause_wb();
 
            // Страница на которую нужно перейти после авторизации
            webBrowser1.Navigate("http://server/application/obj/");
         }
 
// Пауза для прогрузки webBrowser
protected void pause_wb()
        {
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
            }
        }
После того как пытаюсь перейти по новой ссылке которая на этом же сервере http://server/application/obj/ то отображается опять первоначальная страница.

Можете подсказать как можно изменить ссылку чтобы не потерять авторизацию?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.11.2018, 13:44
Ответы с готовыми решениями:

Авторизация world of tanks, ввод данных в webbrowser1, https://ru.wargaming.net/id/signin/
Здравствуйте, буду очень признателен, если выложите код для авторизации на сайте или хотя бы как ввести данные на сайт, заранее благодарен,...

Горим! Нужна авторизация через PHP и второй вариант через Cookie
Использование сессий и cookie Ваш сайт состоит из 2-х php-страниц : 1. Страница авторизации. Здесь пользователь вводит имя и пароль,...

Авторизация через программу и продолжение просмотра через браузер
В общем, пишу программу, по нажатию кнопки на форме, проводится авторизация на сайте POST запросом. Авторизация через программу проходит...

16
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
07.11.2018, 17:45
С веб браузером не работал, но скорее всего он не поддерживает куки и их нужно выставить вручную, узнать какие куки просит выставить сервер можно через fiddler
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
08.11.2018, 14:18  [ТС]
Сделал так

Вначале
C#
1
2
3
string g_cook = "";
        [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);
потом
C#
1
2
3
4
5
g_cook = webBrowser1.Document.Cookie.ToString();
            
 
            InternetSetCookie("http://server/application/", null, g_cook);
            webBrowser1.Navigate("http://server/application/obj");
Добавлено через 9 минут
Если кто-нибудь знает, а как получить доступ к сайту через компонент WebClient
Есть сайт закрытый паролем, задача авторизоваться на нем и загрузить определенную страницу например http://server/application/obj в формате html и распарсить ее. Через описанный выше пример webBrowser1 работает, но хотелось бы попроще.
Можете подсказать как это сделать например через WebClient или еще как-нибудь?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14168 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
08.11.2018, 14:59
Цитата Сообщение от wvl16865 Посмотреть сообщение
Можете подсказать как это сделать например через WebClient или еще как-нибудь?
Делаем запрос(ы) для авторизации и затем запрашиваем нужную страницу. Главное использовать один и тот же WebClient и CookieContainer. Класс CookieWebClient облегчит задачу.

Цитата Сообщение от KinDer015 Посмотреть сообщение
С веб браузером не работал, но скорее всего он не поддерживает куки
Поддерживает.
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
08.11.2018, 17:21  [ТС]
Пробовал так сделать. Не проходит по второй ссылке.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[System.ComponentModel.DesignerCategory("Code")]
class CookieWebClient : WebClient
{
    readonly CookieContainer _cookies = new CookieContainer();
 
    public CookieContainer Cookies { get { return _cookies; } }
 
    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        HttpWebRequest httpRequest = request as HttpWebRequest;
        if (httpRequest != null)
        {
            httpRequest.CookieContainer = _cookies;
        }
        return request;
    }
}

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void button3_Click(object sender, EventArgs e)
        {
 
            using (var webClient = new CookieWebClient())
            {
 
                webClient.UploadString("http://server/application/login/", "username=user1&password=pass1");
 
                string answer = webClient.DownloadString("http://server/application/obj/");
                richTextBox1.AppendText(answer);
 
            }
 
           
        }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14168 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
08.11.2018, 17:25
wvl16865, в таких случаях следует сравнить запросы/ответы в браузере и программе. Например с помощью Fiddler.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
08.11.2018, 22:04
Цитата Сообщение от wvl16865 Посмотреть сообщение
Пробовал так сделать. Не проходит по второй ссылке.
Авторизация обычно делается через отправку формы, т.е. content type в post запросе должен быть установлен в соответствующее значение - "application/x-www-form-urlencoded"

Добавь строку перед первым запросом:
C#
1
webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
Возможно после первого запроса этот header нужно будет убрать.
C#
1
webClient.Headers.Remove(HttpRequestHeader.ContentType)
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
13.11.2018, 17:16  [ТС]
Пробовал сделать так не хочет
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void button3_Click(object sender, EventArgs e)
{
 
    using (var webClient = new CookieAwareWebClient())
    {
        //webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        webClient.UploadString("http://server/app/login/", "username=user1&password=pass1");
        //webClient.Headers.Remove(HttpRequestHeader.ContentType);
 
        string answer = webClient.DownloadString("http://server/app/obj/");
        richTextBox1.AppendText(answer);
 
    }
 
}
Класс Cookie

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class CookieAwareWebClient : WebClient
{
    public void Login(string loginPageAddress, NameValueCollection loginData)
    {
        CookieContainer container;
 
        var request = (HttpWebRequest)WebRequest.Create(loginPageAddress);
 
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
 
        var query = string.Join("&",
          loginData.Cast<string>().Select(key => $"{key}={loginData[key]}"));
 
        var buffer = Encoding.ASCII.GetBytes(query);
        request.ContentLength = buffer.Length;
        var requestStream = request.GetRequestStream();
        requestStream.Write(buffer, 0, buffer.Length);
        requestStream.Close();
 
        container = request.CookieContainer = new CookieContainer();
 
        var response = request.GetResponse();
        response.Close();
        CookieContainer = container;
    }
 
    public CookieAwareWebClient(CookieContainer container)
    {
        CookieContainer = container;
    }
 
    public CookieAwareWebClient()
      : this(new CookieContainer())
    { }
 
    public CookieContainer CookieContainer { get; private set; }
 
    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = (HttpWebRequest)base.GetWebRequest(address);
        request.CookieContainer = CookieContainer;
        return request;
    }
}
HTML страница авторизации
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<form role="form" method="POST">
    <div class="form-row">
        <input type="text" id="userLogin" required="required"
                            name="username" placeholder="Username" autofocus="autofocus">
    </div>
    <div class="form-row">
        <input type="password" id="userPassword" required="required" 
                            name="password" placeholder="Password">
    </div>
<div class="btns-row">
                <span class="forgot-pwd"><a href="/app/recoverPassword/">Forget password?</a></span>
                <button id="userSignIn" class="btn" type="submit">Enter</button>
            </div>
        </div>
        <input type="hidden" id="urlParams" name="params" />
    </form>
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14168 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
13.11.2018, 17:30
wvl16865, без сравнения запросов сделанного через браузер и запросов сделанных программой точного ответа дать не получится. Пока видно только что в запросе авторизации не хватает параметра urlParams.
C#
1
webClient.UploadString("http://server/app/login/", "username=user1&password=pass1&urlParams=params");
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
13.11.2018, 17:45  [ТС]
Примерно так из браузера

Request URL: http://server/app/login/doLogin
Request Method: POST
Status Code: 302 Found
Remote Address: 10.0.0.1:80
Referrer Policy: no-referrer-when-downgrade
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Connection: Keep-Alive
Content-Length: 0
Date: Tue, 13 Nov 2018 14:37:39 GMT
Expires: 0
Keep-Alive: timeout=5, max=96
Location: /app/
Pragma: no-cache
Server: Apache/2.4.18 (Ubuntu)
Set-Cookie: JSESSIONID=1111111111111111111111111111; Path=/app/; HttpOnly
X-Content-Type-Options: nosniff
X-UA-Compatible: IE=Edge
X-XSS-Protection: 1; mode=block
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
Content-Length: 35
Content-Type: application/x-www-form-urlencoded
Cookie: JSESSIONID=1111111111111111111111111111; sessionExpiresAt=111111111111; timezoneOffset=-180
Host: server
Origin: http://server
Referer: http://server/app/login/
Upgrade-Insecure-Requests: 1
username: user1
password: pass1
params:
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14168 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
13.11.2018, 18:10
wvl16865, в таком виде это трудно воспринимать. Если это было взято из Fiddler как я посоветовал, то лучше использовать команду Export Sessions. Тем не менее похоже запрос нужно отправлять на адрес http://server/app/login/doLogin
0
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
13.11.2018, 23:39
wvl16865, скорее всего клик по кнопке у вас не проходит . Вам не нужно делать webBrowser1.Navigate("http://server/application/obj/"); вручную после нажатия на кнопку, по идее сайт должен сам вас перебросить на нужную страницу после успешной авторизации. Да и используйте лучше xNet или стандартные библиотеки для работы с http

Добавлено через 1 минуту
wvl16865, если все же хотите использовать браузер, то не рекомендую стандартный. По моему есть движок от mozila в свободном доступе и вполне рабочий. Раньше еще awesomium был, но я недавно захотел использовать его и к моему сожалению он уже не функционировал. Возможно сейчас выкатали что-то на замену
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
14.11.2018, 09:20  [ТС]
через webBrowser1 как раз все работает, кнопка нажимается. Страницу для парсинга получаю. Хотел попробовать через webClient не получается.
0
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
14.11.2018, 11:49
wvl16865, используйте программы для проверки трафика
например httpAnalizer или Fiddler , в плане просмотра http запросов очень удобные софтины
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.11.2018, 12:23
Цитата Сообщение от wvl16865 Посмотреть сообщение
container = request.CookieContainer = new CookieContainer();
var response = request.GetResponse();
* * * * response.Close();
* * * * CookieContainer = container;
этот код используется ?
0
0 / 0 / 0
Регистрация: 07.11.2018
Сообщений: 14
14.11.2018, 15:54  [ТС]
Всем спасибо за помощь. Решил задачу.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void button3_Click(object sender, EventArgs e)
        {
 
 
             using (var webClient = new CookieAwareWebClient())
              {
                 var loginData = new NameValueCollection
                 {
                   { "username", "user1" },
                   { "password", "pass1" }
                   
                 };
                var loginAddress = "http://server/app/login/doLogin";               
 
                webClient.Login(loginAddress,loginData);
                string t= webClient.GetHomePage("http://server/app/obj/");
                
                richTextBox1.AppendText(t);
 
            }
Класс Cookie

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class CookieAwareWebClient : WebClient
{
    public void Login(string loginPageAddress, NameValueCollection loginData)
    {
        CookieContainer container;
 
        var request = (HttpWebRequest)WebRequest.Create(loginPageAddress);
 
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.Referer = loginPageAddress;
        
        var query = string.Join("&",
          loginData.Cast<string>().Select(key => $"{key}={loginData[key]}"));
 
        var buffer = Encoding.ASCII.GetBytes(query);
        request.ContentLength = buffer.Length;
        var requestStream = request.GetRequestStream();
        requestStream.Write(buffer, 0, buffer.Length);
        requestStream.Close();
 
        container = request.CookieContainer = new CookieContainer();
 
        var response = request.GetResponse();
        response.Close();
        CookieContainer = container;        
    }
 
    public CookieAwareWebClient(CookieContainer container)
    {
        CookieContainer = container;
    }
 
    public CookieAwareWebClient()
      : this(new CookieContainer())
    { }
 
    public CookieContainer CookieContainer { get; private set; }
 
    protected override WebRequest GetWebRequest(Uri address)    
    {
        var request = (HttpWebRequest)base.GetWebRequest(address);
        request.CookieContainer = CookieContainer;        
        return request;
    }
    public string GetHomePage(string url)
    {
        
        var webRequest = this.GetWebRequest(new Uri(url));
 
        string src = "";
        using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
        {
            src = new StreamReader(webResponse.GetResponseStream()).ReadToEnd();
            return src;
        }
    }
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14168 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
14.11.2018, 17:09
Цитата Сообщение от wvl16865 Посмотреть сообщение
Решил задачу
Молодец. Советую убрать метод Login из класса CookieAwareWebClient. Ему там не место.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2018, 17:09
Помогаю со студенческими работами здесь

авторизация через вк
доброе время суток. народ.подскажите. столкнулся с такой проблемой. поставил скрипт.на главной странице 2 кнопки. авторизация через...

Авторизация через бд
Здравствуйте. У меня есть авторизация через БД, рабочая, но из-за кода(скорее всего) у меня не корректно отображается форма DBGrid....

Авторизация через БД
Привет ВСЕМ!! Нужна помощь.. имеется БД user там 3 поля(id,login,password) необходимо сделать два файла один из них это форма на html с...

Авторизация через БД
Здравствуйте. Не могу найти информацию, как можно сделать авторизацию через БД Access. Хоть убейте, на делфи все так просто было через...

Авторизация через вк
Добрый день, Я совсем новичок, и хотелось бы помощи! Никак не получается установить этот Виджет для авторизации. Пытался...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru