我想让微软团队机器人发送 pdf 文件,但我无法显示它。在团队聊天中写作 "This card's content could not be displayed"
。
但是,如果我尝试在 azure 中进行测试,我会获取带有文件名的信息但不显示下载按钮或类似内容
聊天消息
{
"contentType": "application/vnd.microsoft.teams.card.file.consent",
"content": {
"description": "This is the file I want to send you",
"sizeInBytes": 27374,
"acceptContext": {
"filename": "test.pdf"
},
"declineContext": {
"filename": "test.pdf"
}
},
"name": "test.pdf"
}
我的团队使用 Python 编写代码。
async def on_message_activity(self, turn_context: TurnContext):
self._add_conversation_reference(turn_context.activity)
if " send pdf" in turn_context.activity.text:
filename = "test.pdf"
file_path = "C:/files/" + filename
file_size = os.path.getsize(file_path)
await self._send_file_card(turn_context, filename, file_size)
else:
return await turn_context.send_activity(
f"You sent : {turn_context.activity.text}"
)
async def _send_file_card(
self, turn_context: TurnContext, filename: str, file_size: int
):
"""
Send a FileConsentCard to get permission from the user to upload a file.
"""
consent_context = {"filename": filename}
file_card = FileConsentCard(
description="This is the file I want to send you",
size_in_bytes=file_size,
accept_context=consent_context,
decline_context=consent_context
)
as_attachment = Attachment(
content=file_card.serialize(), content_type=ContentType.FILE_CONSENT_CARD, name=filename
)
reply_activity = self._create_reply(turn_context.activity)
reply_activity.attachments = [as_attachment]
await turn_context.send_activity(reply_activity)
async def on_teams_file_consent_accept(
self,
turn_context: TurnContext,
file_consent_card_response: FileConsentCardResponse
):
"""
The user accepted the file upload request. Do the actual upload now.
"""
file_path = "C:/files/test.pdf"
file_size = os.path.getsize(file_path)
headers = {
"Content-Length": f"\"{file_size}\"",
"Content-Range": f"bytes 0-{file_size-1}/{file_size}"
}
response = requests.put(
file_consent_card_response.upload_info.upload_url, open(file_path, "rb"), headers=headers
)
if response.status_code != 201:
print(f"Failed to upload, status {response.status_code}, file_path={file_path}")
await self._file_upload_failed(turn_context, "Unable to upload file.")
else:
await self._file_upload_complete(turn_context, file_consent_card_response)
async def on_teams_file_consent_decline(
self,
turn_context: TurnContext,
file_consent_card_response: FileConsentCardResponse
):
"""
The user declined the file upload.
"""
context = file_consent_card_response.context
reply = self._create_reply(
turn_context.activity,
f"Declined. We won't upload file <b>{context['filename']}</b>.",
"xml"
)
await turn_context.send_activity(reply)
async def _file_upload_complete(
self,
turn_context: TurnContext,
file_consent_card_response: FileConsentCardResponse
):
"""
The file was uploaded, so display a FileInfoCard so the user can view the
file in Teams.
"""
name = file_consent_card_response.upload_info.name
download_card = FileInfoCard(
unique_id=file_consent_card_response.upload_info.unique_id,
file_type=file_consent_card_response.upload_info.file_type
)
as_attachment = Attachment(
content=download_card.serialize(),
content_type=ContentType.FILE_INFO_CARD,
name=name,
content_url=file_consent_card_response.upload_info.content_url
)
reply = self._create_reply(
turn_context.activity,
f"<b>File uploaded.</b> Your file <b>{name}</b> is ready to download",
"xml"
)
reply.attachments = [as_attachment]
await turn_context.send_activity(reply)
async def _file_upload_failed(self, turn_context: TurnContext, error: str):
reply = self._create_reply(
turn_context.activity,
f"<b>File upload failed.</b> Error: <pre>{error}</pre>",
"xml"
)
await turn_context.send_activity(reply)
def _create_reply(self, activity, text=None, text_format=None):
return Activity(
type=ActivityTypes.message,
timestamp=datetime.utcnow(),
from_property=ChannelAccount(
id=activity.recipient.id, name=activity.recipient.name
),
recipient=ChannelAccount(
id=activity.from_property.id, name=activity.from_property.name
),
reply_to_id=activity.id,
service_url=activity.service_url,
channel_id=activity.channel_id,
conversation=ConversationAccount(
is_group=activity.conversation.is_group,
id=activity.conversation.id,
name=activity.conversation.name,
),
text=text or "",
text_format=text_format or None,
locale=activity.locale,
)
知道我哪里做错了吗?在此 article 中,我发现需要设置自适应卡,我尝试将其设置在 manifest.json 和其他文件上,但不起作用。我设置团队机器人发送文件的基本代码在 here
答案 0 :(得分:0)
我说的是更正,但据我所知,您不能在 Teams 的自适应卡中发送实际文件 - 您需要将文件存储在其他地方(例如 SharePoint / Azure Blob),然后只需发送一个 链接到自适应卡片中的文件(甚至是普通的短信)。