User powershell script to post to URL? User powershell script to post to URL? powershell powershell

User powershell script to post to URL?


Here is a script I wrote a while back that shows how to post tweets with Geotags. This uses WebClient.

http://www.ravichaganti.com/blog/?p=979

Pasting the code here for easy reference.

Function ByPass-Proxy {    param ([string]$url)    $webClient.Proxy.IsBypassed($url)}Function Get-GeoCoordinates {    param ([String]$location)    $baseURL = "http://maps.google.com/maps/geo?q="    $apiKey = "Your API Key"    $url = $baseURL + $location + "&output=xml&sensor=false&key=" + $apiKey    $locCoords = (([xml]($WebClient.DownloadString($url))).kml.Response.Placemark.Point.coordinates)    return $locCoords}Function Send-Tweet {    param ([string]$Tweet,[string]$location)    $geoCoord = Get-GeoCoordinates $location    $long = $geoCoord.Split(",")[0]    $lat = $geoCoord.Split(",")[1]    $TwitURL = "http://twitter.com/statuses/update.xml"    $WebClient.Credentials = $TwitCredentials    #$str = [System.Text.Encoding]::UTF8.GetBytes( "status="  + $Tweet + "&lat=" + $lat + "&long=" + $long )    $str = "status="  + $Tweet + "&lat=" + $lat + "&long=" + $long    [System.Net.ServicePointManager]::Expect100Continue = $false    $response = $WebClient.UploadString($TwitURL,$str)    $response}function Get-Credential { ## Grabbed this from http://poshcode.org/1480[CmdletBinding(DefaultParameterSetName="Better")]PARAM(   [Parameter(Position=1,Mandatory=$false)]   [Alias("Credential")]   [PSObject]$UserName=$null,   [Parameter(Position=2,Mandatory=$false)]   [string]$Title=$null,   [Parameter(Position=3,Mandatory=$false)]   [string]$Message=$null,   [Parameter(Position=4,Mandatory=$false)]   [string]$Domain=$null,   [Parameter(Mandatory=$false)]   [switch]$GenericCredentials,   [Parameter(Mandatory=$false)]   [switch]$Inline)PROCESS {   if( $UserName -is [System.Management.Automation.PSCredential]) {      return $UserName   } elseif($UserName -ne $null) {      $UserName = $UserName.ToString()   }   if($Inline) {      if($Title)    { Write-Host $Title }      if($Message)  { Write-Host $Message }      if($Domain) {          if($UserName -and $UserName -notmatch "[@\\]") {             $UserName = "${Domain}\${UserName}"         }      }      if(!$UserName) {         $UserName = Read-Host "User"         if(($Domain -OR !$GenericCredentials) -and $UserName -notmatch "[@\\]") {            $UserName = "${Domain}\${UserName}"         }      }      return New-Object System.Management.Automation.PSCredential $UserName,$(Read-Host "Password for user $UserName" -AsSecureString)   }   if($GenericCredentials) { $Credential = "Generic" } else { $Credential = "Domain" }   ## Now call the Host.UI method ... if they don't have one, we'll die, yay.   ## BugBug? PowerShell.exe disregards the last parameter   $Host.UI.PromptForCredential($Title, $Message, $UserName, $Domain, $Credential,"Default")}}$global:webClient = New-Object System.Net.WebClient$global:TwitCredentials = Get-Credential -title "Twitter Credentials" -message "Please enter your Twitter username/password"If (!(ByPass-Proxy "http://www.twitter.com")) {    $global:Webclient.proxy.Credentials = Get-Credential -title "Proxy Credentials" -message "Please enter username/password for Proxy authentication"}


Function urlopen looks like HTTP GET. Then you can use WebClient:

$w = New-Object net.webclient$w.DownloadString('http://mysite/mypage.aspx?action=dosomething')

For HTTP POST I use this function:

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();  }}


Starting with PowerShell v3, you can use Invoke-WebRequest or its alias iwr.

iwr 'http://mysite/mypage.aspx?action=dosomething'

If you need the output the same as the Python script, use the Content property of the response.

(Invoke-WebRequest 'http://mysite/mypage.aspx?action=dosomething').Content

As @stej wrote, the Python code looks like a GET, but if you do need POST you can use the Method parameter.

iwr 'http://mysite/mypage.aspx?action=dosomething' -Method Post