Невозможно авторизоваться в вызове API API Java API. Ошибка 215 - PullRequest
0 голосов
/ 04 ноября 2019

Я бы хотел использовать 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."}]}

...