Экспорт фотографий профилей пользователей Yammer с помощью PowerShell
Yammer позволяет экспортировать пользователей в CSV файл, но при этом не включается их профильная фотография. Однако существует API Yammer, поэтому с помощью PowerShell и данных из CSV файла мы можем получить профильные фотографии.
Экспортировать CSV файл пользователей Yammer
Сначала нам нужен CSV-файл со всеми пользователями, для этого вам необходимо быть сетевым администратором на вашем сайте Yammer. Перейдите в Настройки > Сетевой администратор > Экспорт пользователей и экспортируйте всех пользователей.
Когда вы откроете CSV файл, вы увидите столбец с ссылкой на API Yammer для каждого пользователя. Когда вы откроете этот url в вашем браузере, вы получите XML файл с данными пользователей.
В этом XML-файле есть атрибут mugshot-url, который является фотографией профиля, которую мы хотим.
Подключиться к API Yammer
Прежде чем мы сможем взаимодействовать с API Yammer, нам сначала нужно зарегистрировать приложение, чтобы мы могли авторизовать запросы. Патрик Ламбер написал отличную статью об этом, вы можете найти ее здесь. Кратко сделайте следующее:
- Убедитесь, что вы вошли в систему как администратор в вашем Yammer
- Перейдите по следующему адресу: https://www.yammer.com/client_applications
- Зарегистрируйте ваше приложение, вы можете использовать лицо как адрес.
- После регистрации нажмите на Генерировать токен разработчика для этого приложения
Когда завершите, скопируйте сгенерированный (токен) хранителя куда-нибудь, он нам понадобится позднее.
Создание скрипта PowerShell
Итак, у нас есть CSV-файл со всеми пользователями, ссылка на их XML-файл и у нас есть токен для аутентификации. Пора начинать писать скрипты:
Шаг 1 - Импортируйте файл CSV и отфильтруйте пользователей.
Я добавил файл, чтобы вы могли выбрать всех пользователей или только активных.
#Set some variables
$csvFile = "C:\temp\yammer\Users.csv"
$exportFolder = "c:\temp\yammer\users\"
$allUsers = $false
#Import CSV
$csv = Import-Csv $csvFile -Delimiter ","
$state = if ($allUsers) { '*' } else { 'active' }
#Filter users
$users = $csv | Where-Object state -Like $stateШаг 2 — Создание заголовка REST API
Чтобы скачать XML файл, нам нужно пройти аутентификацию, мы можем сделать это с помощью токена доступа, который мы получили ранее в консоли разработчика Yammer.
#Connect to Yammer API
$baererToken = "455423-asdwewqADSLKSAHDL" #Fake token 😉
$headers = @{ Authorization=("Bearer " + $baererToken) }Шаг 3 - Получите XML файл
Для каждого пользователя нам нужно получить XML-файл. Команда invoke-webrequest возвращает строку, поэтому мы конвертируем её в XML, чтобы упростить работу.
$response = Invoke-WebRequest -Uri $user.api_url -Method Get -Headers $headers -ContentType "application/xml"
$xml = [xml]$responseШаг 4 - Скачайте фото профиля
Мы загружаем фотографию с помощью веб-запроса:
Invoke-WebRequest -Uri $xml.response.'mugshot-url' -OutFile $exportFolder\$xml.response.name -Method Get -Headers $headersШаг 5 - Собираем всё вместе
Кодовые фрагменты выше нужно собрать воедино. Вам нужно пройтись по CSV-файлу пользователей, создать выходное местоположение на основе их имени, возможно, запросить другой размер, нежели по умолчанию 48×48, и проверить, установлено ли у них фото.
Таким образом, когда мы объединяем все части вместе, мы получаем следующий сценарий:
$csvFile = "C:\temp\yammer\Users.csv"
$exportFolder = "c:\temp\yammer\users\"
$allUsers = $false
$csv = Import-Csv $csvFile -Delimiter ","
$state = if ($allUsers) { '*' } else { 'active' }
#filter users
$users = $csv | Where-Object state -Like $state
#connect to Yammer API
$baererToken = "455423-asdwewqADSLKSAHDL" #Fake token 😉
$headers = @{ Authorization=("Bearer " + $baererToken) }
foreach ($user in $users)
{
#set output filename
$output = $exportFolder + $user.name + '.png'
#get xml
$response = Invoke-WebRequest -Uri $user.api_url -Method Get -Headers $headers -ContentType "application/xml"
$xml = [xml]$response
#get profile address from xml file
$photoUrl = $xml.response.'mugshot-url'
$url = $photoUrl.replace('48x48','256x256')
#download photo
if ($photoUrl) {
#Check if it's a user picture or placeholder
if ($photoUrl -Match 'no_photo') {
#Do something else
}else{
Invoke-WebRequest -Uri $url -OutFile $output -Method Get -Headers $headers
}
}
}