Javi Moreno Apuntes Fichas de Lectura Archivo Sobre mi
Blog Logo

Javi


4 minutos de lectura

Ultimamente estoy dedicando mi tiempo libre (cada día más escaso) a automatizar ciertas tareas que Octopress, por su naturaleza estática, no permite realizar. En este post explico como acabar con una de mis mayores frustraciones: poner un tweet automáticamente cada vez que publico un artículo usando Karmacracy como acortador.

A mi me gusta mucho Karmacracy. No es que tenga una especial fijación por controlar el número de clicks que se hacen a los enlaces que comparto pero si se trata de enlaces a este blog me gusta tener un "pequeño control" del número de clicks.

Hasta ahora lo que hacía era compartir mediante el botón de Karmacracy la entrada que acababa de publicar. Me ha estado funcionando muy bien todo este tiempo pero llevo dandole vueltas a una automatización del proceso de publicación y estar pendiente para darle a un botón no es lo más automático del mundo.

Empecé a estudiar otras posibilidades como IFTTT que automatizan la publicación de un tweet cuando detectan cambios en un rss. Eso habría estado fantástico si IFTTT permitiera configurar que "acortador" quieres usar pero los enlaces compartidos de esta manera ya están acortados por IFTTT... una pena.

Finalmente, después de dar muchas vueltas he decidido tirar por la via dura y crear una tarea en el rakefile de Octopress que se encargue de la publicación del tweet. Para no publicar un tweet por cada post cada vez que desplegaba el blog añado a un hash cada enlace que se ha publicado.

La primera versión de esta tarea es la siguiente:

desc "set permalinks, get the short url from karmacracy and share it with Twitter"
task :share_with_twitter do
  
  # Twitter config (for tweeting posts)
  client = Twitter::REST::Client.new do |config|
    config.consumer_key        = "TU_CONSUMER_KEY"
    config.consumer_secret     = "TU_CONSUMER_SECRET"
    config.access_token        = "TU_ACCESS_TOKEN"
    config.access_token_secret = "TU_ACCESS_TOKEN_SECRET"
  end

  if File.exists? "#{source_dir}/tweets.info"
    File.open("#{source_dir}/tweets.info", 'rb') {|f| @tweets = Marshal::load(f)}
    puts @tweets
  else
    @tweets = []
  end
  
  Dir.glob( "#{source_dir}/#{posts_dir}/**" ).each{ |post|
    
    tweet_posted = @tweets.detect {|tweet| tweet["post"] == post }
    
    if !(tweet_posted)

      #get frontmatter
      stream = File.open( post )
      frontmatter = YAML::load( stream )
      stream.close
      
      #get permalink
      post_time_frontmatter = Date._strptime(frontmatter["date"], '%Y-%m-%d %H:%M')
      post_time = Date.new(post_time_frontmatter[:year],post_time_frontmatter[:mon],post_time_frontmatter[:mday])
      post_title = frontmatter["title"]
      post_link = post.to_s.gsub(/\d{4}-\d{2}-\d{2}-/, "").gsub(".markdown", "").gsub("#{source_dir}/#{posts_dir}/", "")
      permalink = "#{blog_url}blog/#{post_time.strftime('%Y/%m/%d')}/#{post_title.to_url}/"
      
      #short permalink with karmacracy
      kcyshorter = "http://kcy.me/api/?u=TU_USUARIO_DE_KARMACRACY78&key=TU_KEY_DE_KARMACRACY&url=#{CGI.escape(permalink)}"
      result = Net::HTTP.get(URI.parse(kcyshorter))
      
      # Tweet
      tweet_response = client.update("He escrito \"#{post_title}\": #{result}")
      
      #
      tweet = {"post" => post, "title" => post_title, "klink" => result, "tweet" => tweet_response["uri"]}
      @tweets << tweet
    
    end
      
  }
  
  File.open("#{source_dir}/tweets.info", 'wb') {|f| f.write(Marshal.dump(@tweets)) }

end

Si queremos que esta tarea se ejecuta cada vez que desplegamos el blog, lo único que hay que hacer es incluir al final de la tarea :deploy lo siguiente:

Rake::Task[:share_with_twitter].execute

Y ya está, si todo ha funcionado perfectamente, al publicar esta entrada automáticamente se ha publicado también un tweet. ;-)