Содержание
- Вопрос
- Информация о вопросе
- Предпосылки/Исследования
- Блок кода
ресурсыВопрос:
Как программировать/автоматически загружать изображение на Artstation\Project-страницу с помощью Powershell?
Нет человеческого ввода для выбора файлов во время загрузки. Только предопределенные медиа-данные. Если это можно сделать с помощью встроенной функциональности powershell, которая является предпочтительной.
(см. справочное изображение веб-страницы "Страница загрузки ArtStation" ниже)
Информация о вопросе:
Контекст среды:
- ОС: Windows 10, V: 1803, сборка: 17134,165
- Платформа: ПК
- Powershell: V: 5.1.17134.165 (настольная версия), сборка: 10.0.17134.165, (runas Admin, ExecutionPolicy RemoteSigned)
- InternetExplorer11: V: 11.165.17134.0, обновление V: 11.0.75 (KB4339093)
- Веб-сайт: https://www.artstation.com/myartstation/projects/new
Artstation имеет раздел "перетаскивания" с "кнопкой загрузки" в центре, которая открывает браузер файлов. (см. изображение Страница загрузки ArtStation).
Я вижу несколько вариантов.
- Имитация перетаскивания файла в область перетаскивания (кажется самым простым)
- Передайте в браузер файлов файл для загрузки без использования button.click()
Button.click() Откройте файловый браузер, используя отдельный процесс powershell, чтобы захватить файловый браузер, перейдите к файлу и выберите его для загрузки.- Вручную создайте/добавьте новый дочерний элемент "Art-Work" на страницу проекта
Предыстория - Исследования:
Привет, мой первый пост.
Я новый пользователь PowerShell и новый программист. Я пытался исправить приложение "Качество жизни", чтобы загрузить изображение в Artstation с помощью powershell.
Я пытался выяснить, как это сделать, около двух недель (80+ часов), просматривая сотни форумов и сайтов без какой-либо доходности. Может быть, я не знаю, что я ищу, или не использую запросы, которые приведут меня к ответу. Поэтому я подумал, что пришло время подвести черту и посмотреть, смогу ли я получить помощь. Пожалуйста, объясните мне, как будто я идиот, с самого начала.
Я пока не нашел ничего о том, как загрузить изображение с помощью powershell. Или, по крайней мере, я ничего не могу понять.
Пока все, на что я смотрел, возможно, сработает, требует, чтобы я знал, куда я отправляю файл. Invoke-WebRequest/Invoke-RestMethod, Copy-item -session, Drag-drop javaScript. Единственная проблема - я не знаю. И единственное, что у меня есть, это ComObject internetExplorer.application с переменными для объекта "зона перетаскивания" и объекта "кнопка загрузки файла". У них обоих есть методы и свойства, которые я не знаю, как установить или как/какая структура данных им нужна.
Прошлые запросы: (MFF, IE и Chrome;)
(Слово, которое я использовал во многих сессиях)
"powershell", v5, https, загрузка, изображение, файл, artstation, передача данных, onDropEvent, copy-item, html tag, html, javascript, функция перетаскивания и удаления, функция ввода, определение, ondrop, формат объекта, https передача файла, преобразование, изображение в кусочки, пакет, объект, $ ie.document.getelementId('image-input-upload'). value = ".\$ myImage", обнаружение, отлов, захват, отслеживание, поиск, новый, sub, process, файловый менеджер, браузер, навигация, выберите файл, назначить, CTS, загрузчик, dllhost, sendkeys, AssemblyName, System.Windows.Forms, microsoft.VisualBasic, multiPartContent, set-clipboard, get-clipboard, fileAsBinaryString
Блок кода:
Извините, если это некрасиво или не имеет смысла. Ответ прост: я не знаю, какого чёрта я делаю. Я просто собираю что-то, что, надеюсь, сработает.
#< START_GLOBAL-VARIABLES >#
#< Secure Document >#
#TODO: Clean up memory before setting to null
#If Either list exists on script run set to null
if($CredList.Keys){$CredList = $null}
if($keyWord.Count){$keyWord = $null}
$CredList = @{}
#TODO: remove debug elements
#Debug Variable 'easy select has key'
$keyWord = @()
#Pull and Parse Security Data from file
$CredBody = Get-Content $CertFile
$CredBody | ForEach-Object {
$s = $_ -split ", "
$keyWord += [REGEX]::Match($s[0], "(?<=www.).*?(?=.com)").groups[0].value
$CredList.add($s[0],($s[1],$s[2]))
}
#TODO: remove debug elements
#< Debug Option >#
#Split security file data and repack in hashtable
$keyWord = $keyWord.GetEnumerator() | Sort-Object
$httpHost = ($CredList.Keys -imatch $keyWord[0])
$ActiveKey = ($CredList[$CredList.Keys -imatch $keyWord[0]])
###< END_GLOBAL-VARIABLES >###
###< START_ARTSTATION >###
if($httpHost -imatch 'artstation')
{
#Todo: Move this to a global scope to reuse for other art sites.
#Or create once and use navigate? More/less secure?
#< Create IE window and poit at Artstation >#
$ie = New-Object -ComObject 'InternetExplorer.Application'
$ie.visible=$true
$ie.navigate($httpHost)
while($ie.ReadyState -ne 4) {start-sleep -m 100}
##< START_LOGIN >##
if($ie.Document.location.href -eq 'https://www.artstation.com/users/sign_in')
{
#Todo: Encrypt Data Source + pass information securly to webpage
#Pass data through windows security window?
#< Find Desired Cert Elements >#
$forms = $ie.Document.forms | ForEach-Object { $_ | ForEach-Object { if($_.id -imatch 'email'-or $_.id -imatch 'password'){return $_ } } }
# UserName
$UserForm = $forms | Where-Object {$_.id -imatch 'email'}
$UserForm[0].focus()
$ie.Document.activeElement.value = $ActiveKey[0][0]
# Password
$PassForm = $forms | Where-Object {$_.id -imatch 'password'}
$PassForm[0].focus()
$ie.Document.activeElement.value = $ActiveKey[0][1]
#Submit Form
$submitForm = $ie.Document.forms[1].elements | Where-Object { $_.name -imatch 'button'}
$submitForm.focus()
$submitForm.click()
while($ie.ReadyState -ne 4) {start-sleep -m 100}
}
##< END_LOGIN >##
#TODO: remove debug elements
#< Debug Option >#
#Navigate to an Existing or New project page
$result = UserPrompt $ie 'Is this a new project?' 'Project Setup' 'Question' {$ie.navigate("https://www.artstation.com/myartstation/projects/new")} {$ie.navigate("https://www.artstation.com/marketplace/manage/products/new")} {$null}
while($ie.ReadyState -ne 4) {start-sleep -m 100}
##< START_UPLOAD >##
#"Drag & Drop Rect"
#<div class="well drop-files text-center hidden-sm hidden-xs" id="dropzone"><label class="btn btn-default" for="upload-image-input"><i class="far fa-arrow-from-bottom fa-pad-right"></i>Upload your images</label><div class="separator-sm"></div><div class="text-muted">Upload or drag & drop images</div></div>
#Pictures:
#<input accept="image/jpeg,image/png,image/gif" id="upload-image-input" multiple="multiple" name="asset[image][]" type="file">
#Video:
#<a class="btn btn-default" id="project-add-video-btn" data-toggle="modal" data-target="#add-video-modal" href="#"><i class="far fa-film fa-pad-right"></i>Add Video</a>
#SketchFab
#<a class="btn btn-default" id="project-add-3dmodel-btn" data-toggle="modal" data-target="#add-3dmodel-modal" href="#"><i class="far fa-cube fa-pad-right"></i>Add Sketchfab</a>
#Marmoset
#<input multiple="multiple" name="asset[image][]" type="file">
#Pano
#<a class="btn btn-default" id="project-add-pano-btn" href="#"><i class="far icon-pano fa-pad-right"></i>Add 360 Pano</a>
#ProjectThumbnail
#<label class="upload-thumbnail-placeholder" for="upload-thumbnail"><i class="far fa-image fa-2x"></i><div class="small">Upload or drag & drop image</div></label>
##< START_POPULATE-FIELDS >##
#< Art-Image >#
#Image
#Upload
#Captions
#ImageFitting
#< Thumbnail-Image >#
#Image
#Upload
#< VARIABLES >#
$fielfToken = 'title','description', 'medium','Matter', 'adult','albmus','portfolio', 'software', 'Tags'
$Values = 'This is my title',
'This painting was done for my Twitch stream! come stop on by some time.',
'digital 3d'
#< TITLE >#
#Text Field [a-z,0-9]
$titleToken = $ie.Document.forms | ForEach-Object{ $_ | Where-Object {$_.id -imatch $fielfToken[0]} }
$titleToken[0].value = $Values[0]
#< DESCRIPTION >#
#Text Field [a-z,0-9]
$descriptionToken = $ie.Document.forms | ForEach-Object{ $_ | Where-Object {$_.id -imatch $fielfToken[1]} }
$descriptionToken.value = $Values[1]
#< MEDIUM >#
#dropdown[v]
#Pull dropdown choices
$mediumToken = $ie.Document.forms | ForEach-Object{ $_ | Where-Object {$_.id -imatch $fielfToken[2]} }
#Set medium dropdown to $mediumToken.tostring()
#< SUBJECT-MATTERr >#
#dropdown[v]
#Pull dropdown choices
#$subjectToken
#$subjectToken
#< ADULT-CONTENT >#
#checkbox[x]
$adultToken = $ie.Document.forms | ForEach-Object{ $_ | Where-Object {$_.id -imatch $fielfToken[4]} }
$adultToken.click()
#< SOFTWARE >#
#Dropdown[v]
#Pull software list
#$softwareToken
#$softwareToken
#< START_TAGS >#
#Option 1: Previous[] pr Previous[X]
#Option 2: 'tag1' 'tag2' 'tag3'. . .
#if Previous ticked checkbox[x]
#$foundToken[1].click()
#if extra Tags = @()
#$foundToken[0].length
#< END_TAGS >#
#< ALBUMS >#
#checkbox[x] list ( AlbumsA[], AlbumsB[], AlbumsC[] )
#Get list of available albums
$albumsToken = $ie.Document.forms | ForEach-Object{ $_ | Where-Object {$_.classname -imatch 'col-md-3'} }
$albumsToken.click()
#< START_PORTFOLIO >#
#ArtStation.com checkbox[x]
#$adultToken = $ie.Document.forms | ForEach-Object{ $_ | Where-Object {$_.id -imatch $fielfToken[4]} }
#$adulToken.click()
#MyWebsite checkbox[x]
#$adultToken = $ie.Document.forms | ForEach-Object{ $_ | Where-Object {$_.id -imatch $fielfToken[4]} }
#$adulToken.click()
#< END_PORTFOLIO >#
#< Review >#
#click ok when done reviewing
#Edit text
#Re-upload media
#< Publish >#
#Save.click()
#Publish.click()
##< END_POPULATE-FIELDS >##
#< Logout >#
#$signOut = $ie.Document.all | Where-Object {$_.classname -imatch 'far fa-sign-out fa-fw fa-pad-right-x2'}
#$signOut.focus()
#$signOut.click()
###< END_ARTSTATION >###
}
Ресурсы:
Ссылки:
* community.box.com/t5/Platform-and-Development-Forum/Upload-a-file-using-API-in-PowerShell/td-p/35660
* app.box.com/s/46hwgi48n31g42vuqjk67d01abceypij
* stackoverflow.com/info/23059945/upload-a-file-to-box-com-using-powershell
* get-powershellblog.blogspot.com/2017/09/multipartform-data-support-for-invoke.html
* blog.majcica.com/2016/01/13/powershell-tips-and-tricks-multipartform-data-requests/
* blog.majcica.com/2016/01/15/uploading-xl-deploy-dar-package-via-powershell/
* github.com/react-dropzone/react-dropzone