如何通过Telegram Bot API发送含Emoji的文件名文件?
解决Telegram Bot API发送带Emoji文件名丢失的问题
requests默认处理multipart上传的文件名时,会把非ASCII字符(比如💎)过滤掉,得用RFC 5987规定的编码格式指定文件名,Telegram Bot API能识别这个格式。
具体代码修改
估计你原来的代码是类似这样的:
import requests TOKEN = "你的机器人令牌" CHAT_ID = "目标聊天ID" with open("diamond💎.txt", "rb") as f: requests.post( f"https://api.telegram.org/bot{TOKEN}/sendDocument", data={"chat_id": CHAT_ID}, files={"document": ("diamond💎.txt", f)} )
改成下面的写法,用标准编码格式处理文件名:
import requests from urllib.parse import quote TOKEN = "你的机器人令牌" CHAT_ID = "目标聊天ID" original_filename = "diamond💎.txt" # 按照RFC 5987标准编码文件名 encoded_filename = f"filename*=utf-8''{quote(original_filename)}" with open(original_filename, "rb") as f: response = requests.post( f"https://api.telegram.org/bot{TOKEN}/sendDocument", data={"chat_id": CHAT_ID}, # 第三个参数是文件MIME类型,文本文件填text/plain即可 files={"document": (encoded_filename, f, "text/plain")} )
原理说明
手动在Telegram客户端发文件时,客户端会按照HTTP标准的multipart/form-data格式,正确编码带Emoji的文件名;但requests默认处理文件名时,会错误过滤非ASCII字符,导致Telegram只收到纯ASCII部分(也就是diamond.txt)。用RFC 5987的编码格式后,Telegram就能正确解析出带Emoji的完整文件名。
内容的提问来源于stack exchange,提问作者PouJa
相关产品推荐
相关产品推荐

