2012-11-14 151 views
3

我正在尋找一個簡單的Java示例使用Twitter 1.1 API並找不到一個。使用這裏發佈的PHP示例:Simplest PHP example for retrieving user_timeline with Twitter API version 1.1和一些其他的Stackoverflow帖子,我能夠拿出下面的工作示例。最簡單的Java示例檢索user_timeline與twitter API版本1.1

public void testUserTimelineWithAuthSample() throws Exception { 
    //This will read the timeline of your account. 
    String method = "GET"; 
    String url = "https://api.twitter.com/1.1/statuses/user_timeline.json"; 

    String oAuthConsumerKey = "Your value here."; 
    String oAuthConsumerSecret = "Your value here."; //<--- DO NOT SHARE THIS VALUE 

    String oAuthAccessToken = "Your value here."; 
    String oAuthAccessTokenSecret = "Your value here."; //<--- DO NOT SHARE THIS VALUE 

    String oAuthNonce = String.valueOf(System.currentTimeMillis()); 
    String oAuthSignatureMethod = "HMAC-SHA1"; 
    String oAuthTimestamp = time(); 
    String oAuthVersion = "1.0"; 

    String signatureBaseString1 = method; 
    String signatureBaseString2 = url; 
    String signatureBaseString3Templ = "oauth_consumer_key=%s&oauth_nonce=%s&oauth_signature_method=%s&oauth_timestamp=%s&oauth_token=%s&oauth_version=%s"; 
    String signatureBaseString3 = String.format(signatureBaseString3Templ, 
                oAuthConsumerKey, 
                oAuthNonce, 
                oAuthSignatureMethod, 
                oAuthTimestamp, 
                oAuthAccessToken, 
                oAuthVersion); 

    String signatureBaseStringTemplate = "%s&%s&%s"; 
    String signatureBaseString = String.format(signatureBaseStringTemplate, 
                   URLEncoder.encode(signatureBaseString1, "UTF-8"), 
                   URLEncoder.encode(signatureBaseString2, "UTF-8"), 
                   URLEncoder.encode(signatureBaseString3, "UTF-8")); 

    System.out.println("signatureBaseString: "+signatureBaseString); 

    String compositeKey = URLEncoder.encode(oAuthConsumerSecret, "UTF-8") + "&" + URLEncoder.encode(oAuthAccessTokenSecret, "UTF-8"); 

    String oAuthSignature = computeSignature(signatureBaseString, compositeKey); 
    System.out.println("oAuthSignature  : "+oAuthSignature); 

    String oAuthSignatureEncoded = URLEncoder.encode(oAuthSignature, "UTF-8"); 
    System.out.println("oAuthSignatureEncoded: "+oAuthSignatureEncoded); 

    String authorizationHeaderValueTempl = "OAuth oauth_consumer_key=\"%s\", oauth_nonce=\"%s\", oauth_signature=\"%s\", oauth_signature_method=\"%s\", oauth_timestamp=\"%s\", oauth_token=\"%s\", oauth_version=\"%s\""; 

    String authorizationHeaderValue = String.format(authorizationHeaderValueTempl, 
                 oAuthConsumerKey, 
                 oAuthNonce, 
                 oAuthSignatureEncoded, 
                 oAuthSignatureMethod, 
                 oAuthTimestamp, 
                 oAuthAccessToken, 
                 oAuthVersion); 
    System.out.println("authorizationHeaderValue: "+authorizationHeaderValue); 


    System.out.println("url: "+url); 
    System.out.println("authorizationHeaderValue:"+authorizationHeaderValue); 

    GetMethod getMethod = new GetMethod(url); 
    getMethod.addRequestHeader("Authorization", authorizationHeaderValue); 
    HttpClient cli = new HttpClient(); 
    int status = cli.executeMethod(getMethod); 
    System.out.println("Status:"+status); 

    long responseContentLength = getMethod.getResponseContentLength(); 
    System.out.println("responseContentLength:"+responseContentLength); 

    String response = getMethod.getResponseBodyAsString(); 
    System.out.println("response: "+response); 
} 


private static String computeSignature(String baseString, String keyString) throws GeneralSecurityException, UnsupportedEncodingException, Exception 
{ 
    SecretKey secretKey = null; 

    byte[] keyBytes = keyString.getBytes(); 
    secretKey = new SecretKeySpec(keyBytes, "HmacSHA1"); 

    Mac mac = Mac.getInstance("HmacSHA1"); 

    mac.init(secretKey); 

    byte[] text = baseString.getBytes(); 

    return new String(Base64.encodeBase64(mac.doFinal(text))).trim(); 
} 

private String time() { 
    long millis = System.currentTimeMillis(); 
    long secs = millis/1000; 
    return String.valueOf(secs); 
} 

但是,如果我添加URL參數,如:

String url = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=twitterapi&count=2"; 

我得到:

響應:{ 「錯誤」:[{ 「消息」:「無法驗證你「,」code「:32}]}

任何想法哪裏出錯了?

+1

什麼是你的問題,我的解決方案? – nstehr

回答

0

你錯了oauth_nonce。它是一個隨機的32字節串在基編碼64.

可以建立他們這樣的:

public String generateNonce() { 
    Random gen = new Random(System.currentTimeMillis()); 
    StringBuilder nonceBuilder = new StringBuilder(""); 
    String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    int baseLength = base.length(); 

    // Taking random word characters 
    for (int i = 0; i < 32; ++i) { 
     int position = gen.nextInt(baseLength); 
     nonceBuilder.append(base.charAt(position)); 
    } 

    String nonce = toBase64(nonceBuilder.toString()); 

    return nonce; 
} 

// In your code : 
String oAuthNonce = generateNonce(); 

隨着String toBase64(String);這是一個字符串編碼具有基地64.

0

這裏的一個的方法與參數配合使用的Twitter 1.1 API示例。這個問題與nonce無關。這是signatureBaseString。將signatureBaseString看作由&符號分隔的3部分字符串(METHOD & URL & PARAMS)。 api參數不包含在signatureBaseString的第二部分中,它們將被包含在其中(與其他6個安全參數一起)在signatureBaseString的最後部分(而且,這些參數必須按字母順序排列)。

public void testUserTimelineWithParams() throws Exception { 
    //This will read the timeline of the 'twitterapi' account. 

    String method = "GET"; 
    String url = "https://api.twitter.com/1.1/statuses/user_timeline.json"; 
    List<NameValuePair> urlParams = new ArrayList<NameValuePair>(); 
    urlParams.add(new NameValuePair("screen_name","twitterapi")); 
    urlParams.add(new NameValuePair("count", "10")); 

    String oAuthConsumerKey = "Your value"; 
    String oAuthConsumerSecret = "Your value"; //<--- DO NOT SHARE THIS VALUE 

    String oAuthAccessToken = "Your value"; 
    String oAuthAccessTokenSecret = "Your value"; //<--DO NOT SHARE THIS VALUE 

    String oAuthNonce = String.valueOf(System.currentTimeMillis()); 
    String oAuthSignatureMethod = "HMAC-SHA1"; 
    String oAuthTimestamp = time(); 
    String oAuthVersion = "1.0"; 

    String signatureBaseString1 = method; 
    String signatureBaseString2 = url; 

    List<NameValuePair> allParams = new ArrayList<NameValuePair>(); 
    allParams.add(new NameValuePair("oauth_consumer_key", oAuthConsumerKey)); 
    allParams.add(new NameValuePair("oauth_nonce", oAuthNonce)); 
    allParams.add(new NameValuePair("oauth_signature_method", oAuthSignatureMethod)); 
    allParams.add(new NameValuePair("oauth_timestamp", oAuthTimestamp)); 
    allParams.add(new NameValuePair("oauth_token", oAuthAccessToken)); 
    allParams.add(new NameValuePair("oauth_version", oAuthVersion)); 
    allParams.addAll(urlParams); 

    Collections.sort(allParams, new NvpComparator()); 

    StringBuffer signatureBaseString3 = new StringBuffer(); 
    for(int i=0;i<allParams.size();i++) 
    { 
     NameValuePair nvp = allParams.get(i); 
     if (i>0) { 
      signatureBaseString3.append("&"); 
     } 
     signatureBaseString3.append(nvp.getName() + "=" + nvp.getValue()); 
    } 

    String signatureBaseStringTemplate = "%s&%s&%s"; 
    String signatureBaseString = String.format(signatureBaseStringTemplate, 
                   URLEncoder.encode(signatureBaseString1, "UTF-8"), 
                   URLEncoder.encode(signatureBaseString2, "UTF-8"), 
                   URLEncoder.encode(signatureBaseString3.toString(), "UTF-8")); 

    System.out.println("signatureBaseString: "+signatureBaseString); 

    String compositeKey = URLEncoder.encode(oAuthConsumerSecret, "UTF-8") + "&" + URLEncoder.encode(oAuthAccessTokenSecret, "UTF-8"); 

    String oAuthSignature = computeSignature(signatureBaseString, compositeKey); 
    System.out.println("oAuthSignature  : "+oAuthSignature); 

    String oAuthSignatureEncoded = URLEncoder.encode(oAuthSignature, "UTF-8"); 
    System.out.println("oAuthSignatureEncoded: "+oAuthSignatureEncoded); 

    String authorizationHeaderValueTempl = "OAuth oauth_consumer_key=\"%s\", oauth_nonce=\"%s\", oauth_signature=\"%s\", oauth_signature_method=\"%s\", oauth_timestamp=\"%s\", oauth_token=\"%s\", oauth_version=\"%s\""; 

    String authorizationHeaderValue = String.format(authorizationHeaderValueTempl, 
                 oAuthConsumerKey, 
                 oAuthNonce, 
                 oAuthSignatureEncoded, 
                 oAuthSignatureMethod, 
                 oAuthTimestamp, 
                 oAuthAccessToken, 
                 oAuthVersion); 
    System.out.println("authorizationHeaderValue: "+authorizationHeaderValue); 

    StringBuffer urlWithParams = new StringBuffer(url); 
    for(int i=0;i<urlParams.size();i++) { 
     if(i==0) 
     { 
      urlWithParams.append("?"); 
     } 
     else 
     { 
      urlWithParams.append("&"); 
     } 
     NameValuePair urlParam = urlParams.get(i); 
     urlWithParams.append(urlParam.getName() + "=" + urlParam.getValue()); 
    } 

    System.out.println("urlWithParams: "+urlWithParams.toString()); 
    System.out.println("authorizationHeaderValue:"+authorizationHeaderValue); 

    GetMethod getMethod = new GetMethod(urlWithParams.toString()); 
    getMethod.addRequestHeader("Authorization", authorizationHeaderValue); 

    HttpClient cli = new HttpClient(); 
    int status = cli.executeMethod(getMethod); 
    System.out.println("Status:"+status); 

    long responseContentLength = getMethod.getResponseContentLength(); 
    System.out.println("responseContentLength:"+responseContentLength); 

    String response = getMethod.getResponseBodyAsString(); 
    System.out.println("response: "+response); 
} 

private static String computeSignature(String baseString, String keyString) throws GeneralSecurityException, UnsupportedEncodingException, Exception 
{ 
    SecretKey secretKey = null; 

    byte[] keyBytes = keyString.getBytes(); 
    secretKey = new SecretKeySpec(keyBytes, "HmacSHA1"); 

    Mac mac = Mac.getInstance("HmacSHA1"); 

    mac.init(secretKey); 

    byte[] text = baseString.getBytes(); 

    return new String(Base64.encodeBase64(mac.doFinal(text))).trim(); 
} 

private String time() { 
    long millis = System.currentTimeMillis(); 
    long secs = millis/1000; 
    return String.valueOf(secs); 
} 

凡NvpComparator是:

public class NvpComparator implements Comparator<NameValuePair> { 

public int compare(NameValuePair arg0, NameValuePair arg1) { 
    String name0 = arg0.getName(); 
    String name1 = arg1.getName(); 
    return name0.compareTo(name1); 
} 

}

6

這對於時間軸做工精良用新的Twitter的API 1.1

1)下載twitter4j核-3.0.3。罐子在http://twitter4j.org/en/ 2)嘗試使用此代碼:

private static final String TWITTER_CONSUMER_KEY = "xxxxxxxxxxxxxxxxxx"; 
private static final String TWITTER_SECRET_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
private static final String TWITTER_ACCESS_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxx"; 
private static final String TWITTER_ACCESS_TOKEN_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxx"; 

ConfigurationBuilder cb = new ConfigurationBuilder(); 
cb.setDebugEnabled(true) 
    .setOAuthConsumerKey(TWITTER_CONSUMER_KEY) 
    .setOAuthConsumerSecret(TWITTER_SECRET_KEY) 
    .setOAuthAccessToken(TWITTER_ACCESS_TOKEN) 
    .setOAuthAccessTokenSecret(TWITTER_ACCESS_TOKEN_SECRET); 
TwitterFactory tf = new TwitterFactory(cb.build()); 
Twitter twitter = tf.getInstance(); 
try { 
    Query query = new Query("MrEdPanama"); 
    QueryResult result; 
    do { 
     result = twitter.search(query); 
     List<Status> tweets = result.getTweets(); 
     for (Status tweet : tweets) { 
      System.out.println("@" + tweet.getUser().getScreenName() + " - " + tweet.getText()); 
     } 
    } while ((query = result.nextQuery()) != null); 
    System.exit(0); 
} catch (TwitterException te) { 
    te.printStackTrace(); 
    System.out.println("Failed to search tweets: " + te.getMessage()); 
    System.exit(-1); 
} 
0

這裏使用twitter4j LIB

  Twitter twitter = new TwitterFactory().getInstance(); 

      AccessToken accessToken = new AccessToken(accessTokenStr, accessTokenSecretStr); 
      twitter.setOAuthConsumer(consumerKeyStr, consumerSecretStr); 
      twitter.setOAuthAccessToken(accessToken); 

      try { 
       Query query = new Query("#<HASHTAG TO SEARCH>"); 
       QueryResult result; 
       result = twitter.search(query); 
       List<Status> tweets = result.getTweets(); 
       for (Status tweet : tweets) { 
        System.out.println("@" + tweet.getUser().getScreenName() + " - " + tweet.getText()); 
       } 
      } 
      catch (TwitterException te) { 
       te.printStackTrace(); 
       System.out.println("Failed to search tweets: " + te.getMessage()); 
       System.exit(-1); 
      }