Twitter OAuth Rest Api Estado Parámetro '@' symbol
Estoy utilizando twitter rest api que es ( https://api.twitter.com/1.1/ ).
Primero utilicé la biblioteca de signpost para generar oauth_signature. Está funcionando bien.
- Android tela twitter autorizar la devolución de llamada no se llama
- Tela Iniciar sesión con el botón de twitter está en gris
- No se puede establecer devolución de llamada al cargar la línea de tiempo del usuario con Fabric Twitter Kit en la aplicación de Android
- Callback para identificar el problema mientras se carga UserTimeline usando TweetTimelineListAdapter
- Fabric by twitter: Pemissions de sólo lectura para una aplicación de Android
El punto final de estado de la subida ( https://api.twitter.com/1.1/statuses/upload.json ) está funcionando bien, pero si el parámetro de estado contiene el símbolo "@" , no funciona. Así que aquí está mi código
TwitterStatusesService.java
import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.POST; import retrofit2.http.Path; import retrofit2.http.Query; public interface TwitterStatusesService { @POST("/1.1/statuses/update.json") Call<ResponseBody> update(@Query("status") String status, @Query("in_reply_to_status_id") String inReplyToStatusId, @Query("lat") Double lat, @Query("long") Double lon, @Query("media_ids") String mediaIds); }
TwitterStatusesAPIClient.java
import android.util.Log; import com.twitter.sdk.android.core.TwitterAuthToken; import com.twitter.sdk.android.core.TwitterCore; import com.twitter.sdk.android.core.TwitterSession; import okhttp3.OkHttpClient; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.Retrofit; import se.akerfeldt.okhttp.signpost.OkHttpOAuthConsumer; import se.akerfeldt.okhttp.signpost.SigningInterceptor; public class TwitterStatusesClient { private final String TAG = getClass().getSimpleName(); private static final String BASE_URL = "https://api.twitter.com/"; private final TwitterStatusesService apiService; private static TwitterStatusesClient webServiceClient; public static TwitterStatusesClient getInstance() { if (webServiceClient == null) webServiceClient = new TwitterStatusesClient(); return webServiceClient; } private TwitterStatusesClient() { private TwitterStatusesClient() { OkHttpOAuthConsumer consumer = new OkHttpOAuthConsumer(TWITTER_KEY, TWITTER_SECRET); TwitterSession activeSession = TwitterCore.getInstance().getSessionManager().getActiveSession(); if (activeSession != null) { TwitterAuthToken authToken = activeSession.getAuthToken(); String token = authToken.token; String secret = authToken.secret; consumer.setTokenWithSecret(token, secret); } OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new SigningInterceptor(consumer)) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .build(); apiService = retrofit.create(TwitterStatusesService.class); } public Call<ResponseBody> update(String status, String statusId, Double lat, Double lon, String mediaIds) { return apiService.update(status, statusId, lat, lon, mediaIds); } }
Llamando al cliente api
String status = "@example"; TwitterStatusesClient.getInstance().update(status, null, null, null, null).enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { Log.v(TAG, "onResponse"); progressDialog.dismiss(); try { if (response.errorBody() != null) { String error = response.errorBody().string(); Log.e(TAG, "Error : " + error); ToastUtils.showErrorMessage(getContext(), "Error : " + error); return; } String body = response.body().string(); Log.v(TAG, "body : " + body); } catch (Exception e) { e.printStackTrace(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { Log.v(TAG, "onFailure"); t.printStackTrace(); } });
Dando error:
{"errors":[{"code":32,"message":"Could not authenticate you."}]}
Pero, si voy a usar la variable de estado "sólo ejemplo" en lugar de "@example" (punto específico está quitando el carácter @) que está funcionando. Sólo el símbolo '@' no funciona.
EDITAR
Esta es la creación manual de código de firma OAuth v1.0a mediante un interceptor retrofit:
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request request = chain.request(); String method = request.method(); String baseUrl = "https://api.twitter.com" + request.url().url().getPath(); String oauthToken = ""; String oauthTokenSecret = ""; TwitterSession activeSession = TwitterCore.getInstance().getSessionManager().getActiveSession(); if (activeSession != null) { TwitterAuthToken authToken = activeSession.getAuthToken(); oauthToken = authToken.token; oauthTokenSecret = authToken.secret; } String oauthNonce = "TXZScw4M8TG"; String oauthSignatureMethod = "HMAC-SHA1"; String oauthTimestamp = String.valueOf(System.currentTimeMillis() / 1000); String oauthVersion = "1.0"; String parameterString = ""; parameterString = OAuthParams.addParam(request, parameterString, "count"); parameterString = OAuthParams.addParam(request, parameterString, "id"); parameterString = OAuthParams.addParam(request, parameterString, "in_reply_to_status_id"); // if any parameter added to parameterString, append '&' character. if (parameterString.length() > 0) { parameterString += "&"; } parameterString += "oauth_consumer_key=" + TWITTER_KEY + "&" + "oauth_nonce=" + oauthNonce + "&" + "oauth_signature_method=" + oauthSignatureMethod + "&" + "oauth_timestamp=" + oauthTimestamp + "&" + "oauth_token=" + oauthToken + "&" + "oauth_version=" + oauthVersion; // add status parameter to parameterString. parameterString = OAuthParams.addParam(request, parameterString, "status"); Log.d(TAG, "normalizedParameters : " + parameterString); Log.d(TAG, "parameterStringPercent : " + OAuth.percentEncode(parameterString)); String signatureBaseString = ""; signatureBaseString += OAuth.percentEncode(method) + "&"; signatureBaseString += OAuth.percentEncode(baseUrl) + "&"; signatureBaseString += OAuth.percentEncode(parameterString); String oauthSignature = OauthSignature.generateSignature(signatureBaseString, TWITTER_SECRET, oauthTokenSecret); String authorization = "OAuth oauth_consumer_key=\"" + TWITTER_KEY + "\", " + "oauth_signature_method=\"HMAC-SHA1\", " + "oauth_timestamp=\"" + oauthTimestamp + "\", " + "oauth_nonce=\"" + oauthNonce + "\", " + "oauth_version=\"1.0\", " + "oauth_token=\"" + oauthToken + "\", " + "oauth_signature=\"" + OAuth.percentEncode(oauthSignature) + "\""; Log.w(TAG, "Authorization : " + authorization); request = request.newBuilder() .addHeader("Authorization", authorization) .build(); return chain.proceed(request); } }).addInterceptor(interceptor).build();
OAuth.java
public static String percentEncode(String s) { if (s == null) { return ""; } try { return URLEncoder.encode(s, ENCODING) // OAuth encodes some characters differently: .replace("+", "%20").replace("*", "%2A") .replace("%7E", "~"); // This could be done faster with more hand-crafted code. } catch (UnsupportedEncodingException wow) { throw new RuntimeException(wow.getMessage(), wow); } }
OAuthSignature.java
import android.util.Base64; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public class OauthSignature { public static String generateSignature(String signatueBaseStr, String oAuthConsumerSecret, String oAuthTokenSecret) { byte[] byteHMAC = null; try { Mac mac = Mac.getInstance("HmacSHA1"); SecretKeySpec spec; if (null == oAuthTokenSecret) { String signingKey = OAuth.percentEncode(oAuthConsumerSecret) + '&'; spec = new SecretKeySpec(signingKey.getBytes(), "HmacSHA1"); } else { String signingKey = OAuth.percentEncode(oAuthConsumerSecret) + '&' + OAuth.percentEncode(oAuthTokenSecret); spec = new SecretKeySpec(signingKey.getBytes(), "HmacSHA1"); } mac.init(spec); byteHMAC = mac.doFinal(signatueBaseStr.getBytes()); } catch (Exception e) { e.printStackTrace(); } return new String(Base64.encode(byteHMAC, Base64.DEFAULT)); } }
- No puede resolver el símbolo 'Twitter' - Twitter Tela
- Twitter SDK requestCode
- Tejido de Twitter Login para Android
- Error al obtener el método de token de solicitud POST debe tener un cuerpo de solicitud
- Inicio de sesión de Twitter sin TwitterLoginButton
- Recibe correo electrónico de Twitter usando Fabric SDK
- ¿Qué tan seguro es tener clave de consumidor de twitter y secreto codificado en la aplicación android?
- ¿Utilizando el botón de inicio de sesión personalizado con Twitter Fabric?
Sugiero ir con la tela – https://fabric.io que tiene twitters diversas libs como el inicio de sesión de twitter, crashlytics y alss que necesita para configurar el plugin de tela con estudio de Android. Publicar que usted será capaz de publicar / recuperar tweets independientemente de lo que desea publicar.
Para su pregunta – compruebe que '@' es un símbolo especial donde por retrofit está causando un problema. Este tipo de problemas surgen con retrofit que he enfrentado en diferentes escenarios.
Trate de usar Fabric para Twitter Login / oAuth
- ¿Qué es la propiedad XML xmlns: app?
- El informe de fallo de Android no se envía a la consola de desarrolladores