Objective :
Using Open source Twitter API
How to collect data from Social media - Twitter about IOT.
Twitter account :
Create a new twitter account and just follow all the IOT
related groups.
So that you will get tweets from your circle and also
official company groups related to IOT.
Twitter
Application :
Twitter API can only
connect to twitter application. Only twitter application will get the twitter
message and serve to Twitter API. Our Java code
get the data through twitter application .
https://apps.twitter.com/app/new is used to create a new
twitter application.
|
Application User
Credentials to connect with java application
Once we created the twitter application we can get the
following user credentials.
Using the following URL
you get User credentials
URL : https://apps.twitter.com/app/<applicationId>/keys
Consumer
Key (API Key) : <API KEY>
Consumer
Secret (API Secret) : <API Password>
Access
Token : <ACCESS
TOKEN>
Access
Token Secret : <ACCESS
TOKEN SECRET>
|
All these values will be generated by Twitter it self. You
just need to use that values.
Note : For security purpose you can generate API
key whenever you like.
Java Application - Twitter API
|
In Java
code we are going to create a java application, which will use the generated
twitter credentials . It will gather all the text from twitter related to given
keyword like IOT. This java application
collect all the text from twitter and store it in a text file every one hour
once. So Every one hour there will be new text file which will be used to store
current twitter text related to IOT.
Create a maven project and add maven dependencies
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tamil</groupId>
<artifactId>DataCollection</artifactId>
<version>0.0.1</version>
<dependencies>
<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-stream</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-core</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-async</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-media-support</artifactId>
<version>4.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.tamil.TwitteFileWriter</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!--
bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
|
Maven assembly plugin to create a self executable jar file
pointing to TwitteFileWriter.java
Create a java class TwitteFileWriter.java in package com.tamil as mentioned in maven
pom.xml file.
TwitterFileWritter.java
package com.tamil;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import
java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import twitter4j.DirectMessage;
import twitter4j.FilterQuery;
import twitter4j.StallWarning;
import twitter4j.Status;
import
twitter4j.StatusDeletionNotice;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.User;
import twitter4j.UserList;
import
twitter4j.UserStreamListener;
import
twitter4j.conf.ConfigurationBuilder;
public class TwitteFileWriter {
private static StringBuffer buffer = new StringBuffer();
private static final UserStreamListener listener = new UserStreamListener() {
public void onException(Exception arg0) { }
public void onTrackLimitationNotice(int arg0) { }
public void onStatus(Status status) { writeTwtteFromStatus(status); }
public void onStallWarning(StallWarning arg0) { }
public void onScrubGeo(long arg0, long arg1) { }
public void
onDeletionNotice(StatusDeletionNotice arg0) { }
public void onUserProfileUpdate(User arg0) { }
public void onUserListUpdate(User arg0, UserList arg1) { }
public void onUserListUnsubscription(User arg0, User arg1, UserList arg2) { }
public void onUserListSubscription(User arg0, User arg1, UserList arg2) { }
public void onUserListMemberDeletion(User arg0, User arg1, UserList arg2) { }
public void onUserListMemberAddition(User arg0, User arg1, UserList arg2) { }
public void onUserListDeletion(User arg0, UserList arg1) { }
public void onUserListCreation(User arg0, UserList arg1) { }
public void onUnfollow(User arg0, User arg1) { }
public void onUnfavorite(User arg0, User arg1,Status arg2) {}
public void onUnblock(User arg0, User arg1) { }
public void onFriendList(long[] arg0) { }
public void onFollow(User arg0, User arg1) { }
public void onFavorite(User arg0, User arg1, Status arg2) {}
public void onDirectMessage(DirectMessage arg0) { }
public void onDeletionNotice(long arg0, long arg1) { }
public void onBlock(User arg0, User arg1) { }
};
private static final void writeTwtteFromStatus(Status status) {
String tweet = status.getUser().getScreenName() + "\t"
+
status.getUser().getDescription()
+ "\t"
+
status.getUser().getId()
+ "\t"
+
status.getUser().getLang()+
"\t"
+
status.getUser().getLocation()
+ "\t"
+
status.getUser().getName()
+ "\t"
+
status.getUser().getTimeZone()
+ "\t"
+
status.getText()+ "\t"
+
status.getSource()
+ "\t"
+
status.getCreatedAt();
buffer.append("\n" + tweet);
}
public static void main(String[] args) {
Timer timer = new Timer();
RemindTask task = new RemindTask();
String[] keywords = { "Internet Of Things", "InternetOfThings","internetofthings", "IOT", "iot" };
ConfigurationBuilder
conBuilder = new ConfigurationBuilder();
conBuilder.setOAuthConsumerKey(<API KEY>);
conBuilder.setOAuthConsumerSecret(<API Password>);
conBuilder.setOAuthAccessToken(<ACCESS TOKEN>);
conBuilder.setOAuthAccessTokenSecret(<ACCESS TOKEN SECRET> );
conBuilder.setJSONStoreEnabled(true);
conBuilder.setPrettyDebugEnabled(true);
// conBuilder.setHttpProxyHost("PROXY HOST");//
To Set Proxy server url [optional ]
// conBuilder.setHttpProxyPort(PROXY PORT); // To Set Proxy server port [optional ]
conBuilder.setIncludeEntitiesEnabled(true);
TwitterStream twitterStream = new TwitterStreamFactory(
conBuilder.build()).getInstance();
twitterStream.addListener(listener);
twitterStream.user();
FilterQuery query = new FilterQuery().track(keywords);
twitterStream.filter(query);
timer.schedule(task, 5 * 1000, 5 * 1000);
}
static class RemindTask extends TimerTask {
private SimpleDateFormat format = new SimpleDateFormat("yyyyMMMddHH");
private boolean flagToStop = false;
private long counter = 0;
private void checkStatusToStop() {
try {
File
newFile = new File("./Stop.txt");
if (newFile.exists()) {
flagToStop = true;
}
System.out.print(":" + counter);
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
if (!flagToStop) {
counter++;
writerFile();
buffer.setLength(0);
checkStatusToStop();
} else {
System.out.println("Going to End");
System.exit(0);
}
}
private void writerFile() {
try {
String
fileName = format.format(new Date());
File
newFile = new File("./" + fileName + ".txt");
if (!newFile.exists())
newFile.createNewFile();
if (newFile.exists()) {
FileWriter
writter = new FileWriter(newFile, true);
BufferedWriter
bufferWritter = new BufferedWriter(writter);
bufferWritter.write(buffer.toString());
bufferWritter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
|
Create Self executable jar file using maven build command
mvn clean compile install assembly:assembly
|
Now you can run the application using
java -jar DataCollection.jar
|
Application will generate txt file with the following format
<YYYY><MON><DD><HH>.txt file
Example :
2014Oct1913.txt
here year 2014 , Oct month 19th at 1 pm
generated file which contain twitter data collected between 1 pm to 2 am.