Search code examples
restsharepointoffice365office365apidelve

Get photo from Delve profile of Office365 using REST request


I have a problem with getting profile image from Delve account. Here is the example of link which returns me photo when i put it into browser: https://orgname.sharepoint.com/_vti_bin/DelveApi.ashx/people/[email protected]&size=L

Now I need to get this photo from code. I tried such way, that works perfect for external images not in 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);
 }

But as responce I get html page with text like:

<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>

I think it is related with Office365 Authorization, but I don`t know how to perform REST request to this url with my credentials...


Solution

  • Problem Solved, first we need to initialize SharePoint Context:

    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;
        }
    

    Then we can Get profile picture from Shrepoint using User email:

    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;
        }