在Twitter上获取401 OAuth POST请求

时间:2009-03-27 06:52:36

标签: python web-services twitter rest oauth

我正在尝试使用Twitter OAuth,但我的POST请求失败并出现401Invalid OAuth Request)错误。

例如,如果我想发布新的状态更新,我将使用以下参数向POST发送HTTP https://twitter.com/statuses/update.json请求 -

status=Testing&oauth_version=1.0&oauth_token=xxx&
oauth_nonce=xxx&oauth_timestamp=xxx&oauth_signature=xxx&
oauth_consumer_key=xxx&in_reply_to=xxx&oauth_signature_method=HMAC-SHA1`

我的GET请求一切正常。我可以在邮件列表上看到很多人遇到了相同的问题,但我无法在任何地方找到解决方案。

我正在使用oauth.py Python库。

6 个答案:

答案 0 :(得分:4)

我刚刚使用Java从头开始实现twitter OAuth API。获取和发布请求工作正常。您可以使用此页面http://www.hueniverse.com/hueniverse/2008/10/beginners-gui-1.html来检查签名和HTTP标头。只需输入您的密钥和令牌并检查输出。看来twitter的工作原理与本文所描述的完全相同。注意空格和UTF-8符号,例如Java将空格编码为“+”,但OAuth需要%20

答案 1 :(得分:3)

确保您的应用访问类型已读取&写。 在您的应用设置页面(例如http://twitter.com/apps/edit/12345)上有一个单选按钮字段:

默认访问类型:阅读&写/只读

如果您选中“只读”,则状态更新API将返回401。

答案 2 :(得分:3)

我是Jrgns的第二个回答。我有完全相同的问题。在阅读Twitter提供的示例时,实际上很清楚。然而,他们的伪代码具有误导性。在Python中,这对我有用:

def encodekeyval(key, val):
    key = urllib.quote(key, '')
    val = urllib.quote(val, '')
    return urllib.quote(key + '=' + val, '')

def signature_base_string(urlstr, oauthdata):
    sigstr = 'POST&' + urllib.quote(urlstr,'') + '&'
    # retrieve "post" data as dictionary of name value pairs
    pdata = oauthdata.getpdata()
    # need to sort parameters
    pstr = '%26'.join([encodekeyval(key, pdata[key]) for key in sorted(pdata.keys())])
    return sigstr + pstr

答案 3 :(得分:2)

我遇到了同样的问题,直到我意识到参数需要为基本字符串编码两次。我的GET请求一切正常,但我的POST,特别是状态更新失败了。在预感中,我在status参数中尝试了一个没有空格的POST,并且它有效。

在PHP中:

function encode($input) {
    return str_replace('+', ' ', str_replace('%7E', '~', rawurlencode($input)));
}

$query = array();
foreach($parameters as $name => $value) {
    $query[] = encode($name) . '=' .encode($value);
}
$base = encode(strtoupper($method)) . '&' .encode($norm_url) . '&' . 
encode(implode('&', $query));

注意围绕参数名称和值的encode函数,然后围绕整个查询字符串。空格最终应为%2520,而不仅仅是%20

答案 4 :(得分:0)

我找到了解决方案并且它适用于我,您必须在请求标头中添加以下参数,它应该如下所示(c#代码),不要使用&标志,而不是用逗号(,)符号分隔参数。并且您必须在beginging中添加“OAuth”一词。

  

httpWebRequest.Headers [System.Net.HttpRequestHeader.Authorization] =“OAuth oauth_consumer_key = \”hAnZFaPKxXnJqdfLhDikdw \“,oauth_nonce = \”4729687 \“,oauth_signature_method = \”HMAC-SHA1 \“,oauth_timestamp = \”1284821989 \ “,oauth_token = \”17596307-KH9iUzqTxaoa5576VjILkERgUxcqExRyXkfb8AsXy \“,oauth_version = \”1.0 \“,oauth_signature = \”p8f5WTObefG1N9%2b8AlBji1pg18A%3d \“”;

和其他参数如'status'应写在请求正文中。

答案 5 :(得分:-8)

最有可能的是,签名无效。你必须遵循关于如何生成签名的OAuth规范(规范化参数,URLencoding和cosumerSecret& oauthScret。稍后会详细介绍......