The recent switching off of Basic Auth by Twitter meant I had to rework some of the applications I have running at home. One of these application bridges Twitter to my local MQTT broker so that any DMs and mentions get published to two topics and also a topic that updates my status to what ever is posted.
The original version of the application just made basic http requests and parsed the XML responses, rather than just try and bolt on OAuth support I thought I would be better to start again and use one of the existing libraries that drive the Twitter APIs. There is a list of libraries for different languages http://dev.twitter.com/pages/libraries, I had a bit of a look at a couple of them and settled on Twitter4J.
In order to use OAuth you need to register your application with Twitter, you can do that here http://twitter.com/apps/new. Once registered you will get Consumer Key and a Consumer Secret. Because Twitter are using these keys to help to cut off spammers, keys need to be kept secret in order to prevent spammers knocking legitimate applications off-line, If you want to build the code attached here you will need to apply for your own key.
Before you can use a Twitter application you need to authorise it to act on your behalf, this is a 3 stage process.
- The application creates a URL based on it’s Consumer Key and Consumer Secret.
- The user follows the URL and signs into Twitter and is then asked if they want to allow the application to access on their behalf. If they allow the application then Twitter supplies a PIN.
- The user passes the PIN to the application which uses this to retrieve a Token, This Token is used to authenticate the application when ever it needs to act on the users behalf.

To do this with Twitter4J you need to do something like this:
Twitter twitter = new TwitterFactory().getInstance(); twitter.setOAuthConsumer(consumerKey, consumerSecret); try { RequestToken requestToken = twitter.getOAuthRequestToken(); AccessToken accessToken = null; BufferedReader reader = new BufferedReader( new InputStreamReader(System.in)); while (accessToken == null) { System.out.println(requestToken.getAuthorizationURL()); System.out.println("Please follow the URL above," + " enter the PIN provided and then press Enter"); String pin = ""; try { pin = reader.readLine(); } catch (IOException e) { e.printStackTrace(); } accessToken = twitter.getOAuthAccessToken(requestToken, pin); } String token = accesToken.getToken(); String secret = accesToken.getTokenSecret(); } catch (TwitterException e) { e.printStackTrace(); }
The token and the secret should be stored so the user doesn’t need to authorise the application each time it starts. Now the application is authorised you can post status updates and access the DM and Mention streams like this:
List<DirectMessage> dms = twitter.getDirectMessages(); List<Status> mentionsList = twitter.getMentions(); twitter.updateStatus(newStatus);
Now that I can access the updates I need to publish them to topics and listen for when a new status is published. There is a Java library for accessing an MQTT broker provided by IBM known as the IA92 package. This package provides both J2SE and J2ME versions of the libraries. To create a connection to the broker
IMqttClient client = null; try { client = MqttClient.createMqttClient("tcp://brocker.loc:1883" , null); client.connect(clientID, true, (short) 100); client.subscribe({"Twitter/send"}, {1}); client.registerSimpleHandler(new MqttSimpleCallback() { public void connectionLost() throws Exception { } public void publishArrived(String topic, byte[] payload, int qos, boolean retained) throws Exception { twitter.updateStatus(new String(payload)); } }); } catch (MqttException e) { e.printStackTrace(); }
Each client needs a unique id, or the older client will be kicked off when the new one collects, if you want to run multiple versions of the bridge then it may be a good idea to append the OAuth access token or the twtter screen name to the clientID.
Taking all that and knocking some of the rough edges off I have an app that will publish DMs on Twitter/<screenName>/dm & mentions on Twitter/<screenName>/mention and listens on Twitter/<screenName>/send for status updates to publish. There is a second app which subscribes to the mention and DM topics and forwards these messages on to the topic that sends SMS messages to my phone.
Next on the list of additions is a filter that will forward photos attached to tweets as MMS messages and probably some support for bridging search terms as well.
You can download my code from here, remember you will need your own Consumer Key and Consumer Secret to build it yourself, but there is a pre-built version with a valid key included.
Resources
- OAuth – http://oauth.net/
- MQTT – http://mqtt.org/
- IBM IA92 – http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006&loc=en_US&cs=utf-8&lang=en
- Twitter4j – http://twitter4j.org