DadosAbertosDeFeira / maria-quiteria

Backend para coleta e disponibilização dos dados 📜
https://mq.dadosabertosdefeira.com.br/painel
MIT License
166 stars 69 forks source link

Notificar itens raspados no Discord #607

Closed anapaulagomes closed 1 year ago

anapaulagomes commented 1 year ago

Atualmente fazemos essa notificação no Telegram. Seria bom ter essa mensagem no Discord e centralizar mensagens de erro e raspagem por lá.

Começamos aqui https://github.com/scrapinghub/spidermon/pull/280 mas fechamos o PR esperando implementação no Spidermon. Agora já está disponível por lá: https://spidermon.readthedocs.io/en/latest/howto/configuring-discord-for-spidermon.html

anapaulagomes commented 1 year ago

cc @sheory talvez a gente possa adicionar os detalhes da outra aqui ou mergear essas duas issues em uma só. O que acha?

sheory commented 1 year ago

@anapaulagomes pode ser!!

sheory commented 1 year ago

@anapaulagomes O notifiers tem uma lista de providers e o discord nao esta la, entao a implementacao sera diferente da que tem hoje no telegram. E quando nao esta na lista ele dispara um erro:

elif strict:
        raise NoSuchNotifierError(name=provider_name)

Fiz uma poc para mostrar como da pra fazer sem o notifiers usando o post do proprio requests:

import requests
from spidermon import Action

class DiscordNotification(Action):
    def run_action(self):
        response = {\
            "inclusoesContrato": "sim",
            "alteracoesContrato": "sim",
        }
        data = {
            "content": get_message_about_retrieved_city_council_data_discord(response)
        }
        url = f"https://discord.com/api/webhooks/{WEBHOOK_ID}/{WEBHOOK_TOKEN}"

        response = requests.post(url, json=data)
        return response

def get_message_about_retrieved_city_council_data_discord(response):
    if response.get("erro"):
        message = f"❌ Comunicação com a Câmara finalizada\nErro: {response['erro']}"
    else:
        message = (
            "✅ Comunicação com a Câmara finalizada\n\n"
            "- Contratos\n"
            f"novos: {len(response['inclusoesContrato'])}\n"
            f"alterados: {len(response['alteracoesContrato'])}\n"
        )

    return message

DiscordNotification().run_action()

Discord com caso sucesso e caso de erro: image

O que sugere?

anapaulagomes commented 1 year ago

O Spidermon já tem uma implementação dessa comunicação com o Discord (fui eu quem fiz 😂), então seria que nem a que temos hoje pro Telegram. Tem que ver quais as variáveis de ambiente precisa configurar e a mensagem, só isso. O link tá na descrição dessa issue. Qualquer dúvida me avisa!

sheory commented 1 year ago

Ahhh, boa. Nao tinha entendido direito.