param( [System.IO.FileInfo]$file = $null, [string]$twitteruser = $null, [string]$twitterpass = $null, [string]$message = $null ); $CODEPAGE = "iso-8859-1"; $TWITPIC_API_UPLOAD = "http://twitpic.com/api/upload"; $TWITPIC_API_UPLOADANDPOST = "http://twitpic.com/api/uploadAndPost"; #-------------------------------------------------------------------------------------------- # function Get-EncodedDataFromFile #-------------------------------------------------------------------------------------------- function Get-EncodedDataFromFile() { param( [System.IO.FileInfo]$file = $null, [string]$codePageName = $CODEPAGE ); $data = $null; if ( $file -and [System.IO.File]::Exists($file.FullName) ) { $bytes = [System.IO.File]::ReadAllBytes($file.FullName); if ( $bytes ) { $enc = [System.Text.Encoding]::GetEncoding($codePageName); $data = $enc.GetString($bytes); } } else { Write-Host "ERROR; File '$file' does not exist"; } $data; } #-------------------------------------------------------------------------------------------- # function Get-ImageContentType #-------------------------------------------------------------------------------------------- function Get-ImageContentType() { param([System.IO.FileInfo]$file = $null); $contentType = $null; $contentTypeMap = @{ ".jpg" = "image/jpeg"; ".jpeg" = "image/jpeg"; ".gif" = "image/gif"; ".png" = "image/png"; ".tiff" = "image/tiff"; } if ( $file ) { $contentType = $contentTypeMap[$file.Extension.ToLower()]; } $contentType; } #---------------------------------------------------------------------------- # function Execute-HTTPPostCommand #---------------------------------------------------------------------------- function Execute-HTTPPostCommand() { param( [string] $url = $null, [string] $data = $null, [System.Net.NetworkCredential]$credentials = $null, [string] $contentType = "application/x-www-form-urlencoded", [string] $codePageName = "UTF-8", [string] $userAgent = $null ); if ( $url -and $data ) { [System.Net.WebRequest]$webRequest = [System.Net.WebRequest]::Create($url); $webRequest.ServicePoint.Expect100Continue = $false; if ( $credentials ) { $webRequest.Credentials = $credentials; $webRequest.PreAuthenticate = $true; } $webRequest.ContentType = $contentType; $webRequest.Method = "POST"; if ( $userAgent ) { $webRequest.UserAgent = $userAgent; } $enc = [System.Text.Encoding]::GetEncoding($codePageName); [byte[]]$bytes = $enc.GetBytes($data); $webRequest.ContentLength = $bytes.Length; [System.IO.Stream]$reqStream = $webRequest.GetRequestStream(); $reqStream.Write($bytes, 0, $bytes.Length); $reqStream.Flush(); $resp = $webRequest.GetResponse(); $rs = $resp.GetResponseStream(); [System.IO.StreamReader]$sr = New-Object System.IO.StreamReader -argumentList $rs; $sr.ReadToEnd(); } } #-------------------------------------------------------------------------------------------- # function Post-TwitPic #-------------------------------------------------------------------------------------------- function Post-TwitPic() { param ( [System.IO.FileInfo]$file = $null, [string]$twitteruser = $null, [string]$twitterpass = $null, [string]$message = $null ); if ( $file -and $twitteruser -and $twitterpass ) { $boundary = [System.Guid]::NewGuid().ToString(); $header = "--{0}" -f $boundary; $footer = "--{0}--" -f $boundary; [System.Text.StringBuilder]$contents = New-Object System.Text.StringBuilder; [void]$contents.AppendLine($header); $filedata = Get-EncodedDataFromFile -file $file -codePageName $CODEPAGE; if ( $filedata ) { $fileContentType = Get-ImageContentType -file $file; $fileHeader = "Content-Disposition: file; name=""{0}""; filename=""{1}""" -f "media", $file.Name; [void]$contents.AppendLine($fileHeader); [void]$contents.AppendLine("Content-Type: {0}" -f $fileContentType); [void]$contents.AppendLine(); [void]$contents.AppendLine($fileData); [void]$contents.AppendLine($header); [void]$contents.AppendLine("Content-Disposition: form-data; name=""username"""); [void]$contents.AppendLine(); [void]$contents.AppendLine($twitteruser); [void]$contents.AppendLine($header); [void]$contents.AppendLine("Content-Disposition: form-data; name=""password"""); [void]$contents.AppendLine(); [void]$contents.AppendLine($twitterpass); $url = $TWITPIC_API_UPLOAD; if ( $message ) { [void]$contents.AppendLine($header); [void]$contents.AppendLine("Content-Disposition: form-data; name=""message"""); [void]$contents.AppendLine(); [void]$contents.AppendLine($message); $url = $TWITPIC_API_UPLOADANDPOST; } [void]$contents.AppendLine($footer); $contents.ToString() > ".\out.txt"; $postContentType = "multipart/form-data; boundary={0}" -f $boundary; [xml]$resp = Execute-HTTPPostcommand -url $url -data $contents.ToString() -contentType $postContentType -codePageName $CODEPAGE -userAgent "PoshTwitPic"; if ( $resp ) { switch ($resp.rsp.stat) { "ok" { $obj = 1 | select mediaid, mediaurl; $obj.mediaid = $resp.rsp.mediaid; $obj.mediaurl = $resp.rsp.mediaurl; $obj; } "fail" { $errcode = $resp.rsp.err.code; $errmsg = $resp.rsp.err.msg; Write-Host "Post Error: Code = '$errcode'; Message = '$errmsg'"; } } } } } else { Write-Host "USAGE: Post-TwitPic.ps1 -file file -twitteruser user -twitterpass pass"; } } if ( $file -and $twitteruser -and $twitterpass ) { Post-TwitPic -file $file -twitteruser $twitteruser -twitterpass $twitterpass -message $message; } else { Write-Host "USAGE: Post-TwitPic.ps1 -file file -twitteruser user -twitterpass pass"; }