有没有一种简单的方法来获取用户的 LinkedIn 个人资料照片?
理想情况下与 Facebook 类似 - http://graph.facebook.com/userid/picture
您可以通过此调用检索原始照片尺寸:
http://api.linkedin.com/v1/people/~/picture-urls::(原创)
请注意,这可以是任何尺寸,因此您需要自行缩放,但图像是用户上传的原始图像。
没那么容易...您需要通过OAuth,然后代表会员要求:
http://api.linkedin.com/v1/people/{user-id}/picture-url
如果您使用 2.0 版本的 API(所有开发人员都需要在 2019 年 3 月 1 日之前迁移),您应该使用投影来扩展 profilePicture.displayImage
。如果这样做,您将在
displayImage~
中拥有完整的 JSON 元素
profilePicture
(“~”不是拼写错误),其中包含您可能需要的所有信息。
https://api.linkedin.com/v2/me?projection=(id,profilePicture(displayImage~:playableStreams))
个人资料图片 API 文档中查看更多信息,以查看 JSON 响应或个人资料 API 文档。
用户身份验证后,向人员 URL 发出请求。
其中https://api.linkedin.com/v1/people/~:(id、电子邮件地址、名字、姓氏、格式化名称、图片网址)?format=json
~
代表当前经过身份验证的用户。响应将是这样的......
{
"id": "KPxRFxLxuX",
"emailAddress": "[email protected]",
"firstName": "John",
"lastName": "Doe",
"formattedName": "John Doe",
"pictureUrl": "https://media.licdn.com/mpr/mprx/0_0QblxThAqcTCt8rrncxxO5JAr...cjSsn6gRQ2b"
}
希望这有帮助!
https://api.linkedin.com/v1/people/~:(picture-URL) ?format=json,如之前所解释的,在请求标头中使用承载授权,解决了我的问题。
我的Startup.Auth.cs文件
var linkedInOptions = new LinkedInAuthenticationOptions()
{
ClientId = [ClientID],
ClientSecret = [ClientSecret],
Provider = new LinkedInAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
// This is the access token received by your application after user allows use LinkedIn credentials
context.Identity.AddClaim(new Claim(
"urn:linkedin:accesstoken", context.AccessToken));
context.Identity.AddClaim(new Claim(
"urn:linkedin:name", context.Name));
context.Identity.AddClaim(new Claim(
"urn:linkedin:username", context.UserName));
context.Identity.AddClaim(new Claim(
"urn:linkedin:email", context.Email));
context.Identity.AddClaim(new Claim(
"urn:linkedin:id", context.Id));
return Task.FromResult(0);
}
}
};
app.UseLinkedInAuthentication(linkedInOptions);
我在LinkedIn中获取用户个人资料图片的方法:
public string GetUserPhotoUrl(string accessToken)
{
string result = string.Empty;
var apiRequestUri = new Uri("https://api.linkedin.com/v1/people/~:(picture-url)?format=json");
using (var webClient = new WebClient())
{
webClient.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + accessToken);
var json = webClient.DownloadString(apiRequestUri);
dynamic x = JsonConvert.DeserializeObject(json);
string userPicture = x.pictureUrl;
result = userPicture;
}
return result;
}
最后是我使用上述方法的操作片段:
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
...
var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
string accessToken =
externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == "urn:linkedin:accesstoken").Value;
model.PhotoUrl = GetUserPhotoUrl(accessToken);
...
}
我希望它能有所帮助。 最好的问候
已解释 -
这是包含所有其他数据的缩略图-
https://api.linkedin.com/v1/people/~:(id,location,picture-urls::(original),specialties,public-profile-url,email-address,formatted-name)?format=json
这适用于包含所有其他数据的原始图像 -
https://api.linkedin.com/v1/people/~:(id,location,picture-url,specialties,public-profile-url,email-address,formatted-name)?format=json
只需使用
picture-urls::(original)
代替
picture-url
!目前正在
LinkedInApiClient client = factory.createLinkedInApiClient(accessToken);
com.google.code.linkedinapi.schema.Person person = client.getProfileForCurrentUser(EnumSet.of(
ProfileField.ID, ProfileField.FIRST_NAME, ProfileField.LAST_NAME, ProfileField.HEADLINE,
ProfileField.INDUSTRY, ProfileField.PICTURE_URL, ProfileField.DATE_OF_BIRTH,
ProfileField.LOCATION_NAME, ProfileField.MAIN_ADDRESS, ProfileField.LOCATION_COUNTRY));
String imgageUrl=person.getPictureUrl();
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 = 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
这可能不完全是您所要求的,但它对于个人调查很有用。
搜索-目标图像” 这将是 img 元素中 id 属性的结尾。 该 img 元素的 src 属性将是背景图像的 URL。
对我来说这很有效
image= auth.extra.raw_info.pictureUrls.values.last.first
与omniauth-linkedin gem
您只需执行以下定义的步骤即可获取用户个人资料图片。
链接网址
https://api.linkedin.com/v2/people/id=USER_ID?projection=(id,profilePicture(displayImage~digitalmediaAsset:playableStreams)) USER_ID
: yjuMzBoycX // 测试用户ID。调用此API来获取所提供的userId的头像,
您将得到如下响应,在响应中,ProfilePicute -> elements ->identifiers ->identifier 是您的用户个人资料图片的链接,只需单击该链接即可访问。
示例响应
。 // 测试用户个人资料图片。 您将在元素数组中得到四张不同分辨率的图片。
{
"profilePicture": {
"displayImage": "urn:li:digitalmediaAsset:C4D03AQEJkSP2gLg1aA",
"displayImage~": {
"paging": {
"count": 10,
"start": 0,
"links": []
},
"elements": [
{
"artifact": "urn:li:digitalmediaMediaArtifact:(urn:li:digitalmediaAsset:C4D03AQEJkSP2gLg1aA,urn:li:digitalmediaMediaArtifactClass:profile-displayphoto-shrink_100_100)",
"authorizationMethod": "PUBLIC",
"data": {
"com.linkedin.digitalmedia.mediaartifact.StillImage": {
"orientation": "TopLeft",
"storageAspectRatio": {
"widthAspect": 1.0,
"heightAspect": 1.0,
"formatted": "1.00:1.00"
},
"storageSize": {
"width": 100,
"height": 100
},
"rawMetadataTags": [],
"scale": "DOWN",
"mediaType": "image/jpeg",
"rawCodecSpec": {
"name": "jpeg",
"type": "image"
},
"displaySize": {
"width": 100.0,
"uom": "PX",
"height": 100.0
},
"displayAspectRatio": {
"widthAspect": 1.0,
"heightAspect": 1.0,
"formatted": "1.00:1.00"
}
}
},
"identifiers": [
{
"identifier": "https://media.licdn.com/dms/image/C4D03AQEJkSP2gLg1aA/profile-displayphoto-shrink_100_100/0/1661232745172?e=1712188800&v=beta&t=bEUF4w6ndy7kaRDbq1Lyx1bRuZNHDL1FD7H-D6PAafY",
"index": 0,
"mediaType": "image/jpeg",
"file": "urn:li:digitalmediaFile:(urn:li:digitalmediaAsset:C4D03AQEJkSP2gLg1aA,urn:li:digitalmediaArtifactClass:profile-displayphoto-shrink_100_100,0)",
"identifierType": "EXTERNAL_URL",
"identifierExpiresInSeconds": 1712188800
}
]
},
{
"artifact": "urn:li:digitalmediaMediaArtifact:(urn:li:digitalmediaAsset:C4D03AQEJkSP2gLg1aA,urn:li:digitalmediaMediaArtifactClass:profile-displayphoto-shrink_200_200)",
"authorizationMethod": "PUBLIC",
"data": {
"com.linkedin.digitalmedia.mediaartifact.StillImage": {
"orientation": "TopLeft",
"storageAspectRatio": {
"widthAspect": 1.0,
"heightAspect": 1.0,
"formatted": "1.00:1.00"
},
"storageSize": {
"width": 200,
"height": 200
},
"rawMetadataTags": [],
"scale": "DOWN",
"mediaType": "image/jpeg",
"rawCodecSpec": {
"name": "jpeg",
"type": "image"
},
"displaySize": {
"width": 200.0,
"uom": "PX",
"height": 200.0
},
"displayAspectRatio": {
"widthAspect": 1.0,
"heightAspect": 1.0,
"formatted": "1.00:1.00"
}
}
},
"identifiers": [
{
"identifier": "https://media.licdn.com/dms/image/C4D03AQEJkSP2gLg1aA/profile-displayphoto-shrink_200_200/0/1661232745172?e=1712188800&v=beta&t=nDPU4akewODGbgzUJxj4fupr7Xv66YbvLdIC89-WP4k",
"index": 0,
"mediaType": "image/jpeg",
"file": "urn:li:digitalmediaFile:(urn:li:digitalmediaAsset:C4D03AQEJkSP2gLg1aA,urn:li:digitalmediaArtifactClass:profile-displayphoto-shrink_200_200,0)",
"identifierType": "EXTERNAL_URL",
"identifierExpiresInSeconds": 1712188800
}
]
},
{
"artifact": "urn:li:digitalmediaMediaArtifact:(urn:li:digitalmediaAsset:C4D03AQEJkSP2gLg1aA,urn:li:digitalmediaMediaArtifactClass:profile-displayphoto-shrink_400_400)",
"authorizationMethod": "PUBLIC",
"data": {
"com.linkedin.digitalmedia.mediaartifact.StillImage": {
"orientation": "TopLeft",
"storageAspectRatio": {
"widthAspect": 1.0,
"heightAspect": 1.0,
"formatted": "1.00:1.00"
},
"storageSize": {
"width": 400,
"height": 400
},
"rawMetadataTags": [],
"scale": "DOWN",
"mediaType": "image/jpeg",
"rawCodecSpec": {
"name": "jpeg",
"type": "image"
},
"displaySize": {
"width": 400.0,
"uom": "PX",
"height": 400.0
},
"displayAspectRatio": {
"widthAspect": 1.0,
"heightAspect": 1.0,
"formatted": "1.00:1.00"
}
}
},
"identifiers": [
{
"identifier": "https://media.licdn.com/dms/image/C4D03AQEJkSP2gLg1aA/profile-displayphoto-shrink_400_400/0/1661232745172?e=1712188800&v=beta&t=VQDb7KtpR5gT69eTuA8n0xuE_WYOJD5kkPgmXA_a7dM",
"index": 0,
"mediaType": "image/jpeg",
"file": "urn:li:digitalmediaFile:(urn:li:digitalmediaAsset:C4D03AQEJkSP2gLg1aA,urn:li:digitalmediaArtifactClass:profile-displayphoto-shrink_400_400,0)",
"identifierType": "EXTERNAL_URL",
"identifierExpiresInSeconds": 1712188800
}
]
},
{
"artifact": "urn:li:digitalmediaMediaArtifact:(urn:li:digitalmediaAsset:C4D03AQEJkSP2gLg1aA,urn:li:digitalmediaMediaArtifactClass:profile-displayphoto-shrink_800_800)",
"authorizationMethod": "PUBLIC",
"data": {
"com.linkedin.digitalmedia.mediaartifact.StillImage": {
"orientation": "TopLeft",
"storageAspectRatio": {
"widthAspect": 1.0,
"heightAspect": 1.0,
"formatted": "1.00:1.00"
},
"storageSize": {
"width": 800,
"height": 800
},
"rawMetadataTags": [],
"scale": "UNCHANGED",
"mediaType": "image/jpeg",
"rawCodecSpec": {
"name": "jpeg",
"type": "image"
},
"displaySize": {
"width": 800.0,
"uom": "PX",
"height": 800.0
},
"displayAspectRatio": {
"widthAspect": 1.0,
"heightAspect": 1.0,
"formatted": "1.00:1.00"
}
}
},
"identifiers": [
{
"identifier": "https://media.licdn.com/dms/image/C4D03AQEJkSP2gLg1aA/profile-displayphoto-shrink_800_800/0/1661232745172?e=1712188800&v=beta&t=o1MXA1LurNoZwPsrZ_M5Uk65JvLjqo_Ta9LOPbj5dUo",
"index": 0,
"mediaType": "image/jpeg",
"file": "urn:li:digitalmediaFile:(urn:li:digitalmediaAsset:C4D03AQEJkSP2gLg1aA,urn:li:digitalmediaArtifactClass:profile-displayphoto-shrink_800_800,0)",
"identifierType": "EXTERNAL_URL",
"identifierExpiresInSeconds": 1712188800
}
]
}
]
}
},
"id": "yjuMzBoycX"