Obtención de 401 en Twitter OAuth solicitudes POST

Estoy tratando de usar Twitter OAuth y mis solicitudes POST están fallando con un Invalid OAuth Request 401 ( Invalid OAuth Request ).

Por ejemplo, si quiero publicar una nueva actualización de estado, estoy enviando una POST HTTP POST a https://twitter.com/statuses/update.json con los siguientes 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` 

Mis solicitudes GET están funcionando bien. Puedo ver en las listas de correo que muchas personas han tenido problemas idénticos, pero no pude encontrar una solución en ninguna parte.

Estoy usando la biblioteca de Python oauth.py

Lo más probable es que la firma no sea válida. Debe seguir la especificación de OAuth sobre cómo generar la firma (parámetros normalizados, encoding de URL y cosumerSecret & oauthScret. Más sobre esto más adelante ……

Acabo de terminar de implementar la API de OAuth de twitter desde cero utilizando Java. Obtener y publicar solicitudes funcionan bien. Puede usar esta página http://www.hueniverse.com/hueniverse/2008/10/beginners-gui-1.html para verificar la firma y los encabezados HTTP. Simplemente ingrese sus llaves y tokens y verifique la salida. Parece que Twitter funciona exactamente como se describe en esta publicación. Tenga cuidado con los espacios y los símbolos UTF-8, por ejemplo, Java codifica el espacio como “+” pero OAuth requiere% 20

Asegúrese de que el tipo de acceso a la aplicación sea de lectura y escritura. En la página de configuración de la aplicación (por ejemplo, http://twitter.com/apps/edit/12345 ) hay un campo de botón de radio como este:

Tipo de acceso predeterminado: lectura y escritura / solo lectura

Si marca ‘Sólo lectura’, la API de actualización de estado devolverá 401.

Segundo la respuesta por Jrgns. Tengo exactamente el mismo problema. Al leer el ejemplo que proporciona Twitter, en realidad está claro. Sin embargo, su pseudo código es engañoso. En Python esto me funcionó:

 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 

Tuve los mismos problemas, hasta que me di cuenta de que los parámetros deben codificarse dos veces para la cadena base. Mis solicitudes GET funcionaron bien, pero mis POST, particularmente las actualizaciones de estado, fallaron. En una corazonada probé un POST sin espacios en el parámetro de status , y funcionó.

En 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 la función de encode alrededor de los nombres y valores de los parámetros, y luego alrededor de toda la cadena de consulta. Un espacio debe terminar como %2520 , no solo %20 .

Encontré la solución y funciona para mí. Debe agregar los siguientes parámetros en el encabezado de la solicitud y debe tener el siguiente aspecto (código c #), no usar y firmar, en lugar de separar los parámetros con el signo de coma (,). y debe agregar la palabra “OAuth” en el principio.

httpWebRequest.Headers [nombre del campo de la gimnasia de la gimnasia de la gimnasia de la gimnasia de la gimnasia del campo de la gimnasia de la gimnasia de la gimnasia de la gimnasia de la gimnasia de la gimnasia de la gimnasia de la gimnasia ” = \ “17596307-KH9iUzqTxaoa5576VjILkERgUxcqExRyXkfb8AsXy \”, oauth_version = \ “1.0 \”, oauth_signature = \ “p8f5WTObefG1N9% 2b8AlBji1pg18A%

y otros parámetros como ‘estado’ deben escribirse en el cuerpo de la solicitud.