适用于 Python 的 Slack API 平台 SDK
项目描述
Python 松弛 SDK
Slack 平台提供了多种 API 来构建应用程序。每个 Slack API 都提供了平台的部分功能,因此您可以选择适合您需求的功能。该 SDK 为 Slack 的每个 API 提供了相应的包。它们在独立使用时体积小而功能强大,并且在一起使用时也可以无缝工作。
可以在https://slack.dev/python-slack-sdk/找到有关使用 Slack Python 的综合文档
无论您是为您的团队构建自定义应用程序,还是将第三方服务集成到您的 Slack 工作流程中,Slack Developer Kit for Python 都允许您利用 Python 的灵活性来尽快启动和运行您的项目。
Python Slack SDK允许与以下交互:
slack_sdk.web: 用于调用Web API 方法slack_sdk.webhook: 用于在有效负载中使用传入的 Webhook和response_urlsslack_sdk.signature:用于验证来自 Slack API 服务器的传入请求slack_sdk.socket_mode:用于通过Socket 模式连接接收和发送消息slack_sdk.audit_logs:用于使用审核日志 APIslack_sdk.scim:用于利用SCIM APIslack_sdk.oauth:用于实现Slack OAuth 流程slack_sdk.models:用于使用易于使用的构建器构建Block Kit UI 组件slack_sdk.rtm:用于使用RTM API
如果您想使用我们的事件 API和交互功能,请查看Bolt for Python库。有关令牌和身份验证的详细信息,请参阅我们的身份验证指南。
slackclient 处于维护模式
您在寻找slackclient吗?该网站像以前一样在这里生活。但是,slackclient 项目现在处于维护模式,这slack_sdk是继任者。如果您有时间迁移到 slack_sdk v3,请按照我们的迁移指南确保您的应用在更新后继续工作。
目录
要求
该库需要 Python 3.6 及更高版本。如果您需要 Python 2,请使用我们的SlackClient - v1.x。如果您不确定如何检查您使用的 Python 版本,可以使用以下命令进行检查:
注意:您可能需要
python3在命令之前使用,以确保使用正确的 Python 路径。例如python3 --version
python --version
-- or --
python3 --version
安装
我们建议使用PyPI安装适用于 Python 的 Slack Developer Kit。
$ pip install slack_sdk
入门教程
我们创建本教程是为了在 10 分钟内构建一个基本的 Slack 应用程序。它需要一些通用的编程知识和 Python 基础知识。它专注于与 Slack 的 Web 和 RTM API 的交互。使用它可以让您了解如何使用此 SDK。
Web客户端的基本用法
Slack 提供了一个 Web API,使您能够构建以各种方式与 Slack 交互的应用程序。该开发工具包是一个基于模块的包装器,可以更轻松地与该 API 进行交互。我们在这里有一个基本示例,其中包含一些更常见的用途,但这里提供了可用方法的完整列表。更详细的示例可以在我们的指南中找到。
向 Slack 发送消息
最常见的用例之一是向 Slack 发送消息。如果您想作为您的应用程序或作为用户发送消息,则此方法可以同时进行。在我们的示例中,我们指定了通道名称,但建议尽可能使用channel_id。此外,如果您的应用程序的机器人用户尚未在频道中,请在运行代码段之前邀请机器人用户(或添加chat:write.public到机器人令牌范围以在任何公共频道中发布)。
import os
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
client = WebClient(token=os.environ['SLACK_BOT_TOKEN'])
try:
response = client.chat_postMessage(channel='#random', text="Hello world!")
assert response["message"]["text"] == "Hello world!"
except SlackApiError as e:
# You will get a SlackApiError if "ok" is False
assert e.response["ok"] is False
assert e.response["error"] # str like 'invalid_auth', 'channel_not_found'
print(f"Got an error: {e.response['error']}")
在这里,我们还确保从 Slack 返回的响应是成功的,并且消息是我们使用assert语句发送的消息。
将文件上传到 Slack
我们更改了将文件上传到 Slack 的流程,使其更加简单直接。您现在可以直接在 API 调用中包含文件路径并以这种方式上传。您可以在此处找到有关此 api 调用的详细信息
import os
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
client = WebClient(token=os.environ['SLACK_BOT_TOKEN'])
try:
filepath="./tmp.txt"
response = client.files_upload(channels='#random', file=filepath)
assert response["file"] # the uploaded file
except SlackApiError as e:
# You will get a SlackApiError if "ok" is False
assert e.response["ok"] is False
assert e.response["error"] # str like 'invalid_auth', 'channel_not_found'
print(f"Got an error: {e.response['error']}")
异步使用
AsyncWebClient在这个 SDK 中,异步请求需要AIOHttp。
脚本中的 AsyncWebClient
import asyncio
import os
from slack_sdk.web.async_client import AsyncWebClient
from slack_sdk.errors import SlackApiError
client = AsyncWebClient(token=os.environ['SLACK_BOT_TOKEN'])
async def post_message():
try:
response = await client.chat_postMessage(channel='#random', text="Hello world!")
assert response["message"]["text"] == "Hello world!"
except SlackApiError as e:
assert e.response["ok"] is False
assert e.response["error"] # str like 'invalid_auth', 'channel_not_found'
print(f"Got an error: {e.response['error']}")
asyncio.run(post_message())
框架中的 AsyncWebClient
如果您正在使用调用 asyncio 事件循环的框架,例如:sanic/jupyter notebook/etc。
import os
from slack_sdk.web.async_client import AsyncWebClient
from slack_sdk.errors import SlackApiError
client = AsyncWebClient(token=os.environ['SLACK_BOT_TOKEN'])
# Define this as an async function
async def send_to_slack(channel, text):
try:
# Don't forget to have await as the client returns asyncio.Future
response = await client.chat_postMessage(channel=channel, text=text)
assert response["message"]["text"] == text
except SlackApiError as e:
assert e.response["ok"] is False
assert e.response["error"] # str like 'invalid_auth', 'channel_not_found'
raise e
from aiohttp import web
async def handle_requests(request: web.Request) -> web.Response:
text = 'Hello World!'
if 'text' in request.query:
text = "\t".join(request.query.getall("text"))
try:
await send_to_slack(channel="#random", text=text)
return web.json_response(data={'message': 'Done!'})
except SlackApiError as e:
return web.json_response(data={'message': f"Failed due to {e.response['error']}"})
if __name__ == "__main__":
app = web.Application()
app.add_routes([web.get("/", handle_requests)])
# e.g., http://localhost:3000/?text=foo&text=bar
web.run_app(app, host="0.0.0.0", port=3000)
高级选项
SSL
您可以提供自定义 SSL 上下文或通过传递sslRTM 和 Web 客户端都支持的选项来禁用验证。
对于异步请求,请参阅AIOHttp SSL 文档。
对于同步请求,请参阅urllib SSL 文档。
代理人
发出异步请求时支持代理,通过proxyRTM 和 Web 客户端都支持的选项。
对于异步请求,请参阅AIOHttp 代理文档。
对于同步请求,设置环境HTTPS_PROXY变量或proxy选项有效。
DNS 性能
使用异步客户端并寻求性能提升?安装可选的依赖项 (aiodns) 可能有助于加快客户端的 DNS 解析。我们将它作为额外的“可选”包含在内:
$ pip install slack_sdk[optional]
例子
import os
from slack_sdk import WebClient
from ssl import SSLContext
sslcert = SSLContext()
# pip3 install proxy.py
# proxy --port 9000 --log-level d
proxyinfo = "http://localhost:9000"
client = WebClient(
token=os.environ['SLACK_BOT_TOKEN'],
ssl=sslcert,
proxy=proxyinfo
)
response = client.chat_postMessage(channel="#random", text="Hello World!")
print(response)
从 v2 迁移
如果您从 slack_sdk 的 slackclient v2.x 迁移到 v3.x,请按照我们的迁移指南确保您的应用在更新后继续工作。
从 v1 迁移
如果您从 slackclient 的 v1.x 迁移到 v2.x,请按照我们的迁移指南确保您的应用在更新后继续工作。
支持
如果您遇到困难,我们随时为您提供帮助。以下是获得帮助解决您的问题的最佳方式:
使用我们的Github 问题跟踪器报告错误或请求功能。访问Slack 社区以获得使用 Slack Developer Kit for Python 的帮助,或者只是一般地与您的 Slack 开发人员建立联系。
贡献
我们欢迎大家的贡献!请查看我们的 贡献者指南,了解如何以有益和协作的方式进行贡献。