Telegram Bot发送含&字符的URL被截断,求解决方法
解决Telegram Bot发送带&的URL被截断的问题
我太懂这个坑了——手动把&换成&还是没解决截断问题,核心原因是你直接拼接URL参数的方式踩了HTTP协议的坑,你的URL里的&会被当成Telegram API请求的参数分隔符,导致API只接收到第一个&之前的内容。
问题到底出在哪?
当你手动拼接GET请求URL时,哪怕把movieSearch里的&换成&,在HTTP层面,&依然是用来分隔API参数(比如chat_id=、text=、parse_mode=)的符号。举个例子,你拼接后的URL大概是这样:
https://api.telegram.org/xxx/sendMessage?chat_id=xxx&text=https://xxx?release_date=xxx&user_rating=xxx&parse_mode=HTML
这时候HTTP会把这个URL解析成多个参数:
chat_id=xxxtext=https://xxx?release_date=xxxamp;user_rating=xxx(被当成了一个无效的API参数)parse_mode=HTML
所以text参数的值直接被截断到第一个&之前,这就是你看到的发送内容不完整的原因。
正确的解决方法:让requests自动处理参数编码
别再手动拼接URL了,用requests.get的params参数来传递所有API参数,它会自动帮你把特殊字符(比如&)编码成%26,彻底避免参数分隔符冲突的问题。
修改后的代码如下:
1. 定义movieSearch时不用手动转义&
# 用f-string更清晰,直接保留原始的&即可 movieSearch = f"https://www.imdb.com/search/title?release_date={year}-01-01,2018-12-31&user_rating={score},&genres={genres}"
2. 用params参数传递Telegram API的所有参数
import requests # 基础URL只保留API端点 base_url = f"https://api.telegram.org/{botID}/sendMessage" # 把所有参数放进字典里 api_params = { "chat_id": chatid, "text": movieSearch, "parse_mode": "HTML" } # 让requests自动处理编码和拼接 response = requests.get(base_url, params=api_params)
这样处理后,requests会自动把movieSearch里的&转成%26,Telegram API收到完整的text参数后,因为你设置了parse_mode=HTML,会把%26转回&,最终发送的URL就是完整无截断的。
为什么之前的尝试没用?
- 手动替换
&为&:本质上还是在URL里保留了&,依然会被当成参数分隔符,导致text被提前截断。 - 移除
parse_mode=HTML:问题根源是URL参数的分隔冲突,和HTML解析无关,所以自然解决不了。
内容的提问来源于stack exchange,提问作者KMFR
相关产品推荐
相关产品推荐

