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