Indermove
@Indermove
C#/.NET back-end разработчик

Как сделать так чтобы код выполнялся после того как загрузится страница в элементе webBrowser C#?

Добрый вечер, всем, товарищи, такой вопрос возник, необходимо получить access_token для аутентификации приложения вконтакте. Я отправляю определенный запрос на права доступа, пользователь подтверждает его, после чего происходит редирект на страницу в адресной строке, которой располагается access_token. Нижеприведенный код сейчас срабатывает до того как происходит редирект и поэтому получает не ту строку, которую нужно, соответственно не получает access_token. Как быть в этой ситуации?

public string reqToken(string Scope, WebBrowser webBrowserAuth)
        {
            using (var req = new HttpRequest())
            {
                req.UserAgent = Http.ChromeUserAgent();
                CookieDictionary cookies = new CookieDictionary(false);
                req.Cookies = cookies;

                String Data = req.Get(String.Format("https://oauth.vk.com/authorize?client_id={0}&scope={1}&display=page&response_type=token&redirect_uri=https://oauth.vk.com/blank.html", appID, Scope)).ToString();
                
                // Вот это действие нужно выполнить только после редиректа
                Uri u = new Uri(req.Response.Address.ToString());
                webBrowserAuth.Url = u;
 
                char[] simbol = { '=', '&' };
                string[] str = webBrowserAuth.Url.ToString().Split(simbol);

                string token = str[1];

                return token;
            }
        }
  • Вопрос задан
  • 741 просмотр
Решения вопроса 2
littleguga
@littleguga
Не стыдно не знать, а стыдно не интересоваться.
Добавьте событие webBrowser_DocumentCompleted и в нем уже получайте access_token
Например, так:
string vkUrl = webBrowser1.Url.AbsoluteUri;
			if (vkUrl.Contains("access_token"))
			{
				var match = Regex.Match(vkUrl, @"=(.*?)&");
				vkAT = match.Groups[1].ToString();
				match = Regex.Match(vkUrl, @"&user_id=(.*)");
				vkUserId = match.Groups[1].ToString();
				string[] dataNames = {"UID", "AT"};
				string[] data = {vkUserId, vkAT};
			}


upd:
Подробная статья про Async/await, so 1(хотя тут тоже предлагают через Event), so 2
Ответ написан
@VanKrock
Вам не обязательно дожидаться полной загрузки страницы, на ней ничего интересного нет, я делал так
webBrowserAuth.Navigated += (sender, e) =>
                {
                    if(e.Url.GetLeftPart(UriPartial.Query) == "https://oauth.vk.com/blank.html")
                    {
                        var url = new Uri(e.Url.AbsoluteUri.Replace('#', '?'));
                        var parameters = HttpUtility.ParseQueryString(url.Query);
                        var accessToken = parameters.Get("access_token");
                        var expiresIn = parameters.Get("expires_in");
                        var userId = parameters.Get("user_id");
                    }
                };


Полностью код всплывающей формы c WebBrowser для аутентификации VK
public Vk Authorize()
        {
            var form = new Form { Width = 800, Height = 600 };
            var vk = new Vk();
            var thread = new Thread(() =>
            {
                var browser = new WebBrowser { Parent = form, Dock = DockStyle.Fill };

                var authLink =
                    $"https://oauth.vk.com/authorize?client_id={_appId}&display=popup&redirect_uri=https://oauth.vk.com/blank.html&scope={_scopes}&response_type=token&v=5.37";
                browser.Navigate(authLink);

                browser.Navigated += (sender, e) =>
                {
                    if (e.Url.GetLeftPart(UriPartial.Query) == "https://oauth.vk.com/blank.html")
                    {
                        var url = new Uri(e.Url.AbsoluteUri.Replace('#', '?'));
                        var parameters = HttpUtility.ParseQueryString(url.Query);
                        var accessToken = parameters.Get("access_token");
                        var expiresIn = parameters.Get("expires_in");
                        var userId = parameters.Get("user_id");
                        vk = new Vk(accessToken, expiresIn, userId);
                        form.Close();
                    }
                };
                form.ShowDialog();
            });
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
            return vk;
        }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы