2016-04-20 31 views
7

Sto usando twitter rest api che è (https://api.twitter.com/1.1/).Twitter OAuth Rest Api Status Parametro '@' symbol

Prima di tutto ho utilizzato la libreria di segnaletica per generare la firma oauth_. sta funzionando bene

endpoint Carica Stato (https://api.twitter.com/1.1/statuses/upload.json) sta lavorando bene, ma se stato parametro contiene '@' simbolo, che non funziona. Così qui è il mio codice

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

chiamando client 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 errore:

{"errors":[{"code":32,"message":"Could not authenticate you."}]} 

ma, se userò variabile di stato "solo esempio" invece di "@example" (punto specifico è la rimozione @ personaggio), che sta lavorando. solo il simbolo '@' non funziona.

EDIT

Questo è il mio codice di firma firma creazione manuale di OAuth v1.0a tramite retrofit intercettore:

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)); 
} 
} 
+0

Che cosa state passando in "Intestazione"? La libreria di segnaletica –

+0

sta gestendo l'intestazione. include le variabili di autorizzazione OAuth. – okarakose

+1

Controllare prima in 'Rest Client' –

risposta

4

suggerisco andare in tessuto - https://fabric.io che ha cinguetta varie librerie come Twitter login, crashlytics e ALSS è necessario impostare plug-in tessuto con Android Studio. Pubblica che sarai in grado di pubblicare/recuperare i tuoi tweet indipendentemente da ciò che desideri pubblicare.

Per la tua domanda: controlla che '@' sia un simbolo speciale dove il retrofit causa un problema. Questo tipo di problemi viene fornito con un retrofit che ho affrontato in diversi scenari.

Prova utilizzando del tessuto a Twitter Login/oAuth

+0

Sto usando login/oauth per il twitter-kit di fabric. In realtà lo uso solo per ogni azione, ma la libreria fabric non ha completato la libreria. per esempio non include l'endpoint 'retweets_of_me'. così ho deciso di spostare l'API di riposo di Twitter tramite retrofit. anche la fabric api sta usando il retrofit. tutto sta andando bene con api di riposo ad eccezione dell'uso del simbolo '@' nel parametro di stato :) sai che c'è qualche aggiramento del retrofit per questo problema? o come l'API del tessuto ha gestito questa situazione tramite retrofit? – okarakose

+0

Ehi, guarda se questo link è utile per il retweeting [link] (https://twittercommunity.com/t/twiter-kit-for-android-show-reply-favorite-and-retweet-options-in-embedded-tweets/33386) – MobDev

+0

proverà il tuo codice e ti aggiornerà ... – MobDev

0

È necessario codificare del vostro URL, @ =>% 40. Funziona bene, sono stato provato (y).