最简单的Java示例,使用twitter API 1.1版检索user_timeline

我正在寻找一个使用Twitter 1.1 API的简单Java示例,但找不到一个。 使用这里发布的PHP示例: 使用Twitter API 1.1版和一些其他Stackoverflowpost检索user_timeline的最简单的PHP示例 ,我能够提出以下工作示例。

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"; 

我明白了:

响应:{“错误”:[{“message”:“无法validation您”,“代码”:32}]}

知道这出错了吗?

这对于使用新的Twitter API 1.1的Timeline非常有用

1)在http://twitter4j.org/en/下载twitter4j-core-3.0.3.jar 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 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); } 

你错了oauth_nonce 。 它是在base 64中编码的随机32字节字符串。

您可以像这样构建它们:

 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); 这是一个用Base 64编码String的方法。

这是一个使用参数的Twitter 1.1 API示例。 这个问题与nonce无关。 这是signatureBaseString。 将signatureBaseString视为由&符号分隔的3部分字符串(METHOD&URL&PARAMS)。 api参数不包含在signatureBaseString的第二部分中,它们将在signatureBaseString的最后部分包含(其他6个安全性参数)(此外,这些参数必须按字母顺序排列)。

  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 urlParams = new ArrayList(); 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 allParams = new ArrayList(); 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;i0) { 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 

NvpComparator是:

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

}

这是我使用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("#"); QueryResult result; result = twitter.search(query); List 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); }