使用 Twitter4j (core/stream) 开发 Twitter 应用程序

最近帮助瑞典的一个师弟做毕业设计,领域是SIOT Social Internet of Things,主要就是研究如何将物联网和社交网络结合起来,完成一些有趣的事情。我们选择的题目是使用Ardiuno + Xively + Twitter完成设备状态通知和控制。具体说来,Xively收集Ardiuno采集的实时数据,我们的系统通过Xively提供的API接口读取,并根据预先设定的场景将系统状态更新发布到Twitter,另外,用户也可以通过在Twitter发布带有hashtag的推文来控制Xively写入相应数据。

这里,涉及到Twitter的发布和侦听功能,一方面,需要调用Twitter RESTful API来发布系统更新状态;另一方面,还需要侦听特定用户的特定推文,完成用户控制功能。为了开发方便,我使用了非官方版本的Twitter API JAR - Twitter4j http://twitter4j.org/en/index.html (需打开)

使用了两个该网站提供的JAR包(目前,4.0.3是最新的稳定版本)

  • Twitter4j-core-4.0.3.jar:主要用于认证和发布消息
  • Twitter4j-stream-4.0.3.jar:主要用于侦听用户推文

目前,Twitter使用Oauth方式进行APP认证,所有请求都必须使用Access Token来认证完成,因此,需要在Twitter Application管理页面中创建新的APP,生成ConsumerKey/ConsumerSecret和AccessKey/AccessSecret,这样,在使用Twitter4j设置这些值,就可以完成Twitter RESTful API调用。

具体代码如下:

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.setOAuthConsumerKey(consumerKey); // 设置consumerKey
configurationBuilder.setOAuthConsumerSecret(consumerSecret); // 设置consumerSecret
configurationBuilder.setJSONStoreEnabled(true);
Configuration configuration = configurationBuilder.build();
twitter = new TwitterFactory(configuration).getInstance();
TwitterStreamFactory tf = new TwitterStreamFactory(configuration); 
twitterStream = tf.getInstance();
accessToken = new AccessToken(accessKey, accessKeySecret); // 设置access token
System.out.println("AccessToken:" + accessToken);
twitter.setOAuthAccessToken(accessToken); // twitter实例用于发布推文
twitterStream.setOAuthAccessToken(accessToken); // twitterStream实例用于侦听用户推文


twitterStream.addListener(listener); // 这里加入了listener用于处理侦听推文
FilterQuery query = new FilterQuery();
query.follow(new long[] { userId }); // userId 是在Twitter App页面中的用户ID
twitterStream.filter(query);

上述代码中的listener定义如下:

StatusListener listener = new StatusListener() {

        @Override
        public void onException(Exception arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onDeletionNotice(StatusDeletionNotice arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onScrubGeo(long arg0, long arg1) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStallWarning(StallWarning arg0) {
            // TODO Auto-generated method stub

        }

        // 当有目标用户(根据userId过滤)发布推文时,调用该方法
        @Override
        public void onStatus(Status arg0) {
            String message = arg0.getText(); // 获取推文内容
            System.out.println("Received user tweets:" + message);      
        }

        @Override
        public void onTrackLimitationNotice(int arg0) {
            // TODO Auto-generated method stub

        }

    };

从而,我们可以是用twitter实例的updateStatus(String)方法来发布推文:

Status status = twitter.updateStatus(message);
System.out.println("Successfully updated the status to ["+ status.getText() + "].");

此外,有些注意事项:

  1. 通过程序发布的推文不允许重复,即内容完全一样,否则,会出现异常:

    TwitterException{exceptionCode=[2fc5b7cb-11613e08], statusCode=403, message=Status is a duplicate., code=187, retryAfter=-1, rateLimitStatus=null, version=4.0.1}
    
  2. twitter4j-core.jartwitter4j-stream 的版本必须兼容,否则,会出现 NoClassDefFoundException

  3. 网上很多博文都是说通过RequestToken来获取AccessToken, 方法如下:

    accessToken = twitter.getOAuthAccessToken(requestToken)
    

    但是,我在试验的时候,遇到以下错误:

    Exception in thread "main" 401:Authentication credentials (https://dev.twitter.com/pages/auth) were missing or incorrect. Ensure that you have set valid consumer key/secret, access token/secret, and the system clock is in sync.
    Invalid request token
    

    不知道是什么原因。

  4. 本文是做JAVA本地程序,不知在Android或者J2EE程序中是否会有不同(CALL_BACK_URL)。

你可能感兴趣的:(twitter,twitter4j)