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

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()

关键修改说明

  1. Driver初始化优化

    • 新增setup_driver()函数统一配置Chrome选项,支持无头后台运行
    • 移除重复的Driver初始化代码,减少资源浪费
  2. 稳定性提升

    • 用显式等待WebDriverWait替代固定sleep,确保元素加载完成后再操作
    • 优化复选框定位逻辑,通过文本内容匹配,避免因页面结构变化导致定位失效
  3. 循环监控逻辑

    • 添加while True循环,配合CHECK_INTERVAL实现周期性自动检查
    • 每次检查后关闭浏览器,避免长期运行内存泄漏
  4. 价格定位准确性

    • 定位排序后的第一个价格元素,确保获取当前最低价格
    • 增强价格格式处理,兼容不同格式的价格字符串
  5. 效率优化

    • Telegram Bot实例仅初始化一次,减少不必要的API请求
    • 禁用图片加载,提升页面加载速度

常见问题排查

  • 元素定位失败:打开浏览器开发者工具检查页面元素结构,调整xpath或CSS选择器
  • Telegram通知失败:核对Bot Token和Chat ID正确性,确保Bot已加入目标聊天
  • Chrome Driver报错:确保Chrome版本与Driver版本匹配,将Driver路径加入系统环境变量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:37:52