Tuesday, June 12, 2012

Unseguidores en Twitter con R y Rook

(Antes de que alguien salga a comentar que "unseguidores" no es una palabra...bueno...es la mejor traduccion para "unfollowers", que al parecer tampoco es palabra -:( Pero en fin...no se que otra palabra se puede usar para representar lo que quiero...asi que...licencia poetica como le dicen).

En mi ultimo blog Te estoy siguiendo en Twitter...me estás siguiendo tu? Les mostre como usar los APIs de Twitter APIs para obtener una lista de las personas a las que sigues, pero que no te siguen de vuelta.

Ahora, queria extender la herramienta puesto que instale la libreria Rook en mi RStudio -:)

Asi que..que es Rook? Nada mas que un muy bonito servidor web para R...algo que realmente estaba extrañando en in R cuando lo comparaba con Ruby (Sinatra, Camping) y Python (Bottle, Flask).

La idea aqui es perdir un usuario de Twitter y luego proveer una lista con todas las "Malas Personas". Aqui esta el codigo fuente...

require("Rook")

Get_Twitter_Info<-function(p_source){
  web_page<-readLines(p_source)
  mypattern = '<id>([^<]*)</id>'
  datalines = grep(mypattern,web_page,value=TRUE)
  getexpr = function(s,g)substring(s,g,g+attr(g,'match.length')-1)
  g_list = gregexpr(mypattern,datalines)
  matches = mapply(getexpr,datalines,g_list)
  result = gsub(mypattern,'\\1',matches) 
  names(result) = NULL
  return(result)
}

Get_Screen_Name<-function(p_userid){
  user_url<-paste("https://api.twitter.com/1/users/lookup.xml?user_id=",
                      p_userid,"&include_entities=false")
  web_page<-readLines(user_url)
  mypattern = '<screen_name>([^<]*)</screen_name>'
  datalines = grep(mypattern,web_page,value=TRUE)
  getexpr = function(s,g)substring(s,g,g+attr(g,'match.length')-1)
  g_list = gregexpr(mypattern,datalines)
  matches = mapply(getexpr,datalines,g_list)
  screen_name = gsub(mypattern,'\\1',matches)
  names(screen_name) = NULL
  return(screen_name)
}

trim <- function(x){
  x<-gsub(' ','',x)
  return(x)
} 

newapp<-function(env){
  req<-Rook::Request$new(env)
  res<-Rook::Response$new()
  res$write('<form method="POST">\n')
  res$write('Enter your Twitter username: <input type="text" name="UserName">\n')
  res$write('<input type="submit" name="Get Bad People!">')
  res$write('</form>')

  People_Id<-""
  Bad_People<-c()
  Bad_Names<-c()
  j<-0  
  
  if (!is.null(req$POST())) {
    UserName = req$POST()[["UserName"]]
    
    followers_link<-paste("https://api.twitter.com/1/followers/ids.xml?cursor=-1&screen_name=",UserName)
    following_link<-paste("https://api.twitter.com/1/friends/ids.xml?cursor=-1&screen_name=",UserName)
    followers_link<-trim(followers_link)
    following_link<-trim(following_link)    
    followers<-Get_Twitter_Info(followers_link)
    following<-Get_Twitter_Info(following_link)
        
    for(i in 1:length(following)) {
      j<-j+1
      if(j>=100){
        j<-0
        People_Id<-substring(People_Id,2)
        Bad_People<-Get_Screen_Name(People_Id)
        Bad_Names<-append(Bad_Names,Bad_People)
        People_Id<-""
      }
      Match<-following[i] %in% followers
      if(Match == TRUE){
      }
      else{
        following[i]<-trim(following[i])
        People_Id<-paste(People_Id,following[i],sep=",")
      }
    }    
  }
  for(i in 1:length(Bad_Names)) {
    res$write(paste(' ',Bad_Names[i],sep=' '))
    res$write('<BR>')
  }
  res$finish()
}

server = Rhttpd$new()
server$add(app = newapp, name = "Twitter_Rook")
server$start()
server$browse("Twitter_Rook")

Cuando ejecutamos el codigo, el browser se abrira automaticamente mostrandonos la aplicacion.



Para se mi primer uso de Rook, pienso que he hecho un muy buen trabajo -:)...y espero que la gente que no me sigue de vuelta...comience a hacerlo -:P

Saludos,

Blag.


No comments: