我试图使用Twitter的OAuth和我POST请求与401Invalid OAuth Request)错误而失败。

例如,如果我想发布一个新状态更新,我发送HTTP请求POST使用以下参数,以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库。

有帮助吗?

解决方案

最有可能的,该签名无效。你必须按照有关如何生成签名的OAuth规范(标准化参数,URL编码,并cosumerSecret&oauthScret。在此以后......

其他提示

我刚刚完成了从头开始实现使用Java的Twitter OAuth的API。 GET和POST请求的工作确定。您可以使用此页面 http://www.hueniverse.com /hueniverse/2008/10/beginners-gui-1.html 检查签名和HTTP头。只需输入你的钥匙和令牌,并检查输出。看来Twitter的作品完全一样对这个职位描述。小心用空格和UTF-8码元,例如爪哇编码空间为“+”,但OAuth的需要%20

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

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

如果您勾选“只读”,那么状态更新API将返回401。

我第二答案由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

我有同样的问题,直到我意识到需要的参数为基础的字符串被两次编码。我的GET请求都工作得很好,但我的职位,特别是状态更新,失败了。上预感我尝试了POST而不在status参数空间,和它的工作。

在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

我找到了解决方案,它为我工作,你必须在请求头中添加以下paramters,它应该像以下(C#代码),DONOT使用&符号,用逗号,而不是单独的参数(,)符号。你必须在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 \“”;

和其他参数,如“状态”应在请求的主体中被写入。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top