Go to content

Show Tweets with HST and Twitter4J

Published on

My five latest Tweets used show up on my site. In this blog I’ll explain how you can add such a block to your HST site.

For the Twitter component I have used Twitter4J to retrieve my latest tweets. The first step is to add its dependency to your CMS pom:

<dependency>
  <groupId>org.twitter4j</groupId>
  <artifactId>twitter4j-core</artifactId>
  <version>[2.1,)</version>
</dependency>

Then create your TwitterComponent that extends org.hippoecm.hst.component.support.bean.BaseHstComponent. In your TwitterComponent add a doBeforeRender method that will fetch your latest updates. The quick (and a bit dirty) way is to authenticate using a Twitter username and password. Twitter4J also supports using oAuth which you may prefer over storing your Twitter credentials.

First get a Twitter instance with your credentials (wil be deprecated see update at the end of this article):

Twitter twitter = new TwitterFactory().getInstance([username], [password]);

Then get your Tweets and ReTweets. Twitter does not return a combined list of Tweets and ReTweets because of backwards compatibility so you’ll have to combine them yourself. You probably want to show the newest first so you’ll have to use a descending sort order based on the ID of the Status.

try {
    List<Status> statuses = twitter.getUserTimeline();
    List<Status> retweets = twitter.getRetweetedByMe();
    statuses.addAll(retweets);
    Set<Status> allStatuses = new TreeSet<>(Collections.reverseOrder());
    allStatuses.addAll(statuses);
    allStatuses.addAll(retweets);
    if (!allStatuses.isEmpty()) {
        request.setAttribute("statuses", allStatuses);
    }
} catch (TwitterException e) {
    log.warn("Error getting Twitter status updates", e);
}

To display the 5 newest (Re)Tweets, use this in your JSP (don’t forget to add the taglibs):

<ul>
  <c:forEach items="${statuses}" var="status" 
             begin="0" end="4">
    <li>
      <c:choose>
        <c:when test="${status.retweet}">
          RT ${status.retweetedStatus.user.screenName}: ${status.retweetedStatus.text}<br />
          Retweeted at
          <a href="https://twitter.com/${status.retweetedStatus.user.screenName}/status/${status.retweetedStatus.id}" 
             rel="external noopener noreferrer">
          <fmt:formatDate value="${status.createdAt}" 
                          pattern="d MMM H:mm"/></a>
        </c:when>
        <c:otherwise>
          ${status.text}<br />
          <a href="https://twitter.com/${status.user.screenName}/status/${status.id}" 
             rel="external noopener noreferrer">
          <fmt:formatDate value="${status.createdAt}" 
                          pattern="d MMM H:mm"/></a>
        </c:otherwise>
      </c:choose>
    </li>
  </c:forEach>
</ul>

Note: Twitter4J does not have a caching mechanism yet (July 2010). Twitter allows you to do 150 API calls per hour (excluding posting updates). If you exceed that limit, it will return a 400 (bad request) instead of your latest (Re)Tweets.

Update about authentication (22-07-2010)

I totally overlooked the warning by Twitter that the basic authentication is going to be shut down from August 16 in favour of oAuth. If you need a quick & dirty way to generate your Autorization secrets, register your application (choose for Application Type client) and read this blog to generate your AccessToken. Then you can get a Twitter instance with:

AccessToken accessToken = new AccessToken([token],[tokenSecret]);
Twitter twitter= new TwitterFactory().getOAuthAuthorizedInstance([consumerKey], [consumerSecret], accessToken);