You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Twitter4J获取用户时间线完整推文?含tweet_mode=extended用法

解决Twitter4J获取用户时间线完整推文(tweet_mode=extended)的问题

我明白你现在卡在哪了——用Twitter4J拉取用户时间线时,超过140字符的推文总是被截断,虽然知道要加tweet_mode=extended参数,但不知道怎么在Twitter4J里配置。别担心,我来一步步帮你搞定这个问题:

核心原理

Twitter API默认返回截断的短文本,要拿到完整内容必须在请求里带上tweet_mode=extended参数。在Twitter4J中,我们可以通过Paging对象的setParameter方法来设置这个参数,同时获取文本时要调用专门的方法,不能再用原来的getText()。

修改后的完整代码

下面是针对你的代码调整后的版本,我标注了关键修改点:

public static void main(String[] args) throws SQLException {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
      .setOAuthConsumerKey("aaa")
      .setOAuthConsumerSecret("aaa")
      .setOAuthAccessToken("aaa")
      .setOAuthAccessTokenSecret("aaa");
    TwitterFactory tf = new TwitterFactory(cb.build());
    Twitter twitter = tf.getInstance();
    int pageno = 1;
    String user = "indtravel";
    List<Status> statuses = new ArrayList<>(); // 补充泛型,避免未检查转换警告
    int no = 1; // 补充你代码里缺失的no变量定义

    while (true) {
        try {
            int size = statuses.size();
            Paging page = new Paging(pageno++, 100);
            // 关键修改1:添加tweet_mode=extended参数
            page.setParameter("tweet_mode", "extended");
            
            List<Status> pageStatuses = twitter.getUserTimeline(user, page);
            statuses.addAll(pageStatuses);
            System.out.println("***********************************************");
            System.out.println("Gathered " + pageStatuses.size() + " tweets");
            
            // 遍历当前页的推文
            for (Status status : pageStatuses) {
                System.out.println("["+(no++)+".] " +"Status id : "+status.getId());
                System.out.println("id user : "+status.getUser().getId());
                
                // 关键修改2:获取完整推文文本
                String fullText;
                if (status.isRetweet()) {
                    // 转推的完整内容在RetweetedStatus的ExtendedTweet中
                    fullText = status.getRetweetedStatus().getExtendedTweet().getFullText();
                } else {
                    // 普通推文优先取ExtendedTweet的FullText,旧推文回退到getText()
                    fullText = status.getExtendedTweet() != null ? status.getExtendedTweet().getFullText() : status.getText();
                }
                
                System.out.println("Length status : "+fullText.length());
                System.out.println("@" + status.getUser().getScreenName() +" . "+status.getCreatedAt()+ " : "+status.getUser().getName()+"--------"+fullText);
                System.out.println("url :"+status.getUser().getURL());
                System.out.println("Lang :"+status.getLang());
            }
            if (statuses.size() == size) break; // 没有新推文时退出循环
        } catch(TwitterException e) {
            e.printStackTrace();
            // 可以考虑加个重试逻辑,避免因API限流直接中断
        }
    }
    System.out.println("Total: "+statuses.size());
}

关键细节说明

  1. 参数设置:page.setParameter("tweet_mode", "extended")是让API返回完整推文的核心,没有这个参数,你永远拿不到超过140字符的内容。
  2. 文本获取逻辑:
    • 普通推文:要判断getExtendedTweet()是否为空(一些旧推文可能没有这个字段),不为空就用getFullText(),否则回退到getText()。
    • 转推:不能直接取当前status的ExtendedTweet,因为那只会拿到"RT @xxx: ..."的提示文本,完整内容在getRetweetedStatus().getExtendedTweet().getFullText()里。
  3. 代码优化:补充了泛型定义和缺失的变量,让代码更规范,减少编译器警告。

替代方案(如果Twitter4J受限)

要是后续遇到Twitter4J版本兼容或功能不足的问题,你可以直接调用Twitter官方的REST API v2:

  • 先通过用户名获取用户ID:GET https://api.twitter.com/2/users/by/username/{username}
  • 再拉取时间线:GET https://api.twitter.com/2/users/{user_id}/tweets,参数带max_results=100即可,v2版本默认返回完整文本,不需要额外参数。
  • 用Java的HTTP客户端(比如OkHttp、Apache HttpClient)发送请求,认证用Bearer Token或OAuth 1.0a就行,灵活性更高。

内容的提问来源于stack exchange,提问作者Dewot 9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:58:05