Подключение к потоковому API Twitter с треками с пробелами, используя Apache HttpClient и указатель для Oauth? - PullRequest
2 голосов
/ 09 ноября 2010

Ниже приведен код, который пытается подключиться к Twitter, используя дорожки с пробелом («вы будете»). Он использует Apache HttpClient и указатель oauth более или менее так же, как tweetstream4j . Я использую

  • указатель-ядро-1.2.1.1.jar
  • указатель-commonshttp4-1.2.1.1.jar
  • HttpClient-4.0.1.jar
  • httpcore-4.0.1.jar

Если я запускаю код, я получаю «401 несанкционированный» из Twitter. Если использовать дорожки без пробелов (например, «будет» вместо «вы будете»), он подключается и работает нормально (пока я заполняю ключ пользователя oauth и секрет, токен и секрет токена с допустимыми значениями).

Кто-нибудь замечает проблему? Я думаю, что это связано с кодировкой URL параметра track в теле POST, но я не уверен. Я копался в том, как работает указатель, пока мои глаза не кровоточат.

(Это связано с API потоковой передачи Twitter в Java с дорожками, которые имеют пробелы? ).

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.logging.Logger;

import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

public class TwitterSpaceTest {
private static Logger logger = Logger.getLogger(
    TwitterSpaceTest.class.getName());

private static final String API_PROTOCOL = "http";
private static final String API_DOMAIN = "stream.twitter.com";
private static final String API_URL = "1/";
private static final String FILTER_URL = API_URL + "statuses/filter.json";

public static void readFrom(HttpRequestBase requestMethod) throws IOException {
    DefaultHttpClient client = new DefaultHttpClient();
    HttpResponse response = client.execute(requestMethod);
    HttpEntity entity = response.getEntity();
    if (entity == null) throw new IOException("No entity");
    BufferedReader br = new BufferedReader(new InputStreamReader(
        entity.getContent(), "UTF-8"));
    while (true) {
       String line = br.readLine();
       if (line != null && !line.isEmpty()) {
       System.out.println(line);
       }
    }
}

public static HttpRequestBase getConnection()
    throws OAuthMessageSignerException,
    OAuthExpectationFailedException, OAuthCommunicationException,
    IllegalStateException, IOException {
    String base = FILTER_URL;
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    // No spaces
//        params.add(new BasicNameValuePair("track", "will"));
    // Spaces
    params.add(new BasicNameValuePair("track", "you will"));

    HttpPost method = new HttpPost(API_PROTOCOL + "://" + API_DOMAIN + "/"
        + base);
    logger.info("" + method.getURI());

    UrlEncodedFormEntity postEntity = new UrlEncodedFormEntity(params,
        HTTP.UTF_8);
    method.setEntity(postEntity);

    String consumerKey = "...";
    String consumerSecret = "..."
    CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(
        consumerKey, consumerSecret);
    String token = "...";
    String tokenSecret = "...";
    consumer.setTokenWithSecret(token, tokenSecret);
    consumer.sign(method);

    return method;
}

public static void main(String[] args) throws Exception {
    readFrom(getConnection());
}
}

1 Ответ

1 голос
/ 18 февраля 2016

Вы должны изменить http на https в ссылке API

...