Javi Moreno Apuntes Fichas de Lectura Archivo Sobre mi

Plugin para publicar tweets por cada nuevo post

Ejemplo de plugin de jekyll para generar tweets al tiempo que se genera el blog. Con este plugin se puede llegar a automatizar la publicación de tweets al desplegar una nueva versión del blog.

Jekyll permite la creación de plugins para diferentes fines. El código que viene a continuación lo utilicé en este blog para automatizar la publicación de tweets anunciando que había publicado un nuevo post.

module Tweet

  class Generator < Jekyll::Generator

    def generate(site)

      if File.exists? ".tweets/tweets.info"
        File.open(".tweets/tweets.info", 'rb') {|f| @tweets = Marshal::load(f)}
      else
        @tweets = []
      end

      site.posts.docs.each { |post|
        if post.respond_to? :share_on_twitter 
          if post.share_on_twitter == true
            url = Jekyll.configuration({})['url']
            permalink = url + post.url 
            tweet_posted = @tweets.detect {|tweet| tweet["post"] == permalink }
            if !(tweet_posted)
              tweet = {"post" => permalink, "title" => post.title, "klink" => permalink, "tweet" => ""}
              @tweets << tweet
            end 
          end  
        end
      }

      File.open(".tweets/tweets.info", 'wb') {|f| f.write(Marshal.dump(@tweets)) }

    end

  end

end

En el fichero rakefile tenía un par de métodos encargados de la publicación y las credenciales de twitter.

twitter_consumer_key        = "YOUR_TWITTER_CONSUMER_KEY"
twitter_consumer_secret     = "YOUR_TWITTER_CONSUMER_SECRET"
twitter_access_token        = "YOUR_TWITTER_ACCESS_TOKEN"
twitter_access_token_secret = "YOUR_TWITTER_ACCESS_TOKEN_SECRET"

task :clean_tweet_list do

  if File.exists? ".tweets/tweets.info"
    File.open(".tweets/tweets.info", 'rb') {|f| @tweets = Marshal::load(f)}
  else
    @tweets = []
  end

  @tweets.each{ |tweet|
    if tweet["tweet"] == ""
      puts "Omitiendo tweet: " + tweet["title"]
      tweet["tweet"] = "Tweet omitido. Pruebas"
    end
  }

  File.open(".tweets/tweets.info", 'wb') {|f| f.write(Marshal.dump(@tweets)) }

end 

task :share_with_twitter do

  # Twitter config (for tweeting posts)
  client = Twitter::REST::Client.new do |config|
    config.consumer_key        = twitter_consumer_key
    config.consumer_secret     = twitter_consumer_secret
    config.access_token        = twitter_access_token
    config.access_token_secret = twitter_access_token_secret
  end

  if File.exists? ".tweets/tweets.info"
    File.open(".tweets/tweets.info", 'rb') {|f| @tweets = Marshal::load(f)}
  else
    @tweets = []
  end

  @tweets.each{ |tweet|
    if tweet["tweet"] == ""
      puts "Publicando tweet: " + tweet["title"]
      tweet_response = client.update("#{tweet["title"]} #{tweet["klink"]}")
      tweet["tweet"] = tweet_response
    end
  }

  File.open(".tweets/tweets.info", 'wb') {|f| f.write(Marshal.dump(@tweets)) }

end