2011-03-09 51 views
5

tôi có được thừa kế kịch bản Python sau:Tập lệnh powershell của người dùng để đăng lên URL?

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

và tôi muốn thay thế nó với một kịch bản PowerShell. Tôi đã googled một chút nhưng tất cả mọi thứ tôi tìm ra mắt một cửa sổ trình duyệt.

Tập lệnh này sắp được lên lịch, vì vậy tôi muốn chỉ "đăng và quên" nếu có thể?

Bất kỳ sự giúp đỡ rất biết ơn nhận :)

Trả lời

6

Dưới đây là một kịch bản tôi đã viết một khi trở lại cho thấy làm thế nào để gửi tweets với Thẻ địa lý. Điều này sử dụng WebClient.

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

Dán mã ở đây để dễ tham khảo.

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

Bạn có thể sử dụng lớp Webclient từ NET, đặc biệt là UploadString hoặc UploadValues. Thực hiện New-Object System.Net.WebClient để nhận đối tượng webclient và phần còn lại phải đơn giản.

6

Chức năng urlopen trông giống như HTTP GET. Sau đó, bạn có thể sử dụng WebClient:

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

Đối với HTTP POST tôi sử dụng chức năng này:

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

Bắt đầu với PowerShell v3, bạn có thể sử dụng Invoke-WebRequest hoặc bí danh của nó iwr.

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

Nếu bạn cần đầu ra giống như tập lệnh Python, hãy sử dụng thuộc tính Content của phản hồi.

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

Khi @stej viết, mã Python trông giống như GET, nhưng nếu bạn cần POST, bạn có thể sử dụng tham số Method.

iwr 'http://mysite/mypage.aspx?action=dosomething' -Method Post 
Các vấn đề liên quan