Executando verificação de segurança...
19
Arnon
3 min de leitura ·

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.

  1. 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.
  2. 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_='[email protected]')):
    posts = msg.text.replace('*', '').split('\r\n\r\n')
  • Observe que usei o getenv da biblioteca dotenv para acessar as variáveis de ambiente e não expor as senhas.
  1. 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".
  2. 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)
  1. 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.

3

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 😍

1
2

Fala William, obrigado pela pergunta!

O curso não está em etapa de produção final, está bem no início, então sugiro por enquanto não aguardar por ele para iniciar seus estudos 🤝

1
1

Que honra ter você aqui, mestre!!! 🫡

Agradeço pela autorização e fico feliz que tenha gostado da foto. 🤖

2

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!

2
1
1

Caramba, isso ficou muito bom. Agradeço muito por compartilhar!

Eu cheguei a usar o Gmail por um tempo. Um belo dia ele deixou de se conectar. Provavelmente deixei passar alguma configuração e o robô apenas retornava alguns erros e depois de muito quebrar a cabeça, achei que seria mais fácil usar outro provedor de e-mail.

Legal saber sobre a AWS, eu achava que turo era pago por lá. Vou me inteirar mais a respeito.

2

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!

1

Valeu Gustavo! A respeito das considerações:

  • Vou verificar o porquê das notícias estarem quebrando e ficando em tweets diferentes. A ideia é que sejam sequência do mesmo tweet;
  • Por replicar a notícia da Newsletter, ele sempre deixará igual. Se houver link na newsletter, acredito que haverá no tweet;
  • Eu deixei a divulgação da Newsletter no tweet fixado da conta, mas farei questão de tweetar, manualmente mesmo, algo sobre se inscrever na Newsletter. Farei de tempos em tempos para não ficar com cara de spam.
1
1

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.

1

Bacana! Fico feliz em ajudar.

Tem muita coisa pra ser feita ainda, minha dica é começar fazendo algo simples, isso vai te trazer motivação e inspiração pra algo maior.

1

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

1

O domínio eu registrei no Google Domains. Pago R$50/ano, mas há domínios que custam mais.

Não fiz nenhum tipo de registro de patente ou associação com CNPJ, é algo totalmente simples mesmo. Eu o utilizo apenas como portfolio mesmo.

1
1

Por cursar uma pós, eu vinculei minha conta de estudante lá e consegui uma conta Pro.

Mas tenho quase certeza de que o Workflow é free para repositórios públicos.

1

Eu adorei a ideia e eu como um frequente usuário do twitter só tinha estudado a criação de bots utilizando JS.

1

Eu pensei muito em JavaScript pois é a minha linguagem do dia-a-dia, mas optei pelo Python justamente pra entrar em um "terreno desconhecido" para mim.

1
1

Claro Deivid, ele se mantém online através da Action que eu criei.

Quando você olhar o código vai vir em .github/workflows/main.yml.
O cron aí presente é o responsável por fazer ele "acordar" todos os dias da semana ao mesmo horário.

1
1

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!

1

Também utilizo bastante o Twitter, porém mais como leitor.
Fico realmente feliz em ajudar a comunidade de alguma maneira.