Skip to main content

shade-plugins-slack

Lista os canais e envia mensagem no Slack, de dentro de um robô do shade-sdk, com o token OAuth da conexão do Slack na plataforma. Só a biblioteca padrão do Python: nenhuma dependência além do shade-sdk.

No shade.toml do robô, o host da API vai em [hosts] permitidos e a conexão em [conexoes]:

[hosts]
permitidos = ["slack.com"]

[conexoes]
nomes = ["slack"]

[plugins]
slack = "0.1.1"
import shade_plugins_slack as slack

# Leitura: roda inclusive no ensaio.
canal = next(c["id"] for c in slack.listar_canais() if c["nome"] == "financeiro")

# Escrita: só dentro de item.efetivar() (no ensaio não roda).
with item.efetivar("avisar o time"):
    slack.enviar_mensagem(canal, f"Pedido {item['pedido']} conferido.")

A conta

  • Conexão: o robô nunca vê a senha nem o refresh token. O token de acesso chega sob demanda da conexão slack da plataforma e é renovado por ela. Fora da plataforma (no laptop), ponha um token de acesso em SHADE_TOKEN_SLACK.
  • Escopos: channels:read (listar os canais), chat:write (postar) e channels:history (ler o histórico recente, que é o que evita a mensagem duplicada). A conexão sem channels:history não posta nada e o erro manda reconectar o Slack.
  • Canais: os públicos. O app precisa ter sido adicionado ao canal para ler o histórico e postar. O canal das operações é o id (como C0123ABCD, o que listar_canais devolve), não o nome.

O que o plugin garante

  • Não duplica a mensagem. O Slack não reconhece repetição. O plugin grava a chave do item no metadata da mensagem e, antes de postar, lê as últimas mensagens do canal (até 500) e devolve a que já tiver a chave. Depois que o envio saiu sem confirmação (a conexão caiu, o 5xx, a resposta que não se lê), o plugin não posta de novo: ele confere o histórico e, sem achar, o erro é SlackIncerto (o item fica retido para uma pessoa conferir no canal e, só se a mensagem não chegou, mandar refazer).
  • O texto é literal. &, < e > vão como as entidades que a API documenta, então <!channel>, <@U123> e <https://...|texto> vindos de um dado não viram menção nem link. A mensagem sai sem formatação (mrkdwn desligado), e o corpo é montado como objeto e serializado pelo shade_sdk.http, nunca por concatenação de texto.
  • Retentativa só onde é segura: a leitura e o 429 (nada foi postado) repetem dentro do timeout=; depois do despacho do chat.postMessage, nada repete.
  • Só dentro de item.efetivar(). Fora dele, a operação é um erro de contrato antes de qualquer byte; no ensaio, o bloco é pulado e nada é enviado.
  • Host e prazo: só slack.com, com o certificado verificado, sem seguir redirecionamento; toda chamada aceita timeout= (30 s por padrão), que vale para a chamada inteira.
  • Sem conteúdo em evento nem em erro: cada chamada emite um evento com a operação, o host, a duração e o status. Nunca o texto, o id do canal, o token nem o corpo da resposta; o erro da API chega só pelo código que o Slack dá (channel_not_found, missing_scope).

Operações

Operação Efeito O que faz
listar_canais(*, limite=1000, arquivados=False) não Os canais públicos: id, nome, arquivado, membro, membros.
enviar_mensagem(canal, texto) sim Posta texto (até 40 000 caracteres) no canal. Devolve canal, ts e reaproveitada.

Limites

O histórico do Slack é de leitura limitada para alguns apps (os não listados no Marketplace têm cota baixa em conversations.history). Se a leitura for recusada com ratelimited, a mensagem não é postada (SlackNaoSaiu), em vez de arriscar o duplicado.

Testes

A suíte de contrato do shade_sdk.testing.plugins e um servidor falso da Web API (TLS de uma CA de teste, que responde ok: false com 200 e não reconhece repetição, como a de verdade) acompanham o código-fonte em tests/.

Metadata

Release files for shade-plugins-slack 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for shade-plugins-slack 0.1.1
File Interpreter ABI Platform Actions
shade_plugins_slack-0.1.1-py3-none-any.whl Python 3 none any Details for shade_plugins_slack-0.1.1-py3-none-any.whl

Release files / shade_plugins_slack-0.1.1-py3-none-any.whl

Download URL shade_plugins_slack-0.1.1-py3-none-any.whl
Size 17.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ba848c250b5a34b55038cfc2d1265e1ff76256cb7073e18adf458c87cc6ca3bc
BLAKE2b-256 checksum
How to use checksums
bd345ad5dfc08180c5f8982f9288d7fc46bdfe2c54b35e3323a58a95a43492cc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Security for shade-plugins-slack 0.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page