Как получить изображение профиля LinkedIn с помощью OAuth?

Благодаря OAuth пользователи могут входить в мое приложение Rails, используя свою учетную запись LinkedIn. Однако у меня возникают проблемы с отображением изображения профиля пользователя. Следующий URL-адрес не загружает изображение:

<%= image_tag("http://api.linkedin.com/v1/people/{user-id}/picture-url") %>

Как я могу получить изображение профиля пользователя LinkedIn для отображения в моем приложении Rails?

Спасибо!


person winston    schedule 21.03.2014    source источник


Ответы (2)


Попробуйте получить исходное изображение с помощью:

http://api.linkedin.com/v1/people/{user-id}/picture-urls::(original)

Обновление:

Из текущей документации (рекомендую прочитать):

Используя текущего пользователя (после того, как пользователь вошел в систему):

http://api.linkedin.com/v1/people/~:(picture-url)

Использование member_id:

http://api.linkedin.com/v1/people/id=12345:(picture-url)

Общедоступный профиль:

http://api.linkedin.com/v1/people/url=<public-profile-url>:(picture-url)

Эти URL-адреса возвращают xml, поэтому вы можете проанализировать ответ xml, чтобы получить строку picture-url и использовать ее в качестве параметра для image_tag. Кроме того, вы можете получить информацию как json, передав дополнительный параметр, например:

http://api.linkedin.com/v1/people/~:(picture-url)?format=json

В обоих случаях (xml или json) вам нужно извлечь picture-url из ответа API для передачи его в image_tag.

Этот драгоценный камень omniauth-linkedin-oauth2 может вам помочь.

person markets    schedule 21.03.2014
comment
Я обновил ответ со ссылкой на текущую документацию. Это сработало? - person markets; 22.03.2014
comment
Спасибо за обновления. Как сослаться на токен члена пользователя? uid не похоже - person winston; 22.03.2014
comment
Только что попробовал: <%= image_tag("http://api.linkedin.com/v1/people/id={user-id}:(picture-url)") %> но все равно не повезло - person winston; 22.03.2014
comment
Спасибо за всю дополнительную информацию! Итак, я должен проанализировать URL-адрес в модели или контроллере, а затем сделать его переменной экземпляра для передачи в представление? Я не уверен, что процесс должен анализировать, а затем передавать его по ссылке в представлении. - person winston; 22.03.2014
comment
Да, это варианты. Например, используйте @response = JSON.parse(open(url_with_json_format).read), и вы получите хэш в @response. Затем вы можете получить доступ к таким атрибутам, как @response['person']['profile_url']. - person markets; 22.03.2014
comment
Так близко! Я установил @response = JSON.parse(open('http://api.linkedin.com/v1/people/~:(picture-url)?format=json').read) в свой контроллер, но теперь получаю 401 Несанкционированная ошибка OpenURI::HTTPError in UsersController#show. Я не понимаю, почему это несанкционированно, поскольку это происходит после входа пользователя в систему. Есть идеи? - person winston; 22.03.2014
comment
Даже после использования общедоступного URL-адреса профиля http://api.linkedin.com/v1/people/url={public-profile-url}:(picture-url)?format=JSON я все равно получаю ошибку 401. - person winston; 22.03.2014
comment
Если вы используете драгоценный камень, лучше изменить подход: в обратном вызове oauth сохраните некоторые (соответствующие) атрибуты из хеш-ответа в таблице пользователей. Один из них, столбец picture_url, тогда вы сможете использовать его как: @user.picture_url. - person markets; 22.03.2014
comment
Я думаю, что это тоже путь. Спасибо за помощь!! - person winston; 22.03.2014
comment
Нет проблем @james. Удачи! - person markets; 22.03.2014

Это мое решение работает отлично:

def callback(self):
    self.validate_oauth2callback()
    oauth_session = self.service.get_auth_session(
        data={'code': request.args['code'],
              'grant_type': 'authorization_code',
              'redirect_uri': self.get_callback_url()},
        decoder=jsondecoder
    )
    me = oauth_session.get('people/~:(id,first-name,last-name,public-profile-url,email-address,picture-url,picture-urls::(original))?format=json&oauth2_access_token='+str(oauth_session.access_token), data={'x-li-format': 'json'}, bearer_auth=False).json()
    social_id = 'linkedin$' + me['id']
    name = me['firstName']
    surname = me['lastName']
    email = me['emailAddress']
    url = me['publicProfileUrl']
    image_small = me.get('pictureUrl', None)
    image_large = me.get('pictureUrls', {}).get('values', [])[0]
    return social_id, name, surname, email, url, image_small, image_large, me
person piezzoritro    schedule 05.02.2017