使用 REST 请求从 Office365 的 Delve 配置文件中获取照片
Get photo from Delve profile of Office365 using REST request
我在从 Delve 帐户获取个人资料图片时遇到问题。这是 link 的示例,当我将它放入浏览器时 returns 我的照片:https://orgname.sharepoint.com/_vti_bin/DelveApi.ashx/people/profileimage?userId=alias@org.com&size=L
现在我需要从代码中获取这张照片。我尝试了这种方式,非常适合不在 Office365 中的外部图像:
var credentials = new NetworkCredential("myemail", "password");
using (var handler = new HttpClientHandler { Credentials = credentials })
using (var client = new HttpClient(handler))
{
var bytes = await client.GetByteArrayAsync(url);
return Convert.ToBase64String(bytes);
}
但作为回应,我得到 html 页面,其中包含如下文本:
<H1>We can't sign you in</H1><p>Your browser is currently set to block cookies. You need to allow cookies to use this service.</p><p>Cookies are small text files stored on your computer that tell us when you're signed in. To learn how to allow cookies, check the online help in your web browser.</p>
我认为它与 Office365 授权有关,但我不知道如何使用我的凭据对此 url 执行 REST 请求...
问题已解决,首先我们需要初始化 SharePoint 上下文:
public ClientContext SetupSpContext()
{
// This builds the connection to the SP Online Server
var clientContext = new ClientContext(_sharePointCrmDocumentsSiteName);
var secureString = new SecureString();
foreach (var c in _sharePointCrmDocumentsPwd.ToCharArray()) secureString.AppendChar(c);
{
clientContext.Credentials = new SharePointOnlineCredentials(_sharePointCrmDocumentsLoginName, secureString);
}
var web = clientContext.Web;
clientContext.Load(web);
clientContext.ExecuteQuery();
return clientContext;
}
然后我们可以使用用户电子邮件从 Shrepoint 获取个人资料图片:
public string DownloadProfilePictureAsBase64(string email)
{
try
{
var pictureUrl = GetPictureUrl(email);
var fileInfo = File.OpenBinaryDirect(_sharePointContext, pictureUrl);
using (var memory = new MemoryStream())
{
var buffer = new byte[1000000];
int nread;
while ((nread = fileInfo.Stream.Read(buffer, 0, buffer.Length)) > 0)
{
memory.Write(buffer, 0, nread);
}
memory.Seek(0, SeekOrigin.Begin);
var buffer2 = new byte[memory.Length];
memory.Read(buffer2, 0, buffer2.Length);
return Convert.ToBase64String(buffer2);
}
}
catch (Exception ex)
{
Console.WriteLine($"Picture for user {email} can not be downloaded");
Console.WriteLine(ex.Message);
}
return null;
}
private string GetPictureUrl(string email)
{
string targetUser = $"i:0#.f|membership|{email}";
var peopleManager = new PeopleManager(_sharePointContext);
var personProperties = peopleManager.GetPropertiesFor(targetUser);
_sharePointContext.Load(personProperties, p => p.PictureUrl);
_sharePointContext.ExecuteQuery();
var pictureUri = new Uri(personProperties.PictureUrl);
var localPath = pictureUri.LocalPath.Replace("MThumb", "LThumb"); //Change size of the picture
return localPath;
}
您应该使用 Microsoft Graph 来获取用户的图片。 https://graph.microsoft.com/v1.0/me/photo gets your metadata about the profile picture, and https://graph.microsoft.com/v1.0/me/photo/$value gets you the image. You need to use OAuth. See https://graph.microsoft.io/en-us/docs/api-reference/v1.0/api/profilephoto_get了解更多详情。
我在从 Delve 帐户获取个人资料图片时遇到问题。这是 link 的示例,当我将它放入浏览器时 returns 我的照片:https://orgname.sharepoint.com/_vti_bin/DelveApi.ashx/people/profileimage?userId=alias@org.com&size=L
现在我需要从代码中获取这张照片。我尝试了这种方式,非常适合不在 Office365 中的外部图像:
var credentials = new NetworkCredential("myemail", "password");
using (var handler = new HttpClientHandler { Credentials = credentials })
using (var client = new HttpClient(handler))
{
var bytes = await client.GetByteArrayAsync(url);
return Convert.ToBase64String(bytes);
}
但作为回应,我得到 html 页面,其中包含如下文本:
<H1>We can't sign you in</H1><p>Your browser is currently set to block cookies. You need to allow cookies to use this service.</p><p>Cookies are small text files stored on your computer that tell us when you're signed in. To learn how to allow cookies, check the online help in your web browser.</p>
我认为它与 Office365 授权有关,但我不知道如何使用我的凭据对此 url 执行 REST 请求...
问题已解决,首先我们需要初始化 SharePoint 上下文:
public ClientContext SetupSpContext()
{
// This builds the connection to the SP Online Server
var clientContext = new ClientContext(_sharePointCrmDocumentsSiteName);
var secureString = new SecureString();
foreach (var c in _sharePointCrmDocumentsPwd.ToCharArray()) secureString.AppendChar(c);
{
clientContext.Credentials = new SharePointOnlineCredentials(_sharePointCrmDocumentsLoginName, secureString);
}
var web = clientContext.Web;
clientContext.Load(web);
clientContext.ExecuteQuery();
return clientContext;
}
然后我们可以使用用户电子邮件从 Shrepoint 获取个人资料图片:
public string DownloadProfilePictureAsBase64(string email)
{
try
{
var pictureUrl = GetPictureUrl(email);
var fileInfo = File.OpenBinaryDirect(_sharePointContext, pictureUrl);
using (var memory = new MemoryStream())
{
var buffer = new byte[1000000];
int nread;
while ((nread = fileInfo.Stream.Read(buffer, 0, buffer.Length)) > 0)
{
memory.Write(buffer, 0, nread);
}
memory.Seek(0, SeekOrigin.Begin);
var buffer2 = new byte[memory.Length];
memory.Read(buffer2, 0, buffer2.Length);
return Convert.ToBase64String(buffer2);
}
}
catch (Exception ex)
{
Console.WriteLine($"Picture for user {email} can not be downloaded");
Console.WriteLine(ex.Message);
}
return null;
}
private string GetPictureUrl(string email)
{
string targetUser = $"i:0#.f|membership|{email}";
var peopleManager = new PeopleManager(_sharePointContext);
var personProperties = peopleManager.GetPropertiesFor(targetUser);
_sharePointContext.Load(personProperties, p => p.PictureUrl);
_sharePointContext.ExecuteQuery();
var pictureUri = new Uri(personProperties.PictureUrl);
var localPath = pictureUri.LocalPath.Replace("MThumb", "LThumb"); //Change size of the picture
return localPath;
}
您应该使用 Microsoft Graph 来获取用户的图片。 https://graph.microsoft.com/v1.0/me/photo gets your metadata about the profile picture, and https://graph.microsoft.com/v1.0/me/photo/$value gets you the image. You need to use OAuth. See https://graph.microsoft.io/en-us/docs/api-reference/v1.0/api/profilephoto_get了解更多详情。