
Então vem com a gente construir rapidamente uma interface de linha de comando com Ruby para controlar o seu Twitter e aprenda mais sobre essa linguagem incrível de programação, sobre estruturas de projetos e sobre API’s.
O que vamos construir (aprenda na prática)
Vamos criar uma interface de linha de comando para realizar as seguintes ações:
-
Pesquisar no Twitter por texto e hashtag
-
Ver as informações do nosso próprio profile + Lista de tweets
-
Ver as informações de outros usuários + Lista de tweets
-
Tweetar (esse será um desafio)
Essa interface será criada utilizando Ruby puro, então alguns conceitos de organização de projeto, reutilização de código entre outros detalhes da linguagem também serão abordados no tutorial.
Vejo a baixo um GIF do projeto pronto:
Depois de finalizarmos o projeto eu deixarei um desafio para você fixar tudo o que foi aprendido, então bora subir de level programador o/
Ferramentas utilizadas
-
a) Ruby
-
b) twitter gem
- c) colorize gem
Vamos aos códigos (passo a passo)
Vamos iniciar criando a estrutura básica de arquivos do nosso APP.
1 2 3 4 5 |
mkdir config mkdir helpers mkdir commands touch Gemfile touch twitter_console.rb |
2 – Agora adicione ao seu Gemfile as libs que vamos precisar:
1 2 3 |
source :rubygems gem 'twitter' gem 'colorize' |
3 – Instale as gems rodando:
1 |
bundle install |
Criando a estrutura de interação com o usuário
Primeiro vamos preparar uma versão preliminar do nosso console e depois vamos preparar um helper (printc) para facilitar na hora de imprimir mensagens personalizadas no console e um outro helper (menu) que vai nos ajudar a pegar as opções desejada pelo usuário.
1 – Coloque o seguinte código em twitter_console.rb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
require 'readline' Dir["./helpers/*.rb"].each {|file| require file } Dir["./commands/**/*.rb"].each {|file| require file } Dir["./config/*.rb"].each {|file| require file } puts `clear` while true puts "O que você desaja fazer?" puts "0) Tweetar" puts "1) Ver o meu perfil" puts "2) Ver o perfil de outro usuário" puts "3) Pesquisar" puts "4) Ajuda" puts "5) Sair" option = Readline.readline("►► ") options = [:new_tweet, :profile, :other_profile, :search, :help, :exit] command = options[option.to_i] case command when :other_profile puts "\n\n ver outro perfil\n\n" when :profile puts "\n\ ver o próprio perfil\n\n" when :search puts "\n\n pesquisa \n\n" when :help puts "\n\n lista de comandos \n\n" when :new_tweet puts "\n\n novo tweet \n\n" when :exit break end end |
2 – Agora crie o helper printc rodando o seguinte comando no console:
1 |
touch helpers/printc.rb |
3 – Coloque no arquivo gerado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
require 'colorize' class Printc def self.title(msg, color, sleep_time=0, clear=false) puts `clear` if clear puts "—" * 100 puts "● #{msg}".colorize(color) puts "—" * 100 sleep(sleep_time) end def self.pair(title, result, color_title=:white, color_result=:white, sleep_time=0) print "● #{title}".colorize(color_title) puts " #{result}".colorize(color_result) sleep(sleep_time) end end |
4 – Agora crie o helper menu rodando o seguinte comando no console:
1 |
touch helpers/menu.rb |
5 – Coloque no arquivo gerado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
require 'readline' def menu(title, options, sleet_time=1,clear=false) option = nil while true Printc.title "#{title} ◼◼◼ ➤ OneBitCode.com/ruby_twitter", :green, sleet_time, clear options.each_with_index do |(key,value),i| puts "#{i}) #{key}" end option = Readline.readline("►► ") if option !~ /\D/ and option.to_i.between?(0, options.count - 1) break else Printc.pair("Aviso:", 'Opção inválida', :yellow, :white, sleet_time) end end options.values[option.to_i] end |
6 – Inclua as novas features no console atualizando o arquivo twitter_console.rb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
Dir["./helpers/*.rb"].each {|file| require file } Dir["./commands/**/*.rb"].each {|file| require file } Dir["./config/*.rb"].each {|file| require file } puts `clear` while true command = menu( "O que você deseja fazer?", { "Tweetar": :new_tweet, "Ver o meu perfil": :profile, "Ver o perfil de outro usuário": :other_profile, "Pesquisar": :search, "Ajuda": :help, "Sair": :exit } ) case command when :other_profile puts "\n\n ver outro perfil\n\n" when :profile puts "\n\ ver o próprio perfil\n\n" when :search puts "\n\n pesquisa \n\n" when :help puts "\n\n lista de comandos \n\n" when :new_tweet puts "\n\n novo tweet \n\n" when :exit break end end |
Gerando os comandos e melhorando o console
Agora vamos preparar os arquivos que posteriormente vão executar os comandos do usuário (seja fazer uma pesquisa, ver o perfil de um usuário, postar um novo tweet e etc)
1 – Rode no console os seguintes comandos:
1 2 3 4 5 |
touch commands/help.rb touch commands/profile.rb touch commands/other_profile.rb touch commands/search.rb touch commands/new_tweet.rb |
2 – No comando help.rb coloque (comando de ajuda ao usuário):
1 2 3 4 |
module TweetConsole def self.help end end |
2 – No comando profile.rb coloque (comando para ver o próprio profile):
1 2 3 4 |
module TweetConsole def self.profile end end |
3 – No comando other_profile.rb coloque (comando para ver o profile de outro usuário):
1 2 3 4 |
module TweetConsole def self.other_profile end end |
4 – No comando search.rb coloque (comando para pesquisar no twitter):
1 2 3 4 |
module TweetConsole def self.search end end |
5 – No comando new_tweet.rb coloque (comando para criar um novo tweet):
1 2 3 4 |
module TweetConsole def self.new_tweet end end |
6 – Para incluir os comandos no console atualize o twitter_console.rb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
Dir["./helpers/*.rb"].each {|file| require file } Dir["./commands/**/*.rb"].each {|file| require file } Dir["./config/*.rb"].each {|file| require file } puts `clear` while true command = menu( "O que você deseja fazer?", { "Tweetar": :new_tweet, "Ver o meu perfil": :profile, "Ver o perfil de outro usuário": :other_profile, "Pesquisar": :search, "Ajuda": :help, "Sair": :exit } ) case command when :new_tweet puts 'Essa é uma missão para você programador' when :profile TweetConsole::profile() when :other_profile TweetConsole::other_profile() when :search TweetConsole::search() when :help TweetConsole::help() when :exit Printc.title "Obrigado por estar com o OneBitCode.com, Até a próxima ❤", :yellow, 2, true break end end |
7 – Para melhorar a usabilidade adicionando uma mensagem de “até logo” quando o usuário pressionar o ctrl + c atualize o twitter_console.rb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Dir["./helpers/*.rb"].each {|file| require file } Dir["./commands/**/*.rb"].each {|file| require file } Dir["./config/*.rb"].each {|file| require file } puts `clear` begin while true command = menu( "O que você deseja fazer?", { "Tweetar": :new_tweet, "Ver o meu perfil": :profile, "Ver o perfil de outro usuário": :other_profile, "Pesquisar": :search, "Ajuda": :help, "Sair": :exit } ) case command when :new_tweet puts 'Essa é uma missão para você programador' when :profile TweetConsole::profile() when :other_profile TweetConsole::other_profile() when :search TweetConsole::search() when :help TweetConsole::help() when :exit Printc.title "Obrigado por estar com o OneBitCode.com, Até a próxima ❤", :yellow, 2, true break end end rescue Interrupt => e Printc.title "Obrigado por estar com o OneBitCode.com, Até a próxima ❤", :yellow, 2, true end |
Autenticação no twitter
Nessa parte nós vamos pegar as credenciais necessárias para usar a API do twitter e vamos adicioná-las na nossa aplicação.
1 – Visite a página https://developer.twitter.com/apps (você precisa ter uma conta no twitter)
2 – Clique em create an app (ele vai solicitar que você crie uma conta de desenvolvedor, é bem simples, basta seguir o passo a passo que a aprovação será imediata)
3 – Agora com a conta criada clique novamente em create an app, basta preencher os campos obrigatórios e clicar para finalizar.
4 – Agora clique em keys and tokens como na imagem a a baixo.
5 – Peça para ele criar as chaves de Access token & access token secret.
6 – Crie um arquivo no seguinte path (config/auth_client.rb) e coloque as credenciais nele:
1 2 3 4 5 6 7 8 9 10 |
require "twitter" def auth_client Twitter::REST::Client.new do |config| config.consumer_key = <Sua consumer_key> config.consumer_secret = <Sua consumer_secret> config.access_token = <Sua access_token> config.access_token_secret = <Sua access_token_secret> end end |
Criando o comando de Ajuda
Esse comando serve para informar ao usuários quais os comandos disponíveis e como utilizá-los.
1 – Atualize o arquivo commands/help.rb colocando:
1 2 3 4 5 6 7 8 9 |
module TweetConsole def self.help Printc.title "Lista de comandos", :green, 1, true Printc.pair('Tweetar', 'Criação de um novo Tweet (desafio 1)', :yellow, :white, 0.1) Printc.pair('Ver o meu perfil', 'Suas informações e tweets', :yellow, :white, 0.1) Printc.pair('Ver o perfil de outro usuário', 'Informações e tweets de outros usuários', :yellow, :white, 0.1) Printc.pair('Pesquisar', 'Pesquisa por texto e hashtag', :yellow, :white, 0.1) end end |
Obs: Teste no console o uso dele 🙂
Criando o comando de Pesquisa
Esse comando serve para realizar pesquisas no Twitter, seja por um string normal ou por hashtag.
1 – Atualize o arquivo commands/search.rb colocando:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
require 'readline' module TweetConsole def self.search while true Printc.title 'Qual o termo que você quer pesquisar?', :green, 1, true option = Readline.readline("►► ") tweets = auth_client.search("#{option} -rt", count: 10, tweet_mode: 'extended', result_type: "recent").take(10) tweets.each do |t| puts "" Printc.pair("Texto", t.attrs[:full_text], :yellow, :white, 0.1) Printc.pair("Usuário", t.user.name, :yellow, :white, 0.1) Printc.pair("Numero de retweets", t.retweet_count, :yellow, :white, 0.1) puts "" end option = menu( "O que prefere?", { "Realizar outra pesquisa": :search, "Voltar ao menu": :exit, } ) break if option == :exit end end end |
Obs: Teste no console o uso dele 🙂
Criando o comando Profile + refatoração + Lista de tweets
Vamos criar o comando profile que é responsável por baixar as informações atuais do usuário logado e também vamos criar um sub comando que vai mostrar os tweets dele.
1 – Atualize o arquivo commands/profile.rb colocando:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
require 'readline' module TweetConsole def self.profile while true user = auth_client.user Printc.title user.name, :green, 1, true puts "" Printc.pair("Tweets:", user.tweets_count, :blue, :white, 0.1) Printc.pair("Seguidores:", user.followers_count, :blue, :white, 0.1) Printc.pair("Url do perfil:", user.url, :blue, :white, 0.1) Printc.pair("Descrição:", user.description, :blue, :white, 0.1) if user.description.empty? Printc.pair("Email:", user.email, :blue, :white, 0.1) if user.email.empty? Printc.pair("Idioma:", user.lang, :blue, :white, 0.1) if user.lang.empty? Printc.pair("Foto de perfil:", user.profile_image_url, :blue, :white, 0.1) if user.profile_image_url.empty? Printc.pair("Criação da conta:", user.created_at, :blue, :white, 0.1) Printc.pair("Ultimo Tweet:", user.status.text, :blue, :white, 4) if user.status puts "" option = menu( "O que prefere?", { "Voltar ao menu": :exit, "Ver seus tweets": :tweets } ) if option == :exit break end end end end |
2 – Crie a seguinte pasta para encapsularmos lógica em arquivos compartilhados.
1 |
mkdir commands/shared |
3 – Crie o arquivo a baixo para isolarmos a parte que exibe as informações do usuário.
1 |
touch commands/shared/user_info.rb |
4 – Coloque no arquivo criado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
require 'readline' module TweetConsole def self.user_info user Printc.title user.name, :green, 1, true puts "" Printc.pair("Tweets:", user.tweets_count, :blue, :white, 0.1) Printc.pair("Seguidores:", user.followers_count, :blue, :white, 0.1) Printc.pair("Url do perfil:", user.url, :blue, :white, 0.1) Printc.pair("Descrição:", user.description, :blue, :white, 0.1) if user.description.empty? Printc.pair("Email:", user.email, :blue, :white, 0.1) if user.email.empty? Printc.pair("Idioma:", user.lang, :blue, :white, 0.1) if user.lang.empty? Printc.pair("Foto de perfil:", user.profile_image_url, :blue, :white, 0.1) if user.profile_image_url.empty? Printc.pair("Criação da conta:", user.created_at, :blue, :white, 0.1) Printc.pair("Ultimo Tweet:", user.status.text, :blue, :white, 4) if user.status puts "" end end |
5 – Inclua a melhoria no profile.rb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
require 'readline' module TweetConsole def self.profile while true user = auth_client.user TweetConsole::user_info(user) option = menu( "O que prefere?", { "Voltar ao menu": :exit, "Ver seus tweets": :tweets } ) if option == :exit break end end end end |
6 – Agora vamos criar um sub comando que lista os tweets do usuário:
1 |
touch commands/shared/tweet_list.rb |
7 – Coloque no arquivo gerado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
require 'readline' module TweetConsole def self.list_tweets user_name=nil, is_me=false page = 1 while true if is_me tweets = auth_client.user_timeline(page: page, count: 5, tweet_mode: 'extended') else tweets = auth_client.user_timeline(user_name, page: page, count: 5, tweet_mode: 'extended') end tweets.each do |t| puts "" Printc.pair("Texto", t.attrs[:full_text], :yellow, :white, 0.1) Printc.pair("Numero de retweets", t.retweet_count, :yellow, :white, 0.1) puts "" end option = menu( "O que prefere?", { "Voltar ao menu": :exit, "Ver mais tweets?": :more_tweets } ) if option == :exit break elsif option == :more_tweets page += 1 end end end end |
8 – Inclua a melhoria no profile.rb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
require 'readline' module TweetConsole def self.profile while true user = auth_client.user TweetConsole::user_info(user) option = menu( "O que prefere?", { "Voltar ao menu": :exit, "Ver seus tweets": :tweets } ) if option == :tweets TweetConsole::list_tweets(nil, true) break elsif option == :exit break end end end end |
Criando o comando para ver outros profiles
Nesse comando vamos permitir que o usuário encontre outros usuários através do user_name reutilizando os códigos que criamos em shared
1 – No arquivo other_profile.rb coloque:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
require 'readline' module TweetConsole def self.other_profile while true Printc.title 'Qual usuário você gostaria?', :green, 1, true user_name = Readline.readline("►► ") u = auth_client.user(user_name) TweetConsole::user_info(u) option = menu( "O que prefere?", { "Voltar ao menu": :exit, "Pesquisar outro usuário": :other_user, "Ver os tweets do usuário": :tweets } ) if option == :tweets TweetConsole::list_tweets(user_name) break elsif option == :exit break end end end end |
Testando nosso Twitter console
Agora para finalizar, basta testarmos tudo o que criamos aqui, abrindo o console e enviando alguns comandos.
1 – Execute no seu console:
1 |
ruby twitter_console.rb |
2 – Agora envie os comandos que desejar e veja a mágica acontecendo o/
Links de apoio
-
Código completo do projeto: https://github.com/OneBitCodeBlog/ruby_twitter
-
Guia pra instalar o Ruby: https://onebitcode.com/rails-linux/
-
Curso completo de Ruby free: https://onebitcode.com/course/ruby-puro/
-
Gem de integração com o Twitter: https://github.com/sferik/twitter
- Gem para colorir as mensagens no console: vegas backpage women seeking men
Agora para que você possa fixar tudo que foi aprendido nesse tutorial coloque a mão na massa realizando o desafio a baixo:
Implemente o comando new_tweet para que o usuário consiga postar um novo Tweet pelo nosso console e depois cole o código desse comando nos comentários.
Conclusão
Nesse tutorial nós descobrimos como utilizar a API do twitter facilmente e também aprendemos mais sobre o Ruby e como organizar projetos com ele, então se você gostou clique positive dating quotes para compartilhar com seus amigos do Facebook (ou envie diretamente o artigo).

Não perca nenhum conteúdo
Receba nosso resumo semanal com os novos posts, cursos, talks e vagas o/
Primeira vez no OneBitCode? Curtiu esse conteúdo?
O OneBitCode tem muito mais para você!
O OneBitCode traz conteúdos de qualidade, e em português, sobre programação com foco em Ruby on Rails e também JavaScript.
Além disso, aqui sempre levamos à você conteúdos valiosos sobre a carreira de programação, dicas sobre currículos, portfólios, perfil profissional, soft skills, enfim, tudo o que você precisa saber para continuar evoluindo como Programador(a)!
Fique por dentro de todos os conteúdos o/
Nossas redes sociais:
📹 • https://youtube.com/Onebitcode [Live todas as terças-feiras às 19h)
💻 • https://linkedin.com/company/onebitcode
🙂 • https://facebook.com/onebitcode
📱 • https://instagram.com/one_bit_code
🐦 • https://twitter.com/onebitcode
Nossos cursos:
🥇 • Programador Full Stack Javascript em 8 Semanas
💎 • Curso Completo de Ruby
⚙ • Minicurso: API Rails 5 Completo
🐞 • Minicurso de Testes para Ruby on Rails com RSpec
Espero que curta nossos conteúdos e sempre que precisar de ajuda, fala com a gente!
Estamos aqui para você 🙂
Bem-vindo à família OneBitCode o/