Python实现Allkeyshop礼品卡低价Telegram通知工具报错求助
修复Allkeyshop价格监控Telegram通知程序
原代码核心问题
- 重复初始化Chrome Driver,造成不必要的资源消耗
- 依赖固定
sleep(1)等待元素,稳定性差,易受网络速度影响 - 无循环检测逻辑,无法实现7*24小时持续监控
- 价格元素定位不准确,无法确保获取最低价格
- Telegram Bot实例每次重新创建,效率低下
- 缺少细分异常处理,难以定位具体报错原因
修正后的完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options import telegram from time import sleep # 配置参数 BOT_TOKEN = "YOUR_BOT_TOKEN" # 替换为你的Telegram Bot Token CHAT_ID = "YOUR_CHAT_ID" # 替换为你的Telegram聊天ID TARGET_URL = "https://www.allkeyshop.com/blog/xbox-gift-card-germany/?editions=168" PRICE_THRESHOLD = 79.99 # 价格阈值 CHECK_INTERVAL = 3600 # 检查间隔(秒,示例为1小时) # 初始化Telegram Bot(仅初始化一次) bot = telegram.Bot(token=BOT_TOKEN) def setup_driver(): """配置并返回Chrome Driver实例""" chrome_options = Options() # 无头模式,后台运行(服务器环境推荐开启) chrome_options.add_argument("--headless=new") # 禁用GPU加速,避免部分环境报错 chrome_options.add_argument("--disable-gpu") # 禁用图片加载,提升页面加载速度 chrome_options.add_argument("--blink-settings=imagesEnabled=false") # 设置窗口大小,避免元素定位异常 chrome_options.add_argument("--window-size=1920,1080") driver = webdriver.Chrome(options=chrome_options) return driver def get_lowest_price(driver): """获取包含PayPal手续费的最低价格""" try: # 等待页面主容器加载完成 WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.ID, "offer_filters_form")) ) # 等待"包含PayPal手续费"复选框可点击并操作 paypal_checkbox = WebDriverWait(driver, 15).until( EC.element_to_be_clickable((By.XPATH, '//label[contains(text(), "Include PayPal Fees")]/input')) ) if not paypal_checkbox.is_selected(): paypal_checkbox.click() # 等待价格列表更新,获取排序后的第一个最低价格元素 lowest_price_element = WebDriverWait(driver, 20).until( EC.visibility_of_element_located((By.CSS_SELECTOR, "div.x-offer-list-item:first-child span.x-offer-buy-btn-in-stock")) ) price_text = lowest_price_element.text.strip() # 处理价格格式,如"80,99 €"转为浮点数 price = float(price_text.replace("€", "").replace(",", ".").strip()) return price, price_text except Exception as e: print(f"获取价格失败: {str(e)}") return None, None def send_telegram_notification(price_text): """发送Telegram通知""" try: message = f"⚠️ Xbox德国礼品卡价格低于阈值!当前最低价格:{price_text}" bot.send_message(chat_id=CHAT_ID, text=message) print("通知已发送") except Exception as e: print(f"发送通知失败: {str(e)}") def main(): print("启动价格监控程序...") while True: driver = None try: driver = setup_driver() driver.get(TARGET_URL) price, price_text = get_lowest_price(driver) if price is not None and price < PRICE_THRESHOLD: send_telegram_notification(price_text) else: print(f"当前价格{price_text},未低于阈值{PRICE_THRESHOLD}€") except Exception as e: print(f"循环执行出错: {str(e)}") finally: # 确保浏览器关闭,避免内存泄漏 if driver: driver.quit() # 等待指定间隔后再次检查 print(f"等待{CHECK_INTERVAL/3600}小时后重新检查...") sleep(CHECK_INTERVAL) if __name__ == "__main__": main()
关键修改说明
Driver初始化优化
- 新增
setup_driver()函数统一配置Chrome选项,支持无头后台运行 - 移除重复的Driver初始化代码,减少资源浪费
- 新增
稳定性提升
- 用显式等待
WebDriverWait替代固定sleep,确保元素加载完成后再操作 - 优化复选框定位逻辑,通过文本内容匹配,避免因页面结构变化导致定位失效
- 用显式等待
循环监控逻辑
- 添加
while True循环,配合CHECK_INTERVAL实现周期性自动检查 - 每次检查后关闭浏览器,避免长期运行内存泄漏
- 添加
价格定位准确性
- 定位排序后的第一个价格元素,确保获取当前最低价格
- 增强价格格式处理,兼容不同格式的价格字符串
效率优化
- Telegram Bot实例仅初始化一次,减少不必要的API请求
- 禁用图片加载,提升页面加载速度
常见问题排查
- 元素定位失败:打开浏览器开发者工具检查页面元素结构,调整xpath或CSS选择器
- Telegram通知失败:核对Bot Token和Chat ID正确性,确保Bot已加入目标聊天
- Chrome Driver报错:确保Chrome版本与Driver版本匹配,将Driver路径加入系统环境变量
内容的提问来源于stack exchange,提问作者ZLP42
相关产品推荐
相关产品推荐

