6

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

例如,如果我想发布一个新的状态更新,我将发送一个 HTTPPOST请求,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.pyPython 库。

4

6 回答 6

4

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

于 2009-04-17T05:14:54.307 回答
3

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

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

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

于 2010-03-19T19:59:17.910 回答
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
于 2011-01-02T22:21:17.727 回答
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围绕参数名称和值的函数,然后围绕整个查询字符串。一个 Space 应该以 结束%2520,而不仅仅是%20

于 2010-01-29T22:21:26.247 回答
0

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

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

和其他参数,如“状态”应该写在请求的正文中。

于 2010-10-23T11:12:33.903 回答
-8

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

于 2009-04-15T19:34:02.263 回答