PRTG对接Telegram时curl传%device报UTF-8编码错误咨询
故障根因
该报错确实由%device变量的实际取值导致,和curl调用方式、Telegram接口本身无直接关联。
PRTG运行时替换内置变量的过程中,%device对应的设备名称常带入两类触发报错的内容:
- 包含非UTF-8编码的特殊字符、全角符号,或是设备名中携带未转义的Markdown语法保留字符
- 包含未做URL编码的空格、控制字符,POST提交时会破坏请求体的参数拼接结构,最终被Telegram接口判定为请求文本不符合UTF-8编码要求。
移除%device后请求正常,就是因为排除了上述非法字符来源。
保留%device变量的可行解决方案
方案1:使用curl自带编码参数处理内容(优先推荐)
放弃直接用-d拼接所有参数的写法,改用--data-urlencode参数处理text字段,该参数会自动对变量替换后的所有内容做合规URL编码,自动转义空格、特殊符号、非ASCII字符,保证提交内容为合法UTF-8格式,修改后的命令如下:
curl -X POST https://api.telegram.org/<BOT_ID>/sendMessage \ -d 'chat_id=<CHAT_ID>' \ -d 'parse_mode=Markdown' \ --data-urlencode "text=%lastmessage %linksensor %since %group %device"
该方案不需要修改PRTG侧的设备配置,也不需要额外做字符转义,适配绝大多数场景。
方案2:调整消息解析模式
如果报错是设备名中Markdown特殊字符导致的解析异常,可以将parse_mode参数值从Markdown改为HTML,或是直接移除parse_mode参数以纯文本格式发送消息,该方案会损失部分消息排版能力,稳定性不如方案1。
注意:若切换为
MarkdownV2解析模式,需要手动对所有变量内容中的Markdown保留字符做转义处理,运维成本较高,不推荐优先使用。
方案3:PRTG侧提前净化变量内容
在PRTG通知模板配置中,对%device变量增加字符过滤规则,提前剔除设备名称中的非UTF-8控制字符、特殊转义符号,从源头避免非法字符带入接口请求。
内容的提问来源于stack exchange,提问作者Masplus
相关产品推荐
相关产品推荐

