自制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)
关键修复说明
- 移除错误事件装饰器:去掉
check_color上的@client.event,改为在Bot启动后通过client.loop.create_task主动启动监控任务 - 修正频道ID类型:将字符串格式的频道ID改为整数,确保
client.get_channel能正确定位频道 - 添加定时监控逻辑:用
while循环+asyncio.sleep实现持续定期检查,确保Bot运行期间一直监控库存 - 改用异步请求:用
aiohttp替代同步的requests,避免阻塞Bot的事件循环,保证Bot正常响应其他操作 - 优化解析判断逻辑:直接定位目标颜色块,通过
disabled类判断库存状态,更符合目标网站的实际结构 - 添加异常处理:捕获请求和解析过程中的异常,避免单次错误导致整个监控任务终止
- 增加防刷屏机制:发送提醒后暂停1小时,避免短时间内重复推送相同消息
额外注意事项
- 确保Bot拥有目标频道的「查看频道」和「发送消息」权限
- 可根据需求调整
CHECK_INTERVAL,不要设置过短,避免被目标网站封禁IP - 如果遇到反爬限制,可给
aiohttp请求添加自定义请求头(比如User-Agent)
内容的提问来源于stack exchange,提问作者vince
相关产品推荐
相关产品推荐

