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
slackda plataforma e é renovado por ela. Fora da plataforma (no laptop), ponha um token de acesso emSHADE_TOKEN_SLACK. - Escopos:
channels:read(listar os canais),chat:write(postar) echannels:history(ler o histórico recente, que é o que evita a mensagem duplicada). A conexão semchannels:historynã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
canaldas operações é o id (comoC0123ABCD, o quelistar_canaisdevolve), 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
metadatada 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, o5xx, 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 (mrkdwndesligado), e o corpo é montado como objeto e serializado peloshade_sdk.http, nunca por concatenação de texto. - Retentativa só onde é segura: a leitura e o
429(nada foi postado) repetem dentro dotimeout=; depois do despacho dochat.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 aceitatimeout=(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)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| 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.