원클릭으로
aibot-send-media
分片上传临时素材 + 主动发送媒体(file/image/voice/video)。当用户说"发文件 / 发图片 / 上传素材 / uploadMedia / sendMediaMessage" 时使用。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
分片上传临时素材 + 主动发送媒体(file/image/voice/video)。当用户说"发文件 / 发图片 / 上传素材 / uploadMedia / sendMediaMessage" 时使用。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
环境与机器人接入(凭证、.env、长连接启动)。当用户问"怎么跑 aibot-python-sdk / 怎么接入 / 配置 .env / 连接失败"时使用。
接收并处理来自企业微信的消息(text/image/file/video/voice/mixed)与事件(enter_chat/template_card/feedback)。当用户说"接收消息 / 监听机器人 / 收到消息 / 事件回调 / reply / reply_stream" 时使用。
发送"按钮交互"模板卡片(`button_interaction`),含按钮点击回调与卡片更新。当用户说"按钮卡片 / 确认卡片 / 审批 / 投票 / button_interaction / template_card_event" 时使用。
主动发送 Markdown 消息(无需用户先发消息)。当用户说"主动推送 / 主动发 / 定时通知 / sendMessage / Markdown" 时使用。
发送"文本通知"模板卡片(`text_notice`)。当用户说"发个通知 / 卡片 / 系统公告 / text_notice / notification card" 时使用。
SOC 직업 분류 기준
| name | aibot-send-media |
| description | 分片上传临时素材 + 主动发送媒体(file/image/voice/video)。当用户说"发文件 / 发图片 / 上传素材 / uploadMedia / sendMediaMessage" 时使用。 |
通过 WebSocket 通道三步分片上传临时素材,再用 send_media_message 主动发或 reply_media 被动回复。
注意:上传走 WebSocket 长连接(不是 HTTP),需要
WSClient已经认证。
import asyncio, os
from dotenv import load_dotenv
from wecom_aibot import WSClient
from wecom_aibot.types import WSClientOptions, UploadMediaOptions
load_dotenv()
async def main():
client = WSClient(WSClientOptions(
bot_id=os.getenv("WECOM_BOT_ID"),
secret=os.getenv("WECOM_BOT_SECRET"),
))
auth = asyncio.Event()
@client.on("authenticated")
def on_auth(): auth.set()
client.connect()
await asyncio.wait_for(auth.wait(), timeout=10)
await asyncio.sleep(1)
file_bytes = open("testfile.xlsx", "rb").read()
# Step 1+2+3:init → chunk → finish,全部在 SDK 内完成
result = await client.upload_media(
file_bytes,
UploadMediaOptions(type="file", filename="testfile.xlsx"),
)
print(f"media_id={result.media_id}") # 3 天内有效
# 主动发送
target = os.getenv("WECOM_TARGET_USERID") or os.getenv("WECOM_TARGET_CHATID")
await client.send_media_message(target, "file", result.media_id)
await client.disconnect()
asyncio.run(main())
UploadMediaOptions(type="file", ...) # 文件
UploadMediaOptions(type="image", ...) # 图片
UploadMediaOptions(type="voice", ...) # 语音
UploadMediaOptions(type="video", ..., video_options=VideoOptions(
title="标题",
description="描述",
))
video 额外需要 title / description,由 VideoOptions 传入。
@client.on("message.text")
async def on_text(frame):
# 一次上传,多次复用 media_id
result = await client.upload_media(
open("report.pdf", "rb").read(),
UploadMediaOptions(type="file", filename="report.pdf"),
)
await client.reply_media(frame, "file", result.media_id)
| 症状 | 原因 |
|---|---|
Upload init failed: no upload_id | 服务端临时错误,重试 |
ChunkUploadError attempts=3 | 网络不稳,client 已重试仍失败 |
media_id expired | media_id 有效期 3 天,需重新上传 |
上传后 send 报 40007 invalid media_id | 类型不匹配,例如 image 的 id 发成 file |