Python:格式化字符串以在 Markdown 或 HTML 中显示为明文?

Python: Format string to appear as plaintext in Markdown or HTML?

我正在使用 Telegram 机器人从我的 Python 程序发送消息。 Telegram 要求您发送的所有机器人消息都采用 Markdown 或 HTML.

格式

我想要的只是我的 Python 程序中的字符串在 Telegram 消息的接收端以完全相同的方式显示。

问题是,我要发送的文本是从 public 中提取的,所以它可以是任何东西,包括在这些格式中具有意义的特殊字符,这完全搞砸了消息。

有没有一种方法可以将此消息字符串格式化为其中一种格式,以便它在另一端显示为纯文本?

编辑: 我已经尝试了很多东西。正如 mmiron 所建议的,我尝试将我的字符串转义为 html,但我无法开始工作。似乎发生的是特殊的 (<,>,#) 字符完全搞砸了消息,即使我用 &amp;

之类的字符引用替换它们

我还尝试将我的字符串转义为 Markdown,结果非常奇怪。与 HTML 不同,使用 markdown 似乎更有可能实际发送文本,但特殊字符(尤其是 #)似乎会搞砸结果

这是带有 Markdown 的起始文本

>>Bravo: Priyanka Chopra, Navya Naveli Nanda praise Jharkhand girl who got #Harvard University scholarship https://url
"Educate a girl you can change the whole community"
- - - - - - - - - - - - - - - - - - - - - -
Sunchartist
(@sunchartist)
                                                     j1.1
- - - - - - - - - - - - - - - - - - - - - -
9:09PM +43seconds    23-4-2021
[Chopra]
(Balance: .43)
-----------------------------------
<https://twitter.com/sunchartist/status/1385777945248030723>
-----------------------------------
<https://www.url.com>

转成markdown发送后,这是我收到的电报信息:

'\>Bravo: Priyanka Chopra, Navya Naveli Nanda praise Jharkhand girl who got Harvard University scholarship https://url 
"Educate a girl you can change the whole community"
\- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \-
Sunchartist
\(@sunchartist\)
                                                     j1\.1
\- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \-
9:09PM \ 43seconds    23\-4\-2021
[Chopra\]
\(Balance: \.43\)
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
<https://twitter\.com/sunchartist/status/1385777945248030723\>
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
<https://www\.url\.com\>

很明显,转义函数在每个特殊字符前添加了一个反斜杠。奇怪的是,除了

中的第一个括号外,它似乎没有将其正确解析为 markdown
[Chopra\]

以及原文中出现在链接之前的第一个<

<https://www\.url\.com\>

这很奇怪,因为出于某种原因,它似乎只对 [] 或 <> 中的开始字符有效,但对结束字符无效。

我也尝试过使用 HTML 标志用 <pre>...</pre> 换行,但这似乎没有任何效果,除了在它发送时更改电报上的文本颜色,它只会这样做如果我删除有问题的特殊字符

如果文本中的任何一点有一个标签 (#),它似乎只发送标签之前的文本,但在它之后发送 none。由于某种原因

,降价和 html 都是如此
import html
escaped = html.escape(EXTERNAL_INPUT_STRING)

然后将 escaped 作为 HTML 发送。另见 https://core.telegram.org/bots/api#sendmessage

好的,我终于解决了。在此张贴以供将来参考。

我永远无法让 HTML 工作,所以我仍然不确定。

所以首先,我有 parse_mode=Markdown 而不是 parse_mode=MarkdownV2

接下来,使用 \ 运算符确实可以将一些特定字符显示为文字。相反,您需要使用 Percent-Encoding 来保留这些符号。

这是我用来修复该部分的代码。

message_body=message_body.replace('%', '\%25')
message_body=message_body.replace('#', '\%23')
message_body=message_body.replace('+', '\%2B')
message_body=message_body.replace('*', '\%2A')
message_body=message_body.replace('&', '\%26')

修复了 %、#、+... 我可能会做得更多 elegant/faster 但这目前有效。

最后,\ 运算符确实可以为一组字符创建文字。这是我用来修复这些问题的代码

    message_body = re.sub(r"([_*\[\]()~`>\#\+\-=|\.!{}])", r"\", message_body)

要添加特定的 Telegram 转义,您可以使用来自 telegram-text:

的 PlainText
from telegram_text import PlainText

element = PlainText("Your non-escaped text!")
escaped_text = element.to_markdown()
escaped_text
'Your non\-escaped text\!'