如何使用Powershell发布推文到Twitter?

4

有人使用过下面的代码吗?我该如何发推特?我知道我必须使用 "$req.Context.RawUri = [Uri]'http://api.twitter.com/version/statuses/update.xml'",但我无法正确使用 "$res = [xml][DevDefined.OAuth.Consumer.ConsumerRequestExtensions]::ReadBody($req)"。

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 }

你为什么想要使用PowerShell来做这件事呢?你不能使用C#并在PowerShell中使用它吗? - manojlds
1
构建一个轻量级应用程序,可以通过简单的命令启动。 - troz123
有没有完整的源代码示例,可以作为最终解决方案? - Kiquenet
2个回答

7
我也使用DevDefined的OAuth。我的函数看起来像这样:

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
  }
}

为了简单起见,我将状态传递到查询字符串中:

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

看起来你已经知道了消费者密钥/密钥和令牌这些东西,所以我就不再详细解释了。


谢谢您的回复... 但是我无法让它工作... :( - troz123
我一直收到错误信息“远程服务器返回了一个错误417 expectation failed”,所以我添加了[System.Net.ServicePointManager] :: Expect100Continue = $ false,但现在我收到了奇怪的HTML代码。 - troz123
2
你对417代码的解决方案是什么?我从未见过它。 - stej

1
我刚刚在TechNet Gallery上发布了一个 Powershell Twitter REST API 1.1 模块……您可以从Twitter API中进行发布/获取!https://goo.gl/s7pmmA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接