Como eu criei um bot para o Twitter e coloquei para executar no Heroku
Tags: python, heroku, programming, twitter
Published: 2022-08-10 02:15:29

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](https://twitter.com/thaisplicandoo).
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8boqk11w9f4um05b34p1.png)
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.
{% embed https://medium.com/programadores-ajudando-programadores/api-do-twitter-criando-o-app-e-obtendo-os-tokens-28ef3e2a281c %}
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
```

**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.

```python
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

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

```python
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

```
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dzcitnizz0lrekirryr1.jpeg)

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.

{% embed https://imaginedone.com.br/blog/o-que-e-o-heroku/ %}

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/svzmwuusagpibdnkg6h3.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g44hmootzhegkqn0sd1l.png)
Na aba **deploy**, vamos conectar a plataforma ao nosso github e buscar pelo repositório do projeto.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lhiv7k80uftqevgc3agi.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ymv1l685wtnrev5l8d4.png)
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hleej9m5adqedpij0pix.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/molutwjwtoshxdlbbxzi.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l2t94b0um2wafqiaw4r5.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0b72ov39pstp64syd99i.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gzzg4r9zwa21w49ptxys.png)

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