Статьи

LinkedIn из приложения для Windows Phone

До сих пор вы видели примеры для аутентификации и работы с Facebook , Twitter и Live Id , охватывающие OAuth 1 и 2. В этом посте вы увидите, как легко мы можем взять существующий код и заставить его работать против LinkedIn.

Мы начнем с кода, который вы видели в моем предыдущем посте в Twitter Authentication . Тем не менее, прежде чем приступить к написанию кода, вам, конечно же, нужно пройти регистрацию приложения в LinkedIn. Перейдите на страницу разработчика LinkedIn и войдите в систему, используя учетную запись, в которой вы хотите зарегистрировать приложение. В правом верхнем углу вы должны увидеть имя учетной записи со стрелкой вниз. Наведите указатель мыши на стрелку и выберите пункт меню «Ключи API». Это приведет вас к списку существующих приложений, который может быть изначально пустым. Нажмите на ссылку «Добавить новую заявку» и заполните форму заявки для новой заявки. Когда вы закончите, вы должны увидеть подтверждение того, что ваша учетная запись была успешно создана, как на рисунке 1, и, что более важно, API и секретные ключи, которые вам понадобятся для доступа к API-интерфейсам LinkedIn.

WP7 LinkedIn Рисунок 1

фигура 1

Если вы еще не прошли мой предыдущий пост по аутентификации в Twitter, сделайте это сейчас, так как вам понадобится этот код в будущем. Мы начнем с изменения констант URL, которые используются как часть процесса аутентификации, а также добавления в RedirectUrlReauthenticateUrl

 private const string RequestUrl = "https://api.linkedin.com/uas/oauth/requestToken";
private const string AuthorizeUrl ="https://www.linkedin.com/uas/oauth/authorize";
private const string AccessUrl = "https://api.linkedin.com/uas/oauth/accessToken"; 
private const string RedirectUrl = "https://www.linkedin.com/uas/oauth/authorize/submit";
private const string ReauthenticateUrl = "https://www.linkedin.com/uas/oauth/authorize/oob";

Вам также необходимо обновить константы ConsumerKeyConsumerSecret замещать и (включая угловые скобки) с вашими ключами.

 private const string ConsumerKey ="<LinkedIn API Key>";
private const string ConsumerSecret ="<LinkedIn Secret Key>";

После того как пользователь прошел проверку подлинности и авторизовал ваше приложение для доступа к своей учетной записи, веб-браузер будет перенаправлен обратно на URL-адрес, указанный в константе RedirectUrlReauthenticateUrl Страница, отображаемая LinkedIn, имеет немного другой макет, поэтому вам нужно настроить регулярное выражение, используемое для извлечения булавки. Весь метод BrowserNavigatedRedirectUrlReauthenticateUrl

 private void BrowserNavigated(object sender, NavigationEventArgs e) {
    if (AuthenticationBrowser.Visibility == Visibility.Collapsed) {
        AuthenticationBrowser.Visibility = Visibility.Visible;
    }
    if (e.Uri.AbsoluteUri.ToLower().StartsWith(RedirectUrl) ||
        e.Uri.AbsoluteUri.ToLower().StartsWith(ReauthenticateUrl))
        var htmlString = AuthenticationBrowser.SaveToString();
        var pinFinder = new Regex(@"<div class=""access-code"">(?<pin>[A-Za-z0-9_]+)</div>", RegexOptions.IgnoreCase);
        var match = pinFinder.Match(htmlString);
        if (match.Length > 0) {
            var group = match.Groups["pin"];
            if (group.Length > 0) {
                pin = group.Captures[0].Value;
                if (!string.IsNullOrEmpty(pin)) {
                    RetrieveAccessToken();
                }
            }
        }
        if (string.IsNullOrEmpty(pin)) {
            Dispatcher.BeginInvoke(() => MessageBox.Show("Authorization denied by user"));
        }
        // Make sure pin is reset to null
        pin = null;

        AuthenticationBrowser.Visibility = Visibility.Collapsed;
    }
}

Другое отличие от аутентификации в Twitter состоит в том, что в конце процесса LinkedIn не возвращает никакой информации об аутентифицированном пользователе. Вместо этого вам нужно запросить API профиля для доступа к этой информации. Следующий код иллюстрирует, как выполнить HTTP GET для URL профиля.

 private void RetrieveProfile() {
    var profileUrl = "http://api.linkedin.com/v1/people/~";
    var request = CreateRequest("GET", profileUrl);

    request.BeginGetResponse(result => {
                        try {
                            var req = result.AsyncState as HttpWebRequest;
                            if (req == null) throw new ArgumentNullException("result", "Request parameter is null");
                            using (var resp = req.EndGetResponse(result))
                            using (var strm = resp.GetResponseStream())
                            {
                                var xml = XElement.Load(strm);
                                var first_name = xml.Element("first-name").Value;
                                var last_name = xml.Element("last-name").Value;

                                Dispatcher.BeginInvoke(() => {
                                    UserNameText.Text = first_name + " " + last_name;
                                    MessageBox.Show("Profile retrieved");
                                });
                            }
                        }
                        Catch {
                            Dispatcher.BeginInvoke(() => MessageBox.Show("Unable to access profile"));
                        }
                    }, request);
}

Наконец, это покрытие не будет полным, если мы не проиллюстрируем, как опубликовать обновление статуса в LinkedIn (в LinkedIn это называется «поделиться»).

 private void TweetClick(object sender, RoutedEventArgs e) {
    var share = @"<?xml version=""1.0"" encoding=""UTF-8""?>" +
                             "<share>" + 
                                 "<comment>Comment to share with the world</comment>" + 
                                 "<visibility>" + 
                                     "<code>anyone</code>" + 
                                 "</visibility>" + 
                             "</share>";
    var postUrl ="http://api.linkedin.com/v1/people/~/shares";
    var request = CreateRequest("POST", postUrl);

    request.BeginGetRequestStream(reqresult => {
        var req = reqresult.AsyncState as HttpWebRequest;
        using (var strm = req.EndGetRequestStream(reqresult))
        using (var writer = new StreamWriter(strm)) {
            writer.Write(share);
        }
        req.BeginGetResponse(result => {
            try {
                var req2 = result.AsyncState as HttpWebRequest;
                if (req2 == null) throw new ArgumentNullException("result", "Request parameter is null");
                using (var resp = req.EndGetResponse(result)) {
                    Dispatcher.BeginInvoke(() => MessageBox.Show("Tweeted!"));
                }
            }
            catch {
                Dispatcher.BeginInvoke(() => MessageBox.Show("Unable to tweet"));
            }
        }, req);
    }, request);
}

Таким образом, у вас это есть — азы аутентификации, авторизации и публикации в LinkedIn из приложения Windows Phone.