使用Slack files_upload_v2()发送私信文件遇错误的解决咨询
如何用Slack files_upload_v2发送私信文件
Slack的files_upload_v2()接口不再支持通过@user.name指定接收方,必须使用符合格式的频道ID(匹配正则^[CGD][A-Z0-9]{8,}$,其中D开头的是私聊频道ID)。要实现私信文件发送,需按以下步骤操作:
步骤1:获取目标用户的ID
通过Slack API的users.list接口,根据用户名过滤出目标用户的ID:
# 获取用户ID(根据用户名匹配) users_response = client.users_list() target_user_id = None for user in users_response["members"]: if user["name"] == "user.name": # 替换为实际目标用户名 target_user_id = user["id"] break
步骤2:获取与目标用户的私聊频道ID
调用conversations_open接口,传入用户ID即可创建或获取对应的私聊频道(ID以D开头):
# 获取私聊频道ID conv_response = client.conversations_open(users=target_user_id) dm_channel_id = conv_response["channel"]["id"]
步骤3:使用files_upload_v2上传文件到私聊频道
将获取到的私聊频道ID作为channels参数传入接口:
# 成功上传文件至私信 response = client.files_upload_v2(channels=dm_channel_id, file="myfile.csv")
完整可运行代码示例
from slack_sdk import WebClient from slack_sdk.errors import SlackApiError token = "MY_TOKEN" # 替换为你的Slack Token client = WebClient(token=token) try: # 1. 定位目标用户ID users_response = client.users_list() target_username = "user.name" target_user_id = None for user in users_response["members"]: if user["name"] == target_username: target_user_id = user["id"] break if not target_user_id: print(f"未找到用户 {target_username}") exit() # 2. 获取私聊频道ID conv_response = client.conversations_open(users=target_user_id) dm_channel_id = conv_response["channel"]["id"] # 3. 上传文件到私信 upload_response = client.files_upload_v2(channels=dm_channel_id, file="myfile.csv") print("文件上传成功:", upload_response["ok"]) except SlackApiError as e: print(f"API调用失败: {e.response['error']}")
关键说明
- 错误信息中的正则规则要求频道ID必须以
C(公开频道)、G(私有组)或D(私聊频道)开头,这也是直接使用@user.name会报错的核心原因。 - 若已提前知晓目标用户ID,可直接跳过步骤1,直接调用
conversations_open获取私聊频道。
内容的提问来源于stack exchange,提问作者alporter08
相关产品推荐
相关产品推荐

