Como eu criei um robô do Deschamps para colocar a newsletter no Twitter
Sou inscrito na Newsletter do Deschamps há pouco mais de um ano e sempre achei as notícias incríveis, mas por ser um ávido usuário leitor do Twitter, eu pensei: "E se as notícias diárias viessem parar aqui na rede social do passarinho?"
E decidi que faria em Python, pois seria um desafio mais bacana tendo em vista que sou Dev Frontend.
- O primeiro passo foi criar um e-mail para receber as newsletters. Inicialmente cogitei o Gmail por ser o mais tradicional, mas vi que algumas pessoas tiveram problemas com o excesso de segurança da Google, então optei pela Aol, pois teria menos empecilhos de segurança durante o acesso.
- Criei a conta e me cadastrei na newsletter.
- Descobri uma biblioteca chamada
imap_tools
que permitia que eu acessasse a conta, então fiz algo mais ou menos assim:
from imap_tools import AND, MailBox
# conexão ao e-mail
mailbox = MailBox(getenv('IMAP')).login(getenv('MAIL'), getenv('PASS'), initial_folder='INBOX')
# leitura da caixa de entrada
read_mail(mailbox) if mailbox.uids()
# leitura do html do email
# limpeza do asterisco usado para negrito
# transformação da notícia em itens de uma lista
posts = []
for msg in mailbox.fetch(AND(from_='newsletter@filipedeschamps.com.br')):
posts = msg.text.replace('*', '').split('\r\n\r\n')
- Observe que usei o
getenv
da bibliotecadotenv
para acessar as variáveis de ambiente e não expor as senhas.
- Na sequência criei uma conta no Twitter e fiz o cadastro na Developer Platform do Twitter.
- Foi preciso criar um "Development App" e um "Project".
- Descobri então que há uma biblioteca que ajuda muito chamada
tweepy
, ela faz praticamente tudo, desde a conexão até os tweets. Resumindo, ficou algo assim:
from tweepy import OAuthHandler, API
# conexão ao Twitter
auth = OAuthHandler(getenv('API_KEY'),
getenv('API_KEY_SECRET'))
auth.set_access_token(getenv('ACCESS_TOKEN'),
getenv('ACCESS_TOKEN_SECRET'))
api = API(auth)
# iteração pelos posts (aqui parametrizado como tweet_list)
# string dividida em lista de strings com máximo de 280 caracteres
for tweet in tweet_list:
each_tweet = wrap(tweet_decoded, 280, break_long_words=False)
post_tweet(api, each_tweet)
def post_tweet(api, each_tweet):
original_tweet = []
for i, chunk in zip(range(len(each_tweet)), each_tweet):
original_tweet.extend([chunk])
print([chunk])
if i == 0:
# básico para tweetar
original_tweet[i] = api.update_status(chunk)
else:
# usado para aninhar ao mesmo tweet
original_tweet[i] = api.update_status(chunk,
in_reply_to_status_id=original_tweet[i - 1].id,
auto_populate_reply_metadata=True)
# espera de 1 segundo para resposta ao mesmo tweet
sleep(1)
# espera de 10 minutos para outro tweet
sleep(600)
- Após pronto, excessivamente testado e corrigido quase 200 vezes, era o momento de automatizar tudo para poder chamá-lo de robô, então criei essa Action:
on:
- cron: "0 14 * * 1-5" # Aciona de segunda a sexta às 14:00 GMT
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: pip install -r requirements.txt
- name: Execute Python script # Run the app.py
env:
IMAP: ${{ secrets.IMAP }}
MAIL: ${{ secrets.MAIL }}
PASS: ${{ secrets.PASS }}
API_KEY: ${{ secrets.API_KEY }}
API_KEY_SECRET: ${{ secrets.API_KEY_SECRET }}
ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
ACCESS_TOKEN_SECRET: ${{ secrets.ACCESS_TOKEN_SECRET }}
BEARER_TOKEN: ${{ secrets.BEARER_TOKEN }}
run: python app.py
- Para as variáveis de ambiente (as senhas e chaves) serem lidas pelo Workflow do GitHub foi necessário adicioná-las em
settings/environments
no repositório.
Então, todos os dias da semana o robozinho "acorda", verifica o e-mail, separa o grande bloco de notícias em uma lista com uma notícia cada e vai tweetando-as (essa palavra existe?) a cada 10 minutos.
Procurei ser bem direto aqui e não exibi o código todo para que o post não ficasse tão grande, você pode acessar o código completo em Bot-Deschamps-Newsletter e acessar o perfil dele em @BotDeschamps. Para a imagem eu apenas copiei o cabelo do Deschamps e colei no emotion de robô. Eu diria que essa imagem expressa o meu amadorismo no campo do design.
Disclaimer: Esse projeto não tem autorização legal do Filipe Deschamps ou equipe. Caso eles me peçam para tirar do ar, eu o farei.
Estou participando pouco do TabNews por estar focado programando a plataforma do curso, mas acesso diariamente e sempre fico surpreso com as implementações das pessoas, sejam client
para o TabNews, ou agora esta implementação da Newsletter. É o sonho de toda pessoa que gosta de Open Source ver isso acontecendo. Parabéns pelo projeto!
Sobre o Disclaimer, você tem minha autorização 🤝
E adorei o ícone de perfil 😍
Muito massa! Parabéns! Fiz um também que publica no Slack, mantendo o time atualizado :)
Código fonte e instruções: https://github.com/alexandremendoncaalvaro/slackbot-newsletter-deschamps
Para ser mais fácil de usar, transformei em um pacote instalável via pip! :)
pip install slackbot-newsletter-deschamps
Outra coisa... onde vc disse:
Inicialmente cogitei o Gmail por ser o mais tradicional, mas vi que algumas pessoas tiveram problemas com o excesso de segurança da Google, então optei pela Aol, pois teria menos empecilhos de segurança durante o acesso.
Na verdade é bem mais fácil do que parece, e mais seguro usar o gmail mesmo.
Basta que configure a autenticação de 2 fatores e habilite o acesso por senha de aplicativo.
- https://support.google.com/accounts/answer/185833?hl=pt
Muito legal rodar como uma action do próprio Github, eu não tinha considerado isso! Mas confesso que na AWS também é bem tranquilo e também sem custo. Então tudo certo!
Parabéns Arnon, ficou muito massa! Já estou seguindo 😂👌
Percebi que o Bot por enquanto está quebrando as notícias em quantidade de caracteres, e por conta disso tem casos de uma notícia começar em um tweet e terminar em outro, ai fica um pouco estranho. (não to conseguindo subir um print)
Acho massa considerar algumas modificações que ficam a seu critério:
- A mesma notícia ser continuada como uma sequência do tweet (comentário)
- Adicionar links das fontes das notícias em cada post
- Deixar uma pequena divulgação da Newsletter em cada post, pode ser um comentário ou algo do tipo, incentivando a galera a se inscrever.
Essa última é bem discutível, pois a conta merece a atenção dela, só que pode captar mais TabNewers por lá kkkks, minha visão.
No mais, parabéns cara, gostei muito!
Muito inspirador o seu projeto. Parabéns pelo super empenho! Tô seguindo :D
Tooop Toop
eu não entendi muita coisa kk to comecando ainda, mas já gostei, quem sabe um dia eu faça um projeto inspirado no seu!
vlws por compartilhar.
Muito top mano! Sempre gostei da ideia de criar um BOT pro Twitter só me falta criatividade pra montar um BOT com uma ideia legal kkkkkkk
Uma dúvida minha, mas que não tem a ver com o BOT, eu vi que você tem um site https://arnon.dev/
Onde você comprou esse domínio e quanto você paga por ele?
Eu tenho um site também https://schulz.net.br/, mas ele é br, o seu é internacional né?
Se conseguir me responder eu agradeço, e outra coisa, você registrou alguma coisa do teu site, tipo patente, direitos autorais, algo desse genero? Queria entender como isso funciona, mas acho tão confuso kkkk
Muuto tooop! Tenho bastante interesse em criar um bot para o twitter também, poderia compartilhar cono faz pra ele se manter online?
Cara, eu uso bastante o twitter como ferramenta para informações do mundo tec/dev e ter as noticias do newsletter do deschamps la foi uma ideia GENIAL e que vai me ajudar bastante, muito obrigado!