You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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,无需保存到本地文件。

步骤与代码示例

  1. 导入io模块的BytesIO类,用于在内存中存储图片数据。
  2. 将Figure对象保存到BytesIO缓冲区。
  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:18:20