2011-03-09 12 views
5

私は、次のPythonスクリプト継承していますURLに投稿するユーザーpowershellスクリプト?

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

を、私はPowerShellスクリプトと交換したいと思います。 私は少しgoogledが、私が見つけるすべてのブラウザウィンドウを起動します。

このスクリプトは予定されていますので、可能であれば、私はちょうど "投稿して忘れたい"と思いますか?

非常にありがたく受け取ったすべてのヘルプ:)

答えて

6

ここで私はジオタグでつぶやきを投稿する方法を示しているしばらく前に書いたスクリプトがあります。これはWebClientを使用します。

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

参照しやすいように、ここでのコードを貼り付けます。

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

あなたが特にUploadStringUploadValues、.NETからWebclientクラスを使用することができます。 WebClientオブジェクトを取得するにはNew-Object System.Net.WebClientを実行し、残りの部分は簡単に行う必要があります。

6

機能urlopenはHTTP GETのようです。そして、あなたはWebClientを使用することができます:HTTP POSTの場合

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

を、私はこの機能を使用します。

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

PowerShellのV3以降では、Invoke-WebRequestまたはそのエイリアスiwrを使用することができます。

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

あなたはPythonスクリプトとして出力が同じで必要な場合は、応答のContentプロパティを使用します。

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

@stejが書いたように、Pythonのコードは、GETのように見えますが、あなたはPOSTが必要です場合はMethodパラメータを使用することができます。

iwr 'http://mysite/mypage.aspx?action=dosomething' -Method Post 
関連する問題