Powershell上传图片到https://www.artstation.com/

Val*_*lin 20 powershell https upload automation image

内容

  • 问题信息
  • 背景研究
  • 代码块
  • 资源


题:

如何使用Powershell将图像编程/自动上传到Artstation\Project-page ?

上传期间没有人工输入选择文件.仅预定义的媒体数据.如果可以使用PowerShell的内置功能来完成它.

(请参阅下面的网页参考图片'ArtStation上传页')



问题信息:

环境背景:

  • 操作系统: Windows 10,V:1803,版本:17134.165
  • 平台: PC
  • Powershell: V:5.1.17134.165(桌面版),Build:10.0.17134.165,(runas Admin,ExecutionPolicy RemoteSigned)
  • InternetExplorer11: V:11.165.17134.0,UpdateV:11.0.75(KB4339093)
  • 网站: https ://www.artstation.com/myartstation/projects/new


Artstation有一个"拖放"部分,中间有一个"上传按钮",用于打开文件浏览器.(参见图片ArtStation上传页面).

我看到了一些选择.

  1. 模拟文件拖动到拖动区域(似乎最简单)
  2. 通过文件浏览器将文件上传而不使用button.click()
  3. Button.click()打开文件浏览器使用单独的PowerShell进程捕获文件浏览器并导航到并选择要上载的文件.
  4. 手动创建/添加一个新的子项'Art-Work'元素到项目页面


背景研究:

嘿,我的第一篇文章.

我是一个新的PowerShell用户和新程序员.我试图通过powershell将生活质量应用程序上传到Artstation.

我一直试图弄清楚如何做这个约两周现在(80多个小时)看着数百个没有收益的论坛和网站.也许我不知道我在寻找或不使用的采石场会让我接近答案.所以我认为是时候投了一条线,看看能否得到一些帮助.请向我解释,就像我是一个白痴,从方方面面.

我还没有找到任何关于如何通过powershell上传图像的内容.或者至少我无法理解.


到目前为止,我所看到的一切,我认为可能有用,需要我知道我在哪里发送文件.Invoke-WebRequest/Invoke-RestMethod,Copy-item -session,拖放 javaScript.唯一的问题是我不知道.我唯一拥有的是一个internetExplorer.application ComObject,其中包含"拖放区域"对象和"文件上传按钮"对象的变量.它们都有方法和属性,我不确定如何设置或如何/他们需要什么数据结构.


过去的查询:( MFF,IE和Chrome;)

(Word我用过很多次)
"powershell",v5,https,upload,image,file,artstation,datatransfer,onDropEvent,copy-item,html标签,html,javascript,拖放功能,输入功能,定义,ondrop ,对象格式,https文件传输,转换,图像到咬,包,对象,$ ie.document.getelementId('image-input-upload').value =".\ $ myImage",检测,捕获,捕获,跟踪,查找,新,子,进程,文件浏览器,浏览器,导航,选择文件,分配,CTS,上传者,DLL主机,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 &amp; 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 &amp; 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 >###
}
Run Code Online (Sandbox Code Playgroud)


资源:

链接:
*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/questions/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

小智 1

我知道您很久以前就提出了这个问题,但这里有一种可能的方法,您可能可以以某种方式利用。

function Click-DragControl
{
Param(
    [Parameter(Position=0,Mandatory=$TRUE)]
    [UIAutomation.UiElement]
    $ObjectDragFrom,

    [Parameter(Position=1,Mandatory=$TRUE)]
    [UIAutomation.UiElement]
    $ObjectDragTo
    )

$newX=[Int]($ObjectDragFrom.Current.BoundingRectangle.X+($ObjectDragFrom.Current.BoundingRectangle.Width/2))
$newY=[Int]($ObjectDragFrom.Current.BoundingRectangle.Y+($ObjectDragFrom.Current.BoundingRectangle.Height/2))

# In the event the object is inside a collapsible window, or is otherwise off-screen, the pixels we get back will be <0,0>.
# So we'll revert to our older method of clicking, because it can crawl through the control and still obtain the item.
if ($newX -eq 0 -and $newY -eq 0)
{
    $ObjectDragFrom.Mouse.LeftButtonClick()
    return $true
}

[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($newX,$newY)
$signature=
@'
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@
$SendMouseClick = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru
Try
{
    $SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0); # Left Mouse Down
}
Catch
{
    Write-Host("ERROR: Caught an Unhandled Exception in Click-Control. Originating Error:`n$Global:Error[0]")
    return $FALSE
}   

$newX=[Int]($ObjectDragTo.Current.BoundingRectangle.X+($ObjectDragTo.Current.BoundingRectangle.Width/2))
$newY=[Int]($ObjectDragTo.Current.BoundingRectangle.Y+($ObjectDragTo.Current.BoundingRectangle.Height/2))

# In the event the object is inside a collapsable window, or is otherwise off-screen, the pixels we get back will be <0,0>.
# So we'll revert to our older method of clicking, because it can crawl through the control and still obtain the item.
if($newX -eq 0 -and $newY -eq 0){
    $ObjectDragTo.Mouse.LeftButtonClick()
    return $TRUE
}

[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($newX,$newY)
$signature=
@'
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@
$SendMouseClick = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru
Try
{
    $SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0); # Left Mouse Up
    return $TRUE
}
Catch
{
    Write-Host("ERROR: Caught an Unhandled Exception in Click-DragControl. Originating Error:`n$Global:Error[0]")
    return $FALSE
}
Run Code Online (Sandbox Code Playgroud)

}