4

Has anyone used the following code? How do I make it post a tweet? I know I have to use the "$req.Context.RawUri = [Uri]'http://api.twitter.com/version/statuses/update.xml" but I can't get the "$res = [xml][DevDefined.OAuth.Consumer.ConsumerRequestExtensions]::ReadBody($req)" right.

Add-Type -Path C:\OAuthDevDefined\DevDefined.OAuth.dll

$cons = New-Object devdefined.oauth.consumer.oauthconsumercontext

$cons.ConsumerKey = 'key'

$cons.ConsumerSecret = 'key'

$cons.SignatureMethod = [devdefined.oauth.framework.signaturemethod]::HmacSha1

$session = new-object DevDefined.OAuth.Consumer.OAuthSession $cons, $null, $null, $null

$accessToken = new-object DevDefined.OAuth.Framework.TokenBase

$at = import-cliXml C:\temp\myTwitterAccessToken.clixml

$accessToken.ConsumerKey, $accessToken.Realm, $accessToken.Token, $accessToken.TokenSecret = `
  $at.ConsumerKey, $at.Realm, $at.Token, $at.TokenSecret

$req = $session.Request($accessToken)

$req.Context.RequestMethod = 'GET'

$req.Context.RawUri = [Uri]'http://api.twitter.com/1/statuses/friends_timeline.xml?count=5'

$res = [xml][DevDefined.OAuth.Consumer.ConsumerRequestExtensions]::ReadBody($req)

$res.statuses.status | % { $_.user.Name }
rzetterberg
  • 10,146
  • 4
  • 44
  • 54
troz123
  • 41
  • 1
  • 2

2 Answers2

7

I use OAuth by DevDefined as well. My function looks like this:

function Post-Twitter {
    param(
        [Parameter(Mandatory=$true)][string]$url
    )
    if (!$script:accessToken) {
        throw 'token is not initialized'
    }

  try {
    $cons = New-Object devdefined.oauth.consumer.oauthconsumercontext
    $cons.ConsumerKey = $consumerKey
    $cons.ConsumerSecret = $consumerSecret
    $cons.SignatureMethod = [devdefined.oauth.framework.signaturemethod]::HmacSha1
    $session = new-object DevDefined.OAuth.Consumer.OAuthSession `
      $cons,
      "http://twitter.com/oauth/request_token",
      "http://twitter.com/oauth/authorize",
      "http://twitter.com/oauth/access_token"
    $token = Get-AccessToken 
    $req = $session.Request($token)
    $req.Context.RequestMethod = 'POST'
    $req.Context.RawUri = new-object Uri $url
    [DevDefined.OAuth.Consumer.ConsumerRequestExtensions]::ReadBody($req)
    } catch {
    Write-Warning "Exception: $_"
    $null
  }
}

Then for simplicity I pass status in query string:

add-type -assembly System.Web
$status = [system.Web.Httputility]::UrlEncode('some tweet')
Post-Twitter "http://api.twitter.com/1/statuses/update.xml?status=$status"

It seems that you know about the consumer key/secret and the token thing, so I'll leave it without further explanation.

stej
  • 28,745
  • 11
  • 71
  • 104
  • Thanks for your response... However I can't get it working... :( – troz123 Jun 12 '11 at 21:48
  • I kept on getting error "the remote server returned an error 417 expectation failed" so I added [System.Net.ServicePointManager]::Expect100Continue = $false but now i'm get strange html code back. – troz123 Jun 12 '11 at 21:48
  • 2
    And what was your solution with the 417 code? Never seen that. – stej Jun 13 '11 at 05:31
1

I’ve just posted a Powershell Twitter REST API 1.1 Module on TechNet Gallery… You'll be able to post/get from Twitter API! https://goo.gl/s7pmmA

Marc Kellerman
  • 466
  • 3
  • 10