如何通过Telegram API在Python3中向私有频道发送matplotlib图表
问题与解决方案
问题背景
我有一个名为df_trading_pair_date_time_index的DataFrame,存储BTC/USDT的5分钟K线数据,通过mplfinance生成了matplotlib.figure.Figure类型的蜡烛图。使用Telegram Bot API的sendPhoto接口直接发送该Figure对象时返回<Response [400]>错误,但sendMessage接口发送文本正常。推测原因是Telegram API不支持直接接收matplotlib对象,需要传入图片文件或二进制流。
解决方案
核心思路是把matplotlib Figure对象转换成二进制图片流,再通过requests的files参数发送给Telegram API,无需保存到本地文件。
步骤与代码示例
- 导入
io模块的BytesIO类,用于在内存中存储图片数据。 - 将Figure对象保存到BytesIO缓冲区。
- 使用
requests.post的files参数传递图片数据,data参数传递其他文本字段。
修改后的发送代码如下:
from io import BytesIO # 将Figure保存到内存缓冲区 buffer = BytesIO() btc_plot.savefig(buffer, format='png') buffer.seek(0) # 将指针移到缓冲区开头 # 发送图片到Telegram频道 response = requests.post( f'https://api.telegram.org/bot{bot_str}/sendPhoto', files={'photo': ('btc_candle.png', buffer, 'image/png')}, data={'chat_id': f'-100{channel_id_str}', 'caption': 'Fue detectada una señal bajista en el par BTC/USDT!'} ) print(response) # 查看响应状态,正常应为<Response [200]>
关键说明
savefig(buffer, format='png'):把Figure以PNG格式写入内存缓冲区,避免磁盘IO操作。buffer.seek(0):必须将缓冲区的文件指针移到起始位置,否则Telegram会读取到空数据。files参数的格式:{'photo': (文件名, 二进制流, MIME类型)},文件名可自定义,Telegram会忽略但需要填写。
内容的提问来源于stack exchange,提问作者NoahVerner
相关产品推荐
相关产品推荐

