2011-03-09 41 views
5

ho ereditato il seguente script Python:Script powershell utente da inviare all'URL?

import urllib2 
a = urllib2.urlopen('http://mysite/mypage.aspx?action=dosomething') 
a.read() 
a.close() 

e vorrei sostituirlo con uno script PowerShell. Ho cercato un po 'su google ma tutto quello che trovo lancia una finestra del browser.

Questo script sta per essere programmato, quindi mi piacerebbe solo "postare e dimenticare" se possibile?

Qualsiasi aiuto molto riconoscente ricevuto :)

risposta

6

Ecco uno script che ho scritto un po 'indietro che mostra come inviare tweets con Geotag. Questo utilizza WebClient.

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

incollare il codice qui per una facile consultazione.

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" 
} 
0

È possibile utilizzare la classe Webclient da .NET, in particolare UploadString o UploadValues. Fai un New-Object System.Net.WebClient per ottenere un oggetto webclient, e il resto dovrebbe essere semplice.

6

Funzione urlopen simile a HTTP GET. Quindi è possibile utilizzare WebClient:

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

Per HTTP POST io uso questa funzione:

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

partire con PowerShell v3, è possibile utilizzare Invoke-WebRequest o il suo alias iwr.

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

Se è necessario l'output lo stesso dello script Python, utilizzare la proprietà Content della risposta.

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

Come @stej scritto, il codice Python si presenta come un GET, ma se si ha bisogno post potete utilizzare il parametro Method.

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