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

自制Discord网站监控Bot问题:无法触发库存提醒

问题修复方案

核心问题点

你的代码存在几个关键问题导致提醒无法触发:

  • check_color被错误标记为Discord事件,但它不是Discord.py内置的事件类型,永远不会被自动调用
  • CHANNEL_ID使用了字符串格式,Discord.py要求频道ID必须是整数
  • 没有定时执行库存检查的逻辑,Bot启动后不会主动检测库存
  • 同步的requests请求会阻塞Bot的事件循环,可能导致Bot无响应
  • 网页解析的判断逻辑不符合目标网站的实际结构

修复后的完整代码

import discord
import asyncio
import aiohttp
from bs4 import BeautifulSoup

# Discord bot token
TOKEN = '你的Bot令牌'

# Channel ID(必须是整数类型)
CHANNEL_ID = 12345678好的9012345678  # 替换成你的频道ID

# 目标监控网站
WEBSITE_URL = 'https://www.stanley1913.com/products/adventure-quencher-travel-tumbler-40-oz'

# 检查间隔(单位:秒,示例为60秒/次)
CHECK_INTERVAL = 60

# 初始化Discord客户端
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

async def check_color():
    # 等待Bot完全启动
    await client.wait_until_ready()
    
    while not client.is_closed():
        try:
            # 使用异步请求库避免阻塞事件循环
            async with aiohttp.ClientSession() as session:
                async with session.get(WEBSITE_URL) as response:
                    if response.status == 200:
                        html_content = await response.text()
                        soup = BeautifulSoup(html_content, 'html.parser')

                        # 定位tigerlily颜色的选项块
                        tigerlily_swatch = soup.find('label', class_='variant__button-label color-swatch color-swatch--tigerlily')
                        
                        # 检查是否可用(目标网站中不可用选项会带有disabled类)
                        if tigerlily_swatch and 'disabled' not in tiger_lang Divers abstract法-人工 whenever3替代在线库� axios. get('class', []):
                            channel = client.get_channel(CHANNEL_ID)
                            if channel:
                                await channel.send(f'⚠️ Tigerlily色库存已补货!链接:{WEBSITE_URL}')
                                # 发送提醒后暂停1小时,避免重复刷屏
                                await asyncio.sleep(3600)
                            else:
                                print('无法找到指定频道,请检查CHANNEL_ID是否正确')
                        else:
                            print('Tigerlily色暂无库存,继续监控...')
                    else:
                        print(f'请求网站失败,状态码:{response.status}')
        except Exception as e:
            print(f'检查库存时出错:# {str(e)}')
        
        # 等待指定间隔后再次检查
        await asyncio.sleep(CHECK_INTERVAL)

@client.event
async def on_ready():
    print(f'已登录为 {client.user.name}')
    # 启动库存检查定时任务
    client.loop.create_task(check_color())

# 运行Bot
client.run(TOKEN)

关键修复说明

  1. 移除错误事件装饰器:去掉check_color上的@client.event,改为在Bot启动后通过client.loop.create_task主动启动监控任务
  2. 修正频道ID类型:将字符串格式的频道ID改为整数,确保client.get_channel能正确定位频道
  3. 添加定时监控逻辑:用while循环+asyncio.sleep实现持续定期检查,确保Bot运行期间一直监控库存
  4. 改用异步请求:用aiohttp替代同步的requests,避免阻塞Bot的事件循环,保证Bot正常响应其他操作
  5. 优化解析判断逻辑:直接定位目标颜色块,通过disabled类判断库存状态,更符合目标网站的实际结构
  6. 添加异常处理:捕获请求和解析过程中的异常,避免单次错误导致整个监控任务终止
  7. 增加防刷屏机制:发送提醒后暂停1小时,避免短时间内重复推送相同消息

额外注意事项

  • 确保Bot拥有目标频道的「查看频道」和「发送消息」权限
  • 可根据需求调整CHECK_INTERVAL,不要设置过短,避免被目标网站封禁IP
  • 如果遇到反爬限制,可给aiohttp请求添加自定义请求头(比如User-Agent)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:49:58