Twitter4j 为 getCreatedAt 和 getCountry 变为空白或 null

Posted

技术标签:

【中文标题】Twitter4j 为 getCreatedAt 和 getCountry 变为空白或 null【英文标题】:Twitter4j getting blank or null for getCreatedAt and getCountry 【发布时间】:2021-09-06 08:30:18 【问题描述】:

我正在使用 Twitter4J 流式传输一些 Twitter 数据,并且能够生成推文文本。 推文由将文本保存到 Kafka 的 TwitterConsumer 类使用。 到目前为止,一切都按预期工作。 我的问题是我试图获取推文的位置(国家代码就足够了)的日期和时间。我了解该位置可能为空,但在我的情况下,日期/时间和位置始终为空或为空。我一定是做错了什么。

样本输出;

[Twitter4J 异步调度程序[0]] 信息 uom_bigdataAss1.producer.TwitterProducer - 创建于:[Thread-3] INFO uom_bigdataAss1.consumer.TwitterConsumer - 位置:无位置 [线程 3] 信息 uom_bigdataAss1.consumer.TwitterConsumer - 增量加

关注的变体。更具传染性,甚至可以逃脱疫苗。我们将继续了解更多关于…… [Thread-3] INFO uom_bigdataAss1.consumer.TwitterConsumer - 创建于:[Thread-3] INFO uom_bigdataAss1.consumer.TwitterConsumer - 用户:[Thread-3] INFO uom_bigdataAss1.consumer.TwitterConsumer - 用户名:[Thread-3] INFO uom_bigdataAss1.consumer.TwitterConsumer - _________________

这是我用来生成 Twitter 流媒体端的代码;


    public class TwitterProducer 
    
        final Logger logger = LoggerFactory.getLogger(TwitterProducer.class);       
        
        Thread twitterConsumerThread = null;
              
        //Queue for tweets
        private LinkedBlockingQueue<Status> queue;
        //stream of tweets
        private TwitterStream twitterStream;
            
        private BlockingQueue<String> msgQueue = new LinkedBlockingQueue<>(100);
    
        public static void main(String[] args) 
            new TwitterProducer().run();
        
       
        // Twitter Client
        public void setTwitterStream(BlockingQueue<String> msgQueue)
            /** Setting up a connection   */
            ConfigurationBuilder cb = new ConfigurationBuilder();
            cb.setDebugEnabled(true)
                    .setOAuthConsumerKey(TwitterConfig.CONSUMER_KEYS)
                    .setOAuthConsumerSecret(TwitterConfig.CONSUMER_SECRETS)
                    .setOAuthAccessToken(TwitterConfig.TOKEN)
                    .setOAuthAccessTokenSecret(TwitterConfig.SECRET);
    
            this.twitterStream = new TwitterStreamFactory(cb.build()).getInstance();
            
        
        
    
        private void run()
            logger.info("Setting up");
    
            // 1. Twitter Stream
            setTwitterStream(msgQueue);
            
            this.queue = new LinkedBlockingQueue<Status>();
    
            StatusListener listener = new StatusListener() 
                
                @Override
                public void onStatus(Status status)                
                    try 
                        queue.offer(status, 5000, TimeUnit.MILLISECONDS);
                        logger.info("Created on:", status.getCreatedAt().getTime());
                        Place place = status.getPlace();  
                        if (place != null ) 
                            logger.info("Created on:", place.getCountry());
                        
                     catch (InterruptedException e) 
                        // TODO Auto-generated catch block
                        logger.error("BlockinQueue Full", e);
                    
    
                
    
                @Override
                public void onDeletionNotice(StatusDeletionNotice sdn) 
                
    
                @Override
                public void onTrackLimitationNotice(int i) 
                
    
                @Override
                public void onScrubGeo(long l, long l1) 
                
    
                @Override
                public void onException(Exception e) 
                    e.printStackTrace();
                
    
                @Override
                public void onStallWarning(StallWarning warning) 
                
            ;
            
            twitterStream.addListener(listener);
                    
            FilterQuery query = new FilterQuery();
            String keywords[] = "covid", "vaccine";
            query.track(keywords);
            query.language("en");        
            twitterStream.filter(query);
    
            // Shutdown Hook
            Runtime.getRuntime().addShutdownHook(new Thread( () -> 
                logger.info("Application is now stopping!");
                twitterStream.shutdown();
                //logger.info("Closing Producer");
                //producer.close();
                logger.info("Closing twitterConsumer");
                this.twitterConsumerThread.interrupt();
                logger.info("Finished closing");
                logger.info("\n Application End");
            ));
            
            logger.info("Running Twitter Consumer");
            
            TwitterConsumer twitterConsumer = new TwitterConsumer(this.queue);
            this.twitterConsumerThread = new Thread(twitterConsumer);
            twitterConsumerThread.start();
            
        
    
    
    

    

任何想法可能发生/导致什么?

【问题讨论】:

【参考方案1】:

更改您的日志语句,如

logger.info("Created on: ", status.getCreatedAt().getTime()); 

logger.info("Created on: ", place.getCountry());

您缺少-占位符

经过上述更改,日志将类似于

Created on: 1624430231000
Created on: India

检查http://www.slf4j.org/manual.html#typical_usage

此外,并非所有状态都带有国家/地区信息。

【讨论】:

以上是关于Twitter4j 为 getCreatedAt 和 getCountry 变为空白或 null的主要内容,如果未能解决你的问题,请参考以下文章

如何在 twitter4j 中将 twitter ID 转换为用户名?或者我可以使用 id 来获取用户简介吗?

过滤 twitter4j 流

Twitter4j,我如何注销?

twitter4j.Status 是不是在每条推文上返回地理位置

使用 oauth 和 twitter4j 集成 Android Twitter

使用 twitter4J 登录 android 后关闭浏览器窗口