A
A
andresivanov2016-11-01 15:29:06
PowerShell
andresivanov, 2016-11-01 15:29:06

How to modify a PowerShell script?

There is a script that downloads photos from VK.
Everything is fine, except that you need to change the saving of files with the original names.
For example, now -60545552_453635558.jpg, but you need 3T2Vt9XA2t4.jpg
What and how to change?

#скрипт скачивает фотографии из вконтакте
#автор: elims.org.ua
<# #>

$photo_path = "D:\vk-photos\" #папка для сохранения изображений
$id = -22786271 #HD Обои

#альбомы которые нужно исключить:
$need_albums_id = 147102139,134040033,147102144,132334095

$global:photos_array = $null #обнулили масив всех фотографий сохраненного альбома 
$global:album_photos_count = $null #обнуление переменной с количествов фотографий в альбоме
$sleep_time = 1 #время задержки между запросами
[void][reflection.assembly]::loadwithpartialname("system.drawing") #для доступа как метаданным в файлах изображений
function get_photo_list { #функция получения списка фотографий
 $j = 0 
 do { #выбираем по 1000 фотографий пока не дойдем до конца альбома 
  Start-Sleep -s $sleep_time 
  $uri = $uri_part1 + $j + "&extended=1&v=5.24" 
  $request = $null
  do { #пытаемся получить ответ от сервера пока это не получится
   "Ссылка запроса: " + $uri
   $request = Invoke-WebRequest -Uri $uri
   Start-Sleep -s 1 #задержка в одну секунду
  } while ($request -eq $null) #пока не получим нормальный ответ
  $response_array = $request.content | ConvertFrom-Json #Конвертируем полученные данные из формата JSON в массив 
  $global:album_photos_count = $response_array.response.count #переопределяем количество фотографий в альбоме исходя из данных последнего запроса
  $global:photos_array = $photos_array + $response_array.response.items #сохраняем в масив список фотографий 
  "Сохраненны данные " + $photos_array.count + " фотографий" 
  $j = $j + 1000 
 } while ($j -le $global:album_photos_count) #выбираем по 1000 фотографий пока не дойдем до конца альбома 
}
function save_photos { #функция сохранения фотографии
 "начинаем сохранять фотографии, если есть задержка значит найдены уже скачанные фотографии и происходит их пропуск"
 $file_of_downloaded_files = $path + "\downloaded_files.txt" #имя файла со списком скачанных файлов
 if (Test-Path $file_of_downloaded_files) { #если список скачанных файлов существует
  $array_of_downloaded_files = Get-Content $file_of_downloaded_files #считываем его в массив
 }
 else { #если списка скачанных файлов не существует
  $array_of_downloaded_files = @() #создаем пустой массив
 }
 foreach ($photo_id in $photos_array.id) { 
  if ($photos_array.photo_2560[$i_photo] -ne $null) { $photo = $photos_array.photo_2560[$i_photo] } #пытаемся скачать фотографию в качестве 2560
  elseif ($photos_array.photo_1280[$i_photo] -ne $null) { $photo = $photos_array.photo_1280[$i_photo] } #если нет качества 2560 пытаемся скачать в 1280
  elseif ($photos_array.photo_807[$i_photo] -ne $null) { $photo = $photos_array.photo_807[$i_photo] } #если нет качества 1280 качаем в 807
  elseif ($photos_array.photo_604[$i_photo] -ne $null) { $photo = $photos_array.photo_604[$i_photo] } #если нет качества 807 качаем в 604
  else { $photo = $null } #если нет необходимого качества, то ничего не качаем
  $likes = $photos_array.likes[$i_photo].count #количество лайков к фотографии
  $likes_sum = $likes_sum + $likes #сумма лайков к фотографиям в альбоме
  $album_and_photo_id = [string]$photos_array.owner_id[$i_photo] + "_" + [string]$photos_array.id[$i_photo] 
  $filename = $path + $album_and_photo_id + ".jpg" #формируем имя файла без лайков в метаданных
  $filename2 = $filename.substring(0,$filename.length - 5) + "_with_likes.jpg" #формируем временное имя файла с лайками в метаданных
  if ( $photo -ne $null ) { #если ссылка на фотографию не пуста 
   "Альбом " + $i + " из " + $album_count + " : " + $album_title + " Фото " + $i_photo + " из " + $global:album_photos_count + ": " + $photo + " idPhoto: " + $photos_array.id[$i_photo] + " likes: " + $likes 
   if ((-not(Test-Path $filename))-and(-not($array_of_downloaded_files -contains $album_and_photo_id))) { #если такого файла не существует и он ранее не скачивался 
    Invoke-WebRequest $photo -OutFile $filename #скачиваем и сохраняем изображение
   } 
   #прописывание количества лайков в метаданные изображения, в поле "название"
   if (Test-Path $filename) { #если такой файл существует
    if (-not($array_of_downloaded_files -contains $album_and_photo_id)) { #если ранее этот файл не скачивался
     $array_of_downloaded_files = $array_of_downloaded_files + $album_and_photo_id 
    } 
    $img = [System.Drawing.Image]::Fromfile($filename) 
    $item = $img.psbase.GetPropertyItem(20624) #взяли в качестве примера не пустое поле с метаданными
    $item.id = 270 #поле "название"
    $item.type = 2 
    $likes_string = [int[]][char[]][string]("likes: " + $likes)
    $likes_string = $likes_string + 0
    $item.len = $likes_string.count 
    $item.Value = $likes_string #поле с количеством лайков
    $img.SetPropertyItem($item) #сохраняем информацию о лайках
    $filename2 = $filename.substring(0,$filename.length - 5) + "_with_likes.jpg" 
    $img.Save($filename2) #сохраняем файл с временным именем с информацией о лайках
    $img.dispose() #закрываем файл без информации о лайках
    Remove-Item $filename #удаляем файл без информации о лайках
    Rename-Item $filename2 $filename #переименовываем временное имя файла с метаданными в исходное имя
   } 
  }
  $i_photo++
 } 
 $likes_average = $likes_sum/$i_photo #подсчитываем в альбоме среднее количество лайков на фотографию
 $likes_text = "Суммарное количество лайков: " + $likes_sum + " количество фотографий: " + $i_photo + " средняя оценка фотографии: " + $likes_average + " лайков" 
 $export_file = $path + "\likescount.txt"
 $likes_text | Out-File $export_file -Encoding UTF8 #сохраняем в файл информацию о среднем количестве лайков на фотографию
 $array_of_downloaded_files | Out-File $file_of_downloaded_files -Encoding UTF8 #сохраняем в файл информацию о скачанных фотографиях
 $i_photo = 0 #обнулили порядковый номер фотографии в альбоме
 $likes_sum = $null #обнулили сумарное количество лайков 
}

#Получаем имя страницы\группы
if ($id -gt 0) { $uri = "https://api.vk.com/method/users.get?user_ids="+$id }
else {
 $group_id = $id * -1
 $uri = "https://api.vk.com/method/groups.getById?group_ids="+$group_id 
}
$request = Invoke-WebRequest -Uri $uri
$response_array = $request.content | ConvertFrom-Json #Конвертируем полученные данные из формата JSON в массив 
$id_name = $response_array.response.name + $response_array.response.first_name + $response_array.response.last_name
$id_name = $id_name -replace '(\\)|(\/)|(\*)|:|(\?)|"|<|>|(\|)|(\[)|(\])|(\n)', "_" #убираем некорректные знаки для имени файла
$id_name #имя страницы

$uri = "https://api.vk.com/method/photos.getAlbums?owner_id="+$id
$request = Invoke-WebRequest -Uri $uri
$response_array = $request.content | ConvertFrom-Json #Конвертируем полученные данные из формата JSON в массив 
$album_count = $response_array.response.aid.count #количество альбомов
$i = 0 #счетчик альбомов

foreach ($album in $response_array.response.aid) { #обходим каждый альбом 
 $i_photo = 0
 $global:album_photos_count = $response_array.response.size[$i] #количество фотографий в альбоме
 $album_title = $response_array.response.title[$i] #название альбома
 "Обрабатываем альбом: " + $album + " " + $album_title + " который состоит из " + $global:album_photos_count + " фотографий" 
 if ($need_albums_id -contains $album) { "Этот альбом пропускаем: " + $album } #перечисленные альбомы исключаются
 #if (-not($need_albums_id -contains $album)) { "Этот альбом пропускаем: " + $album } #перечисленные альбомы включаются, все другие исключаются
 else { 
  #создаем папку альбома 
  $album_title = $album_title -replace '(\\)|(\/)|(\*)|:|(\?)|"|<|>|(\|)|(\[)|(\])|(\n)', "_" #убираем некорректные знаки для имени файла
  $path = $photo_path + $id + "_" + $id_name + "\" + $album_title+"-album" + $album + "\" #имя папки
  if (-not(Test-Path $path)) { #если папка не существует 
   $result = New-Item -ItemType directory -Path $path #создаем папку
  } 
  $uri_part1 = "https://api.vk.com/method/photos.get?owner_id="+$id+"&album_id="+$album+"&count=1000&offset=" 
  get_photo_list #функция получения списка фотографий 
  save_photos #функция сохранения фотографий 
  $global:photos_array = $null #обнулили масив всех фотографий сохраненного альбома 
  $global:album_photos_count = $null #обнулили количество фотографий в альбоме
 } 
 $i++
}

#качаем фотографии из альбома типа "Фотографии на стене сообщества"
$path = $photo_path + $id + "_" + $id_name + "\photos_from_wall\" #имя папки
if (-not(Test-Path $path)) { #если папка не существует 
 $result = New-Item -ItemType directory -Path $path #создаем папку
} 
$album_title = "photos_from_wall"
$uri_part1 = "https://api.vk.com/method/photos.get?owner_id="+$id+"&album_id=wall&count=1000&offset=" 
get_photo_list #функция получения списка фотографий 
save_photos #функция сохранения фотографий

Answer the question

In order to leave comments, you need to log in

2 answer(s)
M
MrDywar Pichugin, 2016-11-01
@Dywar

$album_and_photo_id = [string]$photos_array.owner_id[$i_photo] + "_" + [string]$photos_array.id[$i_photo] 
  $filename = $path + $album_and_photo_id + ".jpg" #формируем имя файла без лайков в метаданных

Try to view all properties of $photos_array in debug mode by running the script in PowerShell ISE and setting a breakpoint.
https://blogs.technet.microsoft.com/powershell_en/...

A
andresivanov, 2016-11-01
@andresivanov

You can generally remove the like counting system from the script.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question