pymsteams文本换行符失效,如何实现与Python终端一致的MS Teams输出?
问题描述
从Linux机器获取网络接口输出后推送至MS Teams频道,发现换行符无法正常生效,导致显示格式混乱。
代码示例
stdin, stdout, stderr = client.exec_command("ip addr | grep bond0") pwd_out=stdout.read().decode("utf-8") new_text="Link Status:"+"\n" + pwd_out print(new_text) myTeamsMessage.text(new_text)
预期输出(Python终端)
Link Status: 6: ens1f0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000 9: ens2f1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000 10: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 11: bond0.400@bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 inet 192.168.40.10/24 brd 192.168.40.255 scope global noprefixroute bond0.400 12: bond0.501@bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 inet 192.168.51.16/24 brd 192.168.51.255 scope global noprefixroute bond0.501
实际Teams输出
payload: {'text': 'Link Status:\n6: ens1f0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000\n9: ens2f1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000\n10: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000\n11: bond0.400@bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000\n inet 192.168.40.10/24 brd 192.168.40.255 scope global noprefixroute bond0.400\n12: bond0.501@bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000\n inet 192.168.51.16/24 brd 192.168.51.255 scope global noprefixroute bond0.501\n'}
解决方法
MS Teams的文本消息默认解析Markdown语法,普通换行符\n无法被识别,需通过以下方式调整格式:
方法1:替换换行符为Markdown兼容格式
将文本中的\n替换为\n\n(Markdown换行规则)或<br>(HTML换行标签),Teams会自动解析并实现换行:
stdin, stdout, stderr = client.exec_command("ip addr | grep bond0") pwd_out=stdout.read().decode("utf-8") # 方案A:用Markdown换行规则 formatted_text = "Link Status:\n\n" + pwd_out.replace("\n", "\n\n") # 方案B:用HTML换行标签 # formatted_text = "Link Status:<br>" + pwd_out.replace("\n", "<br>") myTeamsMessage.text(formatted_text)
方法2:用Markdown代码块包裹内容
将输出内容放在Markdown代码块中,既能完整保留原始换行和缩进,还能赋予代码样式,可读性更强:
stdin, stdout, stderr = client.exec_command("ip addr | grep bond0") pwd_out=stdout.read().decode("utf-8") # 用三个反引号包裹内容,指定shell格式可选 formatted_text = "Link Status:\n```shell\n" + pwd_out + "\n```" myTeamsMessage.text(formatted_text)
方法3:使用Teams自适应卡片(定制化展示)
如果需要更灵活的排版,可使用自适应卡片,卡片会严格保留文本的原始格式:
from teams.models import AdaptiveCard, TextBlock card = AdaptiveCard() card.add(TextBlock(text="Link Status:", size="large")) # 用pre标签强制保留原始格式 card.add(TextBlock(text=f"<pre>{pwd_out}</pre>", wrap=True)) myTeamsMessage.attachments([card])
内容的提问来源于stack exchange,提问作者Komal
相关产品推荐
相关产品推荐

