3个技巧让Mac窗口管理效率翻倍:Loop终极指南
2026/3/28 20:37:43
你想要用 Python 搭建一套「京东商品价格监控系统」,核心是通过 API 获取商品价格,结合定时任务实现自动监控,当价格低于设定阈值时触发告警(如弹窗 / 邮件)。我会提供完整可运行的代码,涵盖「价格获取 → 定时监控 → 阈值判断 → 告警通知」全流程,兼顾新手友好性和实用性。
requests(调用 API) +schedule(定时任务) +plyer(桌面弹窗告警) +smtplib(邮件告警);bash
运行
# 核心依赖:API请求 + 定时任务 + 桌面弹窗 + 邮件发送 pip install requests schedule plyer python-dotenv参考之前的步骤,关注博主领取「京东商品详情 API」的AppKey(免费试用足够新手使用)。
创建.env文件,存放敏感配置(避免硬编码):
ini
# .env 文件内容 JD_API_KEY=你的聚合数据AppKey # 邮件告警配置(可选,不用邮件则留空) EMAIL_SENDER=你的邮箱@163.com EMAIL_PASSWORD=你的邮箱授权码(非登录密码) EMAIL_RECEIVER=接收告警的邮箱@qq.com SMTP_SERVER=smtp.163.com SMTP_PORT=465python
运行
import requests import schedule import time import json import os from datetime import datetime from plyer import notification import smtplib from email.mime.text import MIMEText from email.header import Header from dotenv import load_dotenv # 加载.env配置文件 load_dotenv() # ===================== 全局配置(可根据需求修改) ===================== # API配置 JD_API_KEY = os.getenv("JD_API_KEY", "你的聚合数据AppKey") # 优先从.env读取 JD_API_URL = "https://v.juhe.cn/jd/item/detail" # 监控商品列表:{商品ID: (商品名称, 价格阈值)} MONITOR_ITEMS = { "100060195820": ("京东京造保温杯", 90.0), # 商品ID: (名称, 阈值) "100080907904": ("小米充电宝", 80.0), } # 监控频率(单位:分钟) CHECK_INTERVAL = 5 # 日志文件路径 LOG_FILE = "jd_price_monitor.log" # 邮件告警配置(从.env读取) EMAIL_CONFIG = { "sender": os.getenv("EMAIL_SENDER"), "password": os.getenv("EMAIL_PASSWORD"), "receiver": os.getenv("EMAIL_RECEIVER"), "smtp_server": os.getenv("SMTP_SERVER", "smtp.163.com"), "smtp_port": int(os.getenv("SMTP_PORT", 465)) } # ====================================================================== def get_jd_item_price(sku_id): """ 调用京东API获取商品当前价格 :param sku_id: 商品ID :return: (价格浮点数, 商品名称) 或 (None, None) """ params = { "key": JD_API_KEY, "sku_id": sku_id } headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } try: response = requests.get(JD_API_URL, params=params, headers=headers, timeout=10) if response.status_code == 200: result = response.json() if result["error_code"] == 0: item_data = result["result"] price = float(item_data.get("price", 0.0)) # 转为浮点数便于比较 title = item_data.get("title", f"商品{sku_id}") return price, title else: log(f"API调用失败:{result['reason']}(商品ID:{sku_id})", level="ERROR") else: log(f"HTTP请求失败,状态码:{response.status_code}(商品ID:{sku_id})", level="ERROR") except Exception as e: log(f"获取价格异常:{str(e)}(商品ID:{sku_id})", level="ERROR") return None, None def log(content, level="INFO"): """记录监控日志""" log_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") log_content = f"[{log_time}] [{level}] {content}\n" # 打印到控制台 print(log_content.strip()) # 写入日志文件 with open(LOG_FILE, "a", encoding="utf-8") as f: f.write(log_content) def send_desktop_notification(title, message): """发送桌面弹窗告警""" try: notification.notify( title=title, message=message, app_name="京东价格监控", timeout=10 # 弹窗显示10秒 ) except Exception as e: log(f"桌面弹窗告警失败:{str(e)}", level="ERROR") def send_email_notification(item_name, current_price, threshold): """发送邮件告警(需配置邮箱信息)""" if not all([EMAIL_CONFIG["sender"], EMAIL_CONFIG["password"], EMAIL_CONFIG["receiver"]]): log("邮箱配置不完整,跳过邮件告警", level="WARNING") return try: # 构造邮件内容 subject = f"【京东价格监控】{item_name}降价啦!" body = f""" <p>商品名称:{item_name}</p> <p>当前价格:{current_price}元</p> <p>设定阈值:{threshold}元</p> <p>告警时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</p> """ msg = MIMEText(body, "html", "utf-8") msg["From"] = Header(EMAIL_CONFIG["sender"], "utf-8") msg["To"] = Header(EMAIL_CONFIG["receiver"], "utf-8") msg["Subject"] = Header(subject, "utf-8") # 发送邮件 with smtplib.SMTP_SSL(EMAIL_CONFIG["smtp_server"], EMAIL_CONFIG["smtp_port"]) as server: server.login(EMAIL_CONFIG["sender"], EMAIL_CONFIG["password"]) server.sendmail(EMAIL_CONFIG["sender"], EMAIL_CONFIG["receiver"], msg.as_string()) log(f"邮件告警发送成功(接收人:{EMAIL_CONFIG['receiver']})") except Exception as e: log(f"邮件告警失败:{str(e)}", level="ERROR") def check_price(): """价格检查核心逻辑""" log("开始执行价格检查任务") for sku_id, (item_name, threshold) in MONITOR_ITEMS.items(): # 获取当前价格 current_price, real_item_name = get_jd_item_price(sku_id) if current_price is None: continue # 获取价格失败,跳过 # 记录当前价格 log(f"{real_item_name} 当前价格:{current_price}元(阈值:{threshold}元)") # 判断是否低于阈值 if current_price < threshold: alert_msg = f"{real_item_name} 当前价格{current_price}元,低于设定阈值{threshold}元!" log(alert_msg, level="ALERT") # 触发告警 send_desktop_notification("价格告警", alert_msg) send_email_notification(real_item_name, current_price, threshold) log("价格检查任务执行完成") def run_monitor(): """启动监控系统""" log("===== 京东价格监控系统启动 =====") log(f"监控商品数量:{len(MONITOR_ITEMS)}") log(f"检查频率:每{CHECK_INTERVAL}分钟") # 立即执行一次检查 check_price() # 配置定时任务 schedule.every(CHECK_INTERVAL).minutes.do(check_price) # 持续运行 while True: schedule.run_pending() time.sleep(60) # 每秒检查一次定时任务 if __name__ == "__main__": try: run_monitor() except KeyboardInterrupt: log("===== 京东价格监控系统手动停止 =====") except Exception as e: log(f"监控系统异常退出:{str(e)}", level="CRITICAL")表格
| 函数 | 作用 | 核心亮点 |
|---|---|---|
get_jd_item_price | 获取商品价格 | 异常捕获 + 结果校验,失败返回 None,不影响整体监控 |
log | 日志记录 | 控制台 + 文件双输出,便于排查问题 |
send_desktop_notification | 桌面弹窗 | 跨平台支持(Windows/macOS/Linux),无需额外配置 |
send_email_notification | 邮件告警 | 支持 SSL 加密,配置灵活,缺省则自动跳过 |
check_price | 价格检查 | 遍历所有监控商品,阈值判断 + 告警触发 |
run_monitor | 启动监控 | 立即执行 + 定时任务,持续运行不中断 |
MONITOR_ITEMS:替换为你要监控的商品 ID、名称和价格阈值;CHECK_INTERVAL:修改监控频率(建议≥5 分钟,避免 API 调用超限);.env文件:填写 API 密钥和邮箱信息(邮件告警需配置)。https://item.jd.com/100060195820.html中的100060195820);bash
运行
python jd_price_monitor.py运行后效果:
plaintext
[2026-02-10 15:30:00] [INFO] ===== 京东价格监控系统启动 ===== [2026-02-10 15:30:00] [INFO] 监控商品数量:2 [2026-02-10 15:30:00] [INFO] 检查频率:每5分钟 [2026-02-10 15:30:00] [INFO] 开始执行价格检查任务 [2026-02-10 15:30:01] [INFO] 京东京造保温杯 当前价格:89.9元(阈值:90.0元) [2026-02-10 15:30:01] [ALERT] 京东京造保温杯 当前价格89.9元,低于设定阈值90.0元! [2026-02-10 15:30:01] [INFO] 邮件告警发送成功(接收人:xxx@qq.com) [2026-02-10 15:30:02] [INFO] 小米充电宝 当前价格:85.0元(阈值:80.0元) [2026-02-10 15:30:02] [INFO] 价格检查任务执行完成创建start.bat文件,实现后台运行(关闭窗口不停止):
bat
@echo off pythonw jd_price_monitor.py exitMONITOR_ITEMS即可生效;schedule实现定时任务,调用京东 API 获取价格,阈值判断后触发弹窗 / 邮件告警;MONITOR_ITEMS添加监控商品,配置.env文件填写 API 密钥和邮箱信息;这套系统完全适配个人用户的价格监控需求,代码结构清晰,可根据自身需求灵活扩展功能。