Question:
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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 } |
Answer:
I use OAuth by DevDefined as well. My function looks like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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:
1 2 3 4 |
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.