如何使用PowerShell开发符合指定功能要求的Discord机器人
PowerShell Discord 机器人核心功能实现
前置准备
你作为服务器所有者可先完成以下配置:
- 前往Discord官方开发者平台创建应用,在「Bot」分类页开启Message Content Intent开关,复制生成的Bot令牌留用
- 生成机器人邀请链接时勾选以下权限:
Send Messages、Read Message History、Read Messages/View Channels、Manage Messages,将机器人邀请至目标服务器
核心实现代码
以下为纯PowerShell编写的基础功能框架,已覆盖你需要的4项核心能力,后续业务逻辑可自行扩展:
# 配置项:填入你自己的Bot令牌 $botToken = "你的Bot令牌" $apiBase = "https://discord.com/api/v10" $headers = @{ "Authorization" = "Bot $botToken" "Content-Type" = "application/json" } # 功能1:发送消息函数 function Send-DiscordMessage { param( [string]$ChannelId, [string]$Content ) $body = @{content = $Content} | ConvertTo-Json Invoke-RestMethod -Uri "$apiBase/channels/$ChannelId/messages" -Method Post -Headers $headers -Body $body } # 功能2:编辑消息函数 function Edit-DiscordMessage { param( [string]$ChannelId, [string]$MessageId, [string]$NewContent ) $body = @{content = $NewContent} | ConvertTo-Json Invoke-RestMethod -Uri "$apiBase/channels/$ChannelId/messages/$MessageId" -Method Patch -Headers $headers -Body $body } # 功能3:获取消息反应函数 function Get-DiscordMessageReactions { param( [string]$ChannelId, [string]$MessageId, [string]$Emoji = $null ) if ($Emoji) { $uri = "$apiBase/channels/$ChannelId/messages/$MessageId/reactions/$([Uri]::EscapeDataString($Emoji))" return Invoke-RestMethod -Uri $uri -Method Get -Headers $headers } else { $uri = "$apiBase/channels/$ChannelId/messages/$MessageId" $message = Invoke-RestMethod -Uri $uri -Method Get -Headers $headers return $message.reactions } } # 网关连接逻辑,用于接收实时消息 $ws = New-Object System.Net.WebSockets.ClientWebSocket $ct = New-Object System.Threading.CancellationToken $gatewayUrl = (Invoke-RestMethod -Uri "$apiBase/gateway" -Headers $headers).url $connectTask = $ws.ConnectAsync($gatewayUrl, $ct) while (!$connectTask.IsCompleted) { Start-Sleep -Milliseconds 100 } # 发送身份验证包 $identifyPayload = @{ op = 2 d = @{ token = $botToken intents = 512 + 32768 # GUILD_MESSAGES + MESSAGE_CONTENT 意图 properties = @{ os = "windows" browser = "powershell" device = "powershell" } } } | ConvertTo-Json -Depth 10 $buffer = [System.Text.Encoding]::UTF8.GetBytes($identifyPayload) $sendTask = $ws.SendAsync($buffer, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, $ct) while (!$sendTask.IsCompleted) { Start-Sleep -Milliseconds 100 } # 监听消息事件循环 $receiveBuffer = [System.Byte[]]::CreateInstance([System.Byte], 4096) while ($ws.State -eq [System.Net.WebSockets.WebSocketState]::Open) { $result = $ws.ReceiveAsync($receiveBuffer, $ct) while (!$result.IsCompleted) { Start-Sleep -Milliseconds 100 } $response = [System.Text.Encoding]::UTF8.GetString($receiveBuffer, 0, $result.Result.Count) $payload = $response | ConvertFrom-Json -ErrorAction SilentlyContinue if ($payload.t -eq "MESSAGE_CREATE") { $message = $payload.d # 过滤机器人自己发的消息 if ($message.author.bot) { continue } # 功能4:匹配psdo前缀的消息 if ($message.content.StartsWith("psdo ")) { # 此处可扩展自定义业务逻辑,下方为功能演示代码 $sendResult = Send-DiscordMessage -ChannelId $message.channel_id -Content "收到前缀命令:$($message.content)" # 演示:3秒后编辑刚发送的消息 Start-Sleep 3 Edit-DiscordMessage -ChannelId $message.channel_id -MessageId $sendResult.id -NewContent "命令已处理完成:$($message.content)" # 演示:获取触发命令的原消息的所有反应 $reactions = Get-DiscordMessageReactions -ChannelId $message.channel_id -MessageId $message.id } } # 基础心跳逻辑,生产环境可自行优化为定时触发 if ($payload.op -eq 10) { $heartbeatPayload = @{op = 1; d = $null} | ConvertTo-Json $hbBuffer = [System.Text.Encoding]::UTF8.GetBytes($heartbeatPayload) $ws.SendAsync($hbBuffer, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, $ct) | Out-Null } }
补充说明
- 代码中四个核心功能都做了明确标注,可直接在前缀匹配的逻辑分支内扩展自定义业务
- 如需发送嵌入消息、提及用户等效果,只需修改对应函数请求体的结构即可
- 长时间运行的场景下可单独设置定时器按网关返回的间隔发送心跳包,避免连接断开
内容的提问来源于stack exchange,提问作者David Avarage
相关产品推荐
相关产品推荐

