DEV Community

Cover image for Como eu criei um bot para o Twitter e coloquei para executar no Heroku
Thais Ribeiro
Thais Ribeiro

Posted on

Como eu criei um bot para o Twitter e coloquei para executar no Heroku

Oi gente linda, tudo beleza com vocês? Saindo um pouco do mundo de IA, hoje vou explicar como eu criei um bot simples, que lista as principais noticias, referentes à tecnologia, da internet e posta no Twitter.
O ThaisPosta, além de vir de um trocadilho com meu nome, quem me conhece sabe que isso é comum por aqui, surgiu na intenção de compartilhar todos os dias uma lista de links úteis para novos e antigos desenvolvedores. 
Antes de mais nada, vale ressaltar que o projeto faz sua função conforme prometido, contudo, tem muito espaço para ser aprimorado, então vamos começar?

Image description
Para conseguirmos criar bots para o twitter, precisamos criar uma conta de desenvolvedor aqui: https://developer.twitter.com/en. 
Além de criar a conta no portal do desenvolvedor, será necessário criar o projeto e dar permissões mais elevadas para as API's através de products, para facilitar o entendimento, vou deixar aqui embaixo um artigo sobre como criar os acessos e obter os tokens.


Após criado o projeto e tendo em mãos os tokens necessários: consumer_key, consumer_key_secret, access_token e access_secret, vamos iniciar o desenvolvimento do projeto.
Como sempre, nosso projeto será em python e vamos precisar das seguintes bibliotecas:
pip install tweepy
pip install requests
Enter fullscreen mode Exit fullscreen mode

Tweepy é uma biblioteca que nos permite acessar facilmente a API do Twitter e requests, como o nome já diz, para fazermos nossas requisições. Outra sugestão de biblioteca é a beautifulsoup4, para rasparmos conteúdos da web que não nos fornece endpoints, contudo, vamos optar pelo simples e deixarmos o web scraping para mais tarde.

Criaremos agora a busca dos artigos, a principio usei o dev.to e o medium como fontes, ambos possuem API's disponíveis externamente, o que facilitou a minha busca.

import random
import requests
TAGS_DEV = ['javascript', 'python', 'webdev', 'devops', 'react', 'vue',
            'typescript', 'github', 'css', 'tutorial', 'beginners', 'node']


def get_top_articles_devto():
    tags = random.sample(TAGS_DEV, k=3)
    list_articles = []

    for tag in tags:

        url = f'https://dev.to/api/articles?per_page=3&tag={tag}&top=2'
        articles = requests.get(url).json()

        for a in articles:
            obj_article = {
                'tag': tag,
                'title':  a['title'],
                'description': a['description'],
                'link': a['url']}

            list_articles.append(obj_article)

    return list_articles

Enter fullscreen mode Exit fullscreen mode

Seguimos agora criando a autenticação com a API do twitter e a função que nos permitirá criar as postagens, conforme o exemplo.

import os
import tweepy

def post_twitter():
    consumer_key = os.getenv('CONSUMER_KEY')
    consumer_secret = os.getenv('CONSUMER_SECRET')
    access_token = os.getenv('ACCESS_TOKEN')
    access_secret = os.getenv('ACCESS_SECRET')
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)

    auth = tweepy.OAuthHandler(
        consumer_key=consumer_key,
        consumer_secret=consumer_secret)
    auth.set_access_token(access_token, access_secret)
    api = tweepy.API(auth)
    post_twitter_devto(api)

 def post_twitter_devto(api):
    message = '📚 ThaisPosta links do dia: \n'

    body_message = []
    # Busca os artigos
    dev_to = get_top_articles_devto()
    b_new = []
    count = 0
    for i, dev in enumerate(dev_to):
        message_body = f'{dev.get("tag").upper()}: 👉 {dev.get("title")}\nlink: {dev.get("link")}'

        # Como o twitter tem limite de caracteres é necessário verificar, se ultrapassar o tamanho exigido, vamos postar uma thread.
        if len(message) + len(''.join(body_message)) <= 247:
            body_message.append(message_body)
        else:
            b_new.append({count: body_message})
            count += 1
            body_message = [message_body]

    b_new.append({count: body_message})

    status = None
    thread = None
    for i, b in enumerate(b_new):
        if i == 0:
            # publica no twitter
            status = api.update_status(message + '\n'.join(b[i]))
        else:
            # verifica se é um post inicial, ou se é uma resposta, criando assim uma thread se necessário
            if thread is not None:
                _id = thread
            elif status._json['id']:
                _id = status._json['id']

            if _id is not None:
                # publica no twitter, usando como referencia o post inicial
                thread = api.update_status(status='\n'.join(b[i]),
                                           in_reply_to_status_id=_id,
                                           auto_populate_reply_metadata=True)
                status = None
                thread = thread._json['id']

    return thread

Enter fullscreen mode Exit fullscreen mode

Pronto! Se chegou até aqui com sucesso, agora ao rodarmos python scheduler.py, nossos links serão publicados no twitter.
Mas Thais, se eu quiser automatizar essa tarefa, o que eu faço?

Image description

Essa imagem é famosa no mundo dev, mas como meu conteúdo abrange todo mundo e se "todo mundo" não sabe o que é o Heroku, encontrei uma definição muito boa para vocês.

Heroku: o que é e como auxilia no desenvolvimento escalável

O Heroku ajuda na criação de aplicativos mais eficientes para os seus clientes com muito mais praticidade. Entenda como!

favicon imaginedone.com.br

E o que faremos a seguir, é criarmos um pipeline e um aplicativo nessa plataforma, ou seja, vamos subir nosso código. Vou ensinar uma forma simples, usando o github, já aproveito e deixo com vocês o código completo. 
Após subir os arquivos para o git e supondo que a conta do heroku já esteja criada, vamos criar um "new app", com os seguintes passos:

Image description

Image description
Na aba deploy, vamos conectar a plataforma ao nosso github e buscar pelo repositório do projeto.

Image description

Já em settings, vamos configurar nossas variáveis de ambiente.

Image description
Por fim, voltaremos na aba anterior e no fim da página iremos dar start no deploy. Se o build foi finalizado com sucesso, o aplicativo já estará pronto para ser usado.
Agora precisamos incluir um agendador de tarefas para rodar nosso script, faremos isso com a ajuda dos complementos do Heroku.
Vamos para o menu de recursos e em Add Ons, vamos procurar por 'schedule', usaremos o Advanced Schedule.

Image description

Avançando, há uma opção “free”, selecione-a conforme a imagem.

Image description

Em seguida, vamos criar nosso primeiro gatilho, iremos atribuir um nome para nossa tarefa e em command inserir o comando "python scheduler.py".

Image description

Como próximo passo, vamos definir as configurações da nossa tarefa, como os intervalos de execução.

Image description

Sim, acabamos. Simples assim.
Você pode testar executando a trigger de forma manual, mas todos os dias ou em todo horário configurado, o gatilho será disparado rodando o código que subimos, e por fim desfrutaremos de mais uma tarefa legal e automatizada.

Image description

Por hoje é só pessoALL, espero que tenham gostado desse artigo e se quiserem conferir na íntegra, fiquem a vontade para me seguir: @thaisplicandoo.
Beijos e até breve!

Top comments (2)

Collapse
 
andypiper profile image
Andy Piper

Nice post!

Tip: you do not need to request elevated access on the Twitter API - you can do all of this with Essential access (which is free and the easiest option). Instead of using tweepy.api.update_status which uses the legacy v1.1 API, you can use tweepy.client.create_tweet which uses the new modern API v2! This API is better supported for the future, so I recommend that you look at this alternative.

Thanks for writing a nice post about the Twitter API!

Collapse
 
thaisplicando profile image
Thais Ribeiro

Wonderful Andy, as I said, it has a huge potential to improve, I will do what you suggested and by God this API is wonderful, thank you very much!