Pergunta

Eu estou tentando usar o Twitter OAuth e meus pedidos POST estão falhando com um erro 401 (Invalid OAuth Request).

Por exemplo, se eu quiser postar uma nova atualização de status, estou enviando um pedido POST HTTP para https://twitter.com/statuses/update.json com os seguintes parâmetros -

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`

Meus pedidos GET são todos muito bem trabalho. Eu posso ver nas listas de discussão que muitas pessoas tiveram problemas idênticos, mas eu não poderia encontrar um lugar solução.

Eu estou usando o oauth.py biblioteca Python.

Foi útil?

Solução

Provavelmente, a assinatura é inválida. Você deve seguir a especificação OAuth sobre como gerar a assinatura (parâmetros normalizados, URLEncoding e cosumerSecret & oauthScret. Mais sobre isso mais tarde ......

Outras dicas

Acabei de terminar a implementação do twitter OAuth API a partir do zero usando Java. Solicitações GET e POST trabalhar OK. Você pode usar esta página http://www.hueniverse.com /hueniverse/2008/10/beginners-gui-1.html para verificar a assinatura e cabeçalhos HTTP. Basta inserir as chaves e tokens e verificar a saída. Parece Twitter funciona exatamente como descritos neste post. Tenha cuidado com espaços e símbolos 8 UTF-, para o espaço exemplo Java codifica como "+", mas OAuth requer% 20

Verifique se o seu tipo de acesso aplicativo é ler e escrever. Na página seu aplicativo de configurações (ex. http://twitter.com/apps/edit/12345) há um campo de botão de rádio como esta:

Tipo de acesso padrão: Ler e Escrever / Read-only

Se você verificar 'Read-only', em seguida, atualização de status API retornará 401.

Eu segundo a resposta por Jrgns. I tem exatamente o mesmo problema. Ao ler o exemplo Twitter fornece, é realmente limpar. No entanto o seu código pseudo é enganosa. Em Python isso funcionou para mim:

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

Eu tive os mesmos problemas, até que percebi que os parâmetros precisam ser codificado duas vezes para a cadeia base. Meus pedidos GET tudo funcionou bem, mas meus posts, particularmente atualizações de status, falhou. Em um palpite eu tentei um POST sem espaços no parâmetro status, e funcionou.

Em 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));

Observe a função encode em torno dos nomes e valores dos parâmetros e, em seguida ao redor de toda a cadeia de consulta. Um espaço deve acabar como %2520, não apenas %20.

Eu encontrei a solução e ele funciona para mim, Você deve adicionar os seguintes paramters no cabeçalho da solicitação e ele deve ser parecido seguinte (código C #), o uso donot & sinal, em vez parâmetros separados por vírgulas (,) sinal. e você deve adicionar a palavra "OAuth" no beginging.

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 \"";

e outros parâmetros como o 'status' deve ser escrito no corpo da solicitação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top