gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:50:48 50 4
gpt4 key购买 nike

我一直在寻找一个使用 Twitter 1.1 API 的简单 Java 示例,但找不到。使用此处发布的 PHP 示例:Simplest PHP example for retrieving user_timeline with Twitter API version 1.1和其他一些 Stackoverflow 帖子,我能够想出以下工作示例。

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

我得到:

响应:{"errors":[{"message":"Could not authentication you","code":32}]}

知道哪里出了问题吗?

最佳答案

这对于使用新的 Twitter API 1.1 的时间线非常有效

1) 下载twitter4j-core-3.0.3.jar 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);
}

关于java - 使用 twitter API 版本 1.1 检索 user_timeline 的最简单 Java 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13387025/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com