如何为对接CoinMarketCap的Telegram BTC价格提醒Python bot添加/start命令
Telegram BTC价格提醒机器人添加/start命令解决方案
问题根源
原代码仅实现了定时拉取BTC价格、硬编码单发消息的逻辑,没有监听Telegram的消息更新,因此无法响应/start命令,也无法适配群组场景。
实现思路
- 使用
python-telegram-bot库监听Telegram消息,实现/start命令响应,自动收集触发命令的聊天ID(支持私聊、群组) - 用多线程分离「消息监听」和「价格监控定时任务」两个逻辑,避免互相阻塞
- 支持多用户/多群组同时订阅提醒
前置依赖
先安装所需第三方库:
pip install python-telegram-bot==13.7 requests
完整修改后代码
import requests import time import threading from telegram.ext import Updater, CommandHandler # 配置项 api_key = 'your_coinmarketcap_api_key' bot_token = 'your_telegram_bot_token' threshold = 30000 time_interval = 5 * 60 # 价格拉取间隔,单位秒 # 存储所有订阅提醒的聊天ID(支持多个私聊/群组) subscribed_chats = set() def get_btc_price(): url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest' headers = { 'Accepts': 'application/json', 'X-CMC_PRO_API_KEY': api_key } response = requests.get(url, headers=headers) response_json = response.json() btc_price = response_json['data'][0] return btc_price['quote']['USD']['price'] def send_message(chat_id, msg): url = f"https://api.telegram.org/bot{bot_token}/sendMessage?chat_id={chat_id}&text={msg}" requests.get(url) # /start命令处理逻辑 def start(update, context): chat_id = update.effective_chat.id subscribed_chats.add(chat_id) context.bot.send_message(chat_id=chat_id, text="✅ BTC价格提醒已启动\n当前提醒阈值:低于30000USDT即时推送\n每30分钟推送一次最近6次价格记录") # 价格监控任务,单独线程运行 def price_monitor(): price_list = [] while True: try: price = get_btc_price() price_list.append(round(price, 2)) # 仅给已订阅的聊天发消息 for chat_id in subscribed_chats: # 低于阈值触发告警 if price < threshold: send_message(chat_id=chat_id, msg=f'⚠️ BTC价格下跌提醒:{price} USDT') # 存够6次推送历史 if len(price_list) >= 6: send_message(chat_id=chat_id, msg=f'📊 最近30分钟BTC价格记录:\n{"、".join(map(str, price_list))}') if len(price_list) >= 6: price_list = [] except Exception as e: print(f"运行异常:{str(e)}") time.sleep(time_interval) def main(): # 启动价格监控线程 monitor_thread = threading.Thread(target=price_monitor, daemon=True) monitor_thread.start() # 启动Telegram消息监听 updater = Updater(bot_token) dp = updater.dispatcher dp.add_handler(CommandHandler("start", start)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
部署注意事项
- 群组使用前需要先在BotFather处关闭隐私模式:给@BotFather发送
/setprivacy,选择你的机器人,点击Disable,否则机器人无法接收群组内的/start命令 - 若群组开启了全员禁言,需要将机器人设为管理员,开放发消息权限
- 代码启动后,在需要接收提醒的私聊窗口或群组发送
/start即可触发订阅
内容的提问来源于stack exchange,提问作者Pie Mark
相关产品推荐
相关产品推荐

