2016-04-20 9 views
7

Ich benutze Twitter Rest API, die (https://api.twitter.com/1.1/) ist.Twitter OAuth Ruhe Api Status Parameter '@' Symbol

Zuerst habe ich die Signpost-Bibliothek verwendet, um oauth_signature zu generieren. es funktioniert gut.

Upload Status Endpunkt (https://api.twitter.com/1.1/statuses/upload.json) funktioniert gut, aber wenn Status Parameter enthält '@' Symbol, das funktioniert nicht. So, hier ist mein Code

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

Aufruf api Client

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(); 
     } 
    }); 

geben Fehler:

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

aber, wenn ich Statusvariable verwenden „nur Beispiel“ anstelle von „@example“ (spezifischen Punkt ist das Entfernen @ -Zeichen), die funktioniert. Nur das '@' Symbol funktioniert nicht.

EDIT

Dies ist meine manuelle Erstellung OAuth v1.0a Signatur Signaturcode über Nachrüst Interceptor:

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

Was passieren Sie in 'Header'? –

+0

Wegweiser Bibliothek behandelt Kopfzeile. Es enthält Autorisierungs-OAuth-Variablen. – okarakose

+1

Überprüfen Sie zuerst in 'Rest Client' –

Antwort

4

Ich schlage vor, mit Stoff gehen - https://fabric.io die zwitschert verschiedene Libs wie Twitter Login, crashlytics und ALSs Sie müssen Setup-Stoff-Plugin mit Android Studio. Poste, dass du Tweets posten/abrufen kannst, egal was du posten willst.

Für Ihre Frage - überprüfen Sie, dass "@" ein spezielles Symbol ist, bei dem die Nachrüstung ein Problem verursacht. Diese Art von Problemen kommt mit Nachrüstung, die ich in verschiedenen Szenarien konfrontiert habe.

Versuchen Stoff für Twitter Login/oAuth

+0

Ich benutze login/oauth für Fabrics Twitter-Kit. Ich benutze es nur für jede Aktion, aber die Stoffbibliothek hat die Bibliothek nicht vervollständigt. Zum Beispiel enthält es nicht den Endpunkt "retweets_of_me". also habe ich beschlossen, twitter rest api via nachrüstung zu verlegen. Stoff api verwendet auch Nachrüstung. Alles läuft gut mit Ruhe-API außer der Verwendung von '@' Symbol im Status-Parameter :) Weißt du, gibt es irgendwelche Umarbeitungen für dieses Problem? Oder wie Fabric Api diese Situation durch Retrofit behandelte? – okarakose

+0

Hey, sieh, ob dieser Link hilfreich für das Retweeten ist [link] (https://twittercommunity.com/t/twiter-kit-for-android-show-reply-favorite-and-retweet-options-in-embedded-tweets/33386) – MobDev

+0

versuchen Sie Ihren Code und aktualisieren Sie ... – MobDev

0

Sie verwenden, müssen von Ihrer URL kodieren, @ =>% 40. Es funktioniert gut, ich wurde versucht (y).