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

Discord机器人问题:无法接收输入、调用爬虫脚本及传参需求

问题修复与功能实现方案

1. 解决机器人无法接收聊天输入的问题

原代码未开启Discord要求的message_content意图,这是bot读取消息内容的必要权限,直接导致命令无法被触发。修改Intents配置:

intents = discord.Intents.default()
intents.message_content = True  # 必须开启此权限才能读取消息
intents.typing = True
intents.presences = False

2. 完整实现:用户输入关键词 + 调用爬虫并返回结果

修改后的机器人代码,实现请求用户输入、传递参数给爬虫、捕获并输出爬取结果的完整流程:

import discord
from discord.ext import commands
import subprocess
import sys

intents = discord.Intents.default()
intents.message_content = True
intents.typing = True
intents.presences = False

bot = commands.Bot(command_prefix='!', intents=intents)

@bot.event
async def on_ready():
    print(f'Logged in as {bot.user.name}')

@bot.command()
async def socialblade(ctx):
    # 提示用户输入查询关键词
    await ctx.send('请输入要查询的用户名:')
    
    # 等待命令发起者输入,超时60秒
    try:
        user_input = await bot.wait_for(
            'message',
            check=lambda m: m.author == ctx.author,
            timeout=60.0
        )
        username = user_input.content.strip()
    except TimeoutError:
        await ctx.send('输入超时,请重新执行!socialblade命令')
        return
    
    # 调用爬虫脚本并传递参数,捕获输出
    try:
        # 用sys.executable确保使用当前Python环境运行脚本
        scrape_result = subprocess.run(
            [sys.executable, 'Scraper.py', username],
            capture_output=True,
            text=True,
            check=True
        )
        # 输出爬取结果到频道
        if scrape_result.stdout:
            await ctx.send(f'爬取结果:\n{scrape_result.stdout}')
        else:
            await ctx.send('未获取到有效数据')
    except subprocess.CalledProcessError as e:
        await ctx.send(f'爬虫运行出错:{e.stderr}')
    except FileNotFoundError:
        await ctx.send('未找到Scraper.py文件,请检查路径')

bot.run('你的机器人令牌')

3. 适配Scraper.py接收命令行参数

需要修改Scraper.py,使其支持从命令行接收username参数,并将结果打印到标准输出(供机器人捕获):

# Scraper.py 示例适配代码
import sys

def main(username):
    # 这里替换成你的爬虫逻辑,返回要输出的文本内容
    return f"用户 {username} 的SocialBlade数据:[具体数据]"

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("请传入用户名参数")
        sys.exit(1)
    target_username = sys.argv[1]
    result = main(target_username)
    print(result)  # 必须打印结果,机器人才能通过stdout捕获

核心说明

  • 权限问题:message_content是Discord V2 API强制要求的权限,未开启则bot无法读取任何消息内容。
  • 脚本调用:使用sys.executable避免多Python环境导致的路径问题,capture_output=True用于捕获爬虫的输出内容。
  • 交互逻辑:通过wait_for限定仅接收命令发起者的输入,避免无关用户干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:05:17