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

创建比特币价格通知Telegram聊天机器人时遭遇PytzUsageWarning错误

解决比特币价格通知Telegram机器人的PytzUsageWarning警告

警告原因

这个警告来自APScheduler库,它内部使用了pytz库的zone属性,而pytz已被标记为弃用,官方推荐迁移到标准库的zoneinfo(Python 3.9+)或backports.zoneinfo(Python 3.8及以下)作为时区处理工具。

解决步骤

1. 升级APScheduler到最新版本

确保使用APScheduler的最新版本,新版本已支持zoneinfo,不再依赖pytz的旧接口:

pip install --upgrade apscheduler

2. 显式配置APScheduler使用zoneinfo

初始化BlockingScheduler时,指定时区使用zoneinfo格式,比如UTC或本地时区:

from zoneinfo import ZoneInfo  # Python 3.9+
# Python 3.8及以下先安装依赖:pip install backports.zoneinfo,再导入
# from backports.zoneinfo import ZoneInfo

aps = BlockingScheduler(timezone=ZoneInfo("UTC"))
# 也可使用本地时区,例如"Asia/Shanghai"
# aps = BlockingScheduler(timezone=ZoneInfo("Asia/Shanghai"))

3. 修正代码中的功能异常问题

你的代码存在几处会导致机器人无法正常运行的错误,一并修正:

  • telegram.Bot的消息发送方法是send_message,而非sendmsg
  • Alert类的方法存在笔误和错误调用
  • 创建DataFrame时集合语法错误
  • 避免每次任务执行重复创建机器人实例

修正后的完整代码:

import requests
import telegram
import pandas as pd
from apscheduler.schedulers.background import BlockingScheduler
from zoneinfo import ZoneInfo  # Python 3.9+; 3.8及以下用backports.zoneinfo

# 全局初始化机器人实例,避免重复创建连接
bot_token = "5668522544:AAFqNFcgd5wDBtQbJBhRayfPx9VpVPVjcyQ"
chat_id = 5734902861
core_bot = telegram.Bot(token=bot_token)

# 测试API连接
dt = requests.get('https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD,EUR')
print(dt.text)

# 获取更新测试
updates = core_bot.getUpdates()
for i in updates:
    print(i.message)


class Chatbot:
    def __init__(self, token, chat_id):
        self.core = telegram.Bot(token)
        self.updater = Updater(token)
        self.chat_id = chat_id

    def sendmsg(self, text):
        self.core.send_message(chat_id=self.chat_id, text=text)

    def stop(self):
        self.updater.stop()


class Alert(Chatbot):
    def __init__(self, token, chat_id):
        super().__init__(token, chat_id)
        self.updater.stop()

    def add_command_handler(self, cmd, func):
        self.updater.dispatcher.add_handler(CommandHandler(cmd, func))

    def start_bot(self):
        self.sendmsg("比特币价格提醒机器人已启动!")


# 初始化调度器并指定时区
aps = BlockingScheduler(timezone=ZoneInfo("UTC"))


def push():
    dt = requests.get("https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD,EUR")
    # 使用全局机器人实例发送消息
    core_bot.send_message(chat_id=chat_id, text=dt.text)

    # 修正DataFrame创建逻辑
    price_data = dt.json()
    price_now = pd.DataFrame({
        "USD": [price_data["USD"]],
        "EUR": [price_data["EUR"]]
    })

    # 处理CSV存储,兼容文件不存在的情况
    try:
        data = pd.read_csv("ALERTBOT.csv")
    except FileNotFoundError:
        data = price_now
    else:
        data = pd.concat([data, price_now], ignore_index=True)
    
    data = data.loc[:, ['USD', 'EUR']]
    data.to_csv("ALERTBOT.csv", index=False)


aps.add_job(push, 'interval', seconds=60)
aps.start()

额外说明

  • Python 3.8及以下版本需先安装backports.zoneinfo:pip install backports.zoneinfo,再替换导入语句为from backports.zoneinfo import ZoneInfo
  • 全局初始化机器人实例可避免重复创建连接,提升运行效率
  • 新增CSV文件不存在的异常处理,解决首次运行报错问题

内容的提问来源于stack exchange,提问作者iberiss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:01:16