2010/03/28

PowerShellでTwitter投稿

こんな記事を見た。

twitter で大学のネットワークを監視 [これでも大学職員のブログ -情報センター勤務中-]
http://d.hatena.ne.jp/daigaku-syokuin/20100326/p1

と、いうわけで探してみました。
やはりPowerShell経由でTwitter投稿するスクリプトを作っている方がいました。

SAPIEN Technologies
http://blog.sapien.com/index.php/2008/06/23/out-twitter/

Mike Ormond's Blog
http://blogs.msdn.com/mikeormond/archive/2009/01/30/updated-twitter-powershell-script.aspx

素晴らしい。で、二つのスクリプトの良いとこ取りをしてくっつけてみた。
以下をFixtwit.ps1 として保存してください。
Function Out-Twitter {

    BEGIN {
            #check for global Twitter credential
            if (!$global:Twitter_Credential) {
                $global:Twitter_Credential=Get-Credential
            }
    }

    PROCESS {
  
        #turn off error pipeline
        $erroractionpreference="SilentlyContinue"
  
        [string]$tweet=$_
  
        ##Twitter投稿関数
        function SubmitWebRequest(  
            [string] $RequestUrl,
            [string] $RequestMethod,
            [string] $RequestContentType,
            [string] $PostString,
            [string] $Username,
            [string] $Password
            )
        {
          [System.Net.ServicePointManager]::Expect100Continue = $false

          $request = [System.Net.WebRequest]::Create($RequestUrl)
          
          if ($Username) {
            $request.Credentials = new-object System.Net.NetworkCredential($Username, $Password)
          }
          
          $request.Method = $RequestMethod
        
          if ($RequestMethod -ieq "POST") {
            $request.ContentType = $RequestContentType      

            $formdata = [System.Text.Encoding]::UTF8.GetBytes($PostString)
            $request.ContentLength = $formdata.Length
            $requestStream = $request.GetRequestStream()
            $requestStream.Write($formdata, 0, $formdata.Length)
            $requestStream.Close()
          }
        
          $response = $request.GetResponse()

          $reader = new-object System.IO.StreamReader($response.GetResponseStream())
          $returnvalue = $reader.ReadToEnd()
          $reader.Close()
        
          return $returnvalue
        } #end function
      
        #Short Url
        Function Get-Snurl {
            Param([string]$link="http://www.google.com")
      
            $tinyurlrequest = "http://tinyurl.com/api-create.php?url=$link"
                       

            write-progress "Tweeting" "Getting tiny URL" -cu $tinyurlrequest
            $tinyurl = SubmitWebRequest $tinyurlrequest "GET"
            write-debug "Tweeting - Received tiny URL Response: $($tinyurl)"
            write $tinyurl
  
        }
        #search for web links using Regex
        [regex]$regex="(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?"
  
         If ($tweet -match $regex) {
                  $link=$matches[0]
          }
       
         #if an embedded url was found, convert it to a snurl link
         if ($link) {
            $snurl=Get-Snurl $link
            $tweet=$tweet.Replace($link,$snurl)
         }


        if ($tweet.Length -gt 140) {
            Write-Warning ("Your message is " + (($tweet.length)-140)  + " characters too long.")
            $clear=$True
            return
        }
      
      
        $tweetstring = [String]::Format("status={0}", $tweet)
        $request = [Net.WebRequest]::Create($url)
        $twitusername=$global:Twitter_Credential.GetNetworkCredential().Username
        $twitpassword=$global:Twitter_Credential.GetNetworkCredential().Password
      
        $twitResponseText = SubmitWebRequest `
                                    "http://twitter.com/statuses/update.xml" `
                                    "POST" `
                                    "application/x-www-form-urlencoded" `
                                    $tweetstring `
                                    $twitusername `
                                    $twitpassword
        write-debug "Tweeting - Posted status update. Response: $($twitResponseText)"

   }
    
    END {
        #if there was an error, then don't keep the global Twitter
        #credential
        if ($clear) {
            Remove-Variable Twitter_Credential -scope Global
            }
        }
      
} #end Function
 じゃば、使ってみる。
PS 2010/03/28 12:23> . .\fixtwit.ps1
PS 2010/03/28 12:24> "もう昼・・お腹すいた・・" | Out-Twitter
fixtwit.ps1 をドット化して実行。
つぶやきたい言葉をはいて、パイプを通し Out-Twitter を実行。

実行すると資格情報を聞かれるので、
Twitterのアカウントとパスワードを入力する。


入力すると処理が走り、投稿完了。

投稿されていることが確認できた。
URL短縮もされるはずなんだけど、うまく行く時と行かないときがあるような。。
なんでだろう。
↑修正しました。

あくまでツギハギなので本家のスクリプトを見に行ってください。
これをPowerShellのバックグラウンド処理を使えば監視っぽいことはできるかもですね。

スポンサーリンク

スポンサーリンク