Поиск по сайту:

Экспорт фотографий профилей пользователей Yammer с помощью PowerShell


Yammer позволяет экспортировать пользователей в CSV файл, но при этом не включается их профильная фотография. Однако существует API Yammer, поэтому с помощью PowerShell и данных из CSV файла мы можем получить профильные фотографии.

Экспортировать CSV файл пользователей Yammer

Сначала нам нужен CSV-файл со всеми пользователями, для этого вам необходимо быть сетевым администратором на вашем сайте Yammer. Перейдите в Настройки > Сетевой администратор > Экспорт пользователей и экспортируйте всех пользователей.

Когда вы откроете CSV файл, вы увидите столбец с ссылкой на API Yammer для каждого пользователя. Когда вы откроете этот url в вашем браузере, вы получите XML файл с данными пользователей.

В этом XML-файле есть атрибут mugshot-url, который является фотографией профиля, которую мы хотим.

Подключиться к API Yammer

Прежде чем мы сможем взаимодействовать с API Yammer, нам сначала нужно зарегистрировать приложение, чтобы мы могли авторизовать запросы. Патрик Ламбер написал отличную статью об этом, вы можете найти ее здесь. Кратко сделайте следующее:

  1. Убедитесь, что вы вошли в систему как администратор в вашем Yammer
  2. Перейдите по следующему адресу: https://www.yammer.com/client_applications
  3. Зарегистрируйте ваше приложение, вы можете использовать лицо как адрес.
  4. После регистрации нажмите на Генерировать токен разработчика для этого приложения

Когда завершите, скопируйте сгенерированный (токен) хранителя куда-нибудь, он нам понадобится позднее.

Создание скрипта 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
		}
		
	}
}