Я бы хотел использовать API твиттера в Java, но не могу получить правильную авторизацию. Я не могу использовать twitter4j
, потому что он не включает мой запрос (Поиск мест с указанием названия города).
У меня уже есть создатель приложения для Twitter, и я попробовал позвонить из PostMan ион отлично работает, поэтому проблема не в отсутствии ключей.
public void getTweets(City request, StreamObserver<Tweet> responseObserver){
System.out.print("Inside ipInfo service searching for city: " + request.getCity());
//Create a 32B nonce code in a private method
String nonce = generateNonce();
System.out.print("NONCE = " + nonce + "\n");
//Create signature
OAuthConsumer consumer = new OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
OAuthAccessToken accessToken = new OAuthAccessToken(ACCESS_TOKEN, ACCESS_TOKEN_KEY);
SignedRequest threeLeggedOAuthRequest = SignedRequestFactory.create(consumer, accessToken);
String Url = "https://api.twitter.com/1.1/geo/search.json";
HttpMethod method = HttpMethod.GET;
Timestamp ts = new Timestamp(System.currentTimeMillis());
long timestamp = ts.getTime();
String signature = threeLeggedOAuthRequest.getSignature(Url, method, nonce, timestamp);
System.out.print("Signature = " + signature);
// Api call
String placesUrl = String.format("https://api.twitter.com/1.1/geo/search.json?query=%s", request.getCity());
HttpResponse<JsonNode> apiResponse = null;
try {
apiResponse = Unirest.get(placesUrl)
.header( "Authorization",
"OAuth oauth_consumer_key=\""+CONSUMER_KEY+"\"," +
"oauth_token=\""+ACCESS_TOKEN+"\"," +
"oauth_signature_method=\"HMAC-SHA1\"," +
"oauth_timestamp=\""+timestamp+"\"," +
"oauth_nonce=\""+nonce+"\"," +
"oauth_version=\"1.0\"," +
"oauth_signature=\""+signature+"\""
)
.header( "Accept", "*/*" )
.header( "Host", "api.twitter.com" )
.header( "Connection", "Keep-Alive" )
.asJson();
} catch (UnirestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.print("Api response = "+ apiResponse.getBody() + "\n");
}
private 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 = Base64.getEncoder().encodeToString(nonceBuilder.toString().getBytes());
return nonce;
}
Результат: Api response = {"errors":[{"code":215,"message":"Bad Authentication data."}]}