I used this tutorial to search for tweets using twitter api 1.1 with OAuth Authentication
I have modified the code for my usability and it does not use twitter4j, which is good at the moment because OAuth search is not available in the RC build (I read it somewhere unable to find the location at the moment)
Also added getting twitter timeline
Code is in Groovy
TweetsHelper tweetsHelper = new TweetsHelper()
def bearerToken=tweetsHelper.requestBearerToken(TWITTER_AUTH_URL)
List<TweetsInfo> tweets=tweetsHelper.fetchTimelineTweet(bearerToken)
private final def TWITTER_HOST = "api.twitter.com"
private final def TWITTER_AUTH_URL = "https://api.twitter.com/oauth2/token"
private final def TWITTER_URL = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=INFAsupport&count=200"
private HttpsURLConnection getHTTPSConnection(String method,String endpointUrl){
HttpsURLConnection connection = null
URL url = new URL(endpointUrl)
connection = (HttpsURLConnection) url.openConnection()
connection.setDoOutput(true)
connection.setDoInput(true)
connection.setRequestMethod(method)
connection.setRequestProperty("Host", TWITTER_HOST)
connection.setRequestProperty("User-Agent", TWITTER_HANDLE)
connection.setUseCaches(false)
return connection
}
//Fetch Bearertoken for getting tweets
public String requestBearerToken(String endPointUrl) throws IOException {
String encodedCredentials = encodeKeys()
HttpsURLConnection connection = null
try {
connection = getHTTPSConnection("POST",endPointUrl)
connection.setRequestProperty("Authorization", "Basic " + encodedCredentials)
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
connection.setRequestProperty("Content-Length", "29")
connection.setUseCaches(false)
}
catch (MalformedURLException e) {
throw new IOException("Invalid endpoint URL specified.", e)
}
finally {
if (connection != null) {
connection.disconnect()
}
}
writeRequest(connection, "grant_type=client_credentials")
JsonSlurper js=new JsonSlurper()
def result=js.parseText(readResponse(connection))
String tokenType = result?.token_type
String token = result?.access_token
return ((tokenType.equals("bearer")) && (token != null)) ? token : ""
}
//Search tweets
public List<TweetsInfo> fetchQueriedTweets(def bearerToken) throws IOException {
HttpsURLConnection connection = null
def dataCleanser = new DataCleanser()
try {
connection = getHTTPSConnection("GET",TWITTER_URL)
connection.setRequestProperty("Authorization", "Bearer " + bearerToken)
}
catch (MalformedURLException e) {
throw new IOException("Invalid endpoint URL specified.", e)
}
finally {
if (connection != null) {
connection.disconnect()
}
}
List<TweetsInfo> tweets= new ArrayList<TweetsInfo>()
try{
JSONObject obj = (JSONObject)JSONValue.parse(readResponse(connection))
JSONArray objArray = (JSONArray)obj.get(TWEET_STATUSES)
if (objArray != null) {
for(int i=0;i<objArray.length();i++){
String text = dataCleanser.escapeQuotes(((JSONObject)objArray.get(i)).get(TWEET_TEXT).toString())
String createdAt = DateUtils.convertToUTC(parseTweetDate(((JSONObject)objArray.get(i)).get(TWEET_CREATED_AT).toString()))
String fromUser = ((JSONObject)objArray.get(i)).get(TWEET_USER).get(TWEET_NAME).toString()
String expandedURL = ((JSONObject)objArray.get(i)).get(TWEET_ENTITIES).get(TWEET_URLS).get(0).get(TWEET_EXPANDED_URL).toString()
TweetsInfo tweet=new TweetsInfo(text,fromUser,expandedURL,createdAt)
tweets.push(tweet)
}
}
}
catch(Exception e){
log.info "Exception in TweetsHelper $e"
}
return tweets
}
//Fetch Twitter timeline
public List<TweetsInfo> fetchTimelineTweet(def bearerToken) throws IOException {
HttpsURLConnection connection = null
List<TweetsInfo> tweets= new ArrayList<TweetsInfo>()
def dataCleanser = new DataCleanser()
try {
connection = getHTTPSConnection("GET",TWITTER_URL)
connection.setRequestProperty("Authorization", "Bearer " + bearerToken)
}
catch (MalformedURLException e) {
throw new IOException("Invalid endpoint URL specified.", e)
}
finally {
if (connection != null) {
connection.disconnect()
}
}
JsonSlurper js=new JsonSlurper()
try{
def result=js.parseText(readResponse(connection))
result?.each{tweet->
String text = tweet?.text
String createdAt = DateUtils.convertToUTC(parseTweetDate(tweet?.created_at))
String fromUser = tweet?.user?.name
String expandedURL = tweet?.entities?.urls[0]?.expanded_url
if(validTweetForAWeek(createdAt)){
TweetsInfo tweetinfo=new TweetsInfo(text,fromUser,expandedURL,createdAt)
tweets.push(tweetinfo)
}
}
}
catch(Exception e){
log.info "Exception in TweetsHelper $e"
}
return tweets
}
TweetsInfo
is a Pojo class with String text, String fromUser, String expandedURL, String createdAt
(this was my requirement)
Hope this helps :)