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

ROBLOX恶意消息拦截脚本失效:已标记但未拦截求助

修复Roblox恶意消息拦截失效问题

核心问题定位

控制台能打印Message has been flagged说明API调用、评分判断逻辑正常,失效原因是拦截动作的执行时机错误:

  • 你之前的词表过滤是同步逻辑,能在消息发送前及时触发拦截;
  • 第三方API调用是异步操作,当API返回结果并执行标记时,消息已经完成发送流程,所以无法拦截。

具体修复步骤

1. 切换到服务器端处理(最可靠方案)

客户端拦截消息存在被绕过的风险,且异步延迟会导致消息已显示才触发拦截。使用Roblox官方ChatService在服务器端处理:

local Players = game:GetService("Players")
local HttpService = game:GetService("HttpService")
-- 引入官方ChatService(需确保ChatServiceRunner在ServerScriptService中)
local ChatService = require(game.ServerScriptService:WaitForChild("ChatServiceRunner"):WaitForChild("ChatService"))

-- 监听新发言者
ChatService.SpeakerAdded:Connect(function(speakerName)
    local speaker = ChatService:GetSpeaker(speakerName)
    -- 监听消息发送事件
    speaker.MessagePosted:Connect(function(message, channelName)
        -- 异步执行API请求,避免阻塞聊天服务
        task.spawn(function()
            local success, response = pcall(function()
                return HttpService:PostAsync("你的API地址", HttpService:JSONEncode({text = message}))
            end)
            if success then
                local data = HttpService:JSONDecode(response)
                -- 验证评分阈值
                if data.NEGATIVE > 0.7 then
                    -- 从聊天频道移除恶意消息
                    speaker:RemoveMessageFromChannel(message, channelName)
                    print("Message has been flagged and removed")
                end
            else
                -- API请求失败时, fallback到之前的词表过滤逻辑
                local badWords = {"hate", "stupid"} -- 替换为你的词表
                for _, word in ipairs(badWords) do
                    if string.find(message:lower(), word) then
                        speaker:RemoveMessageFromChannel(message, channelName)
                        break
                    end
                end
                warn("API request failed, using fallback filter")
            end
        end)
    end)
end)

2. 客户端临时修复(仅作过渡)

如果必须在客户端处理,需先阻止默认消息发送,待API验证后再手动放行合法消息:

local Players = game:GetService("Players")
local HttpService = game:GetService("HttpService")
local LocalPlayer = Players.LocalPlayer
local Chat = game:GetService("Chat")

-- 覆盖默认聊天行为
LocalPlayer.Chatted:Connect(function(message)
    -- 异步执行API验证
    task.spawn(function()
        local success, response = pcall(function()
            return HttpService:PostAsync("你的API地址", HttpService:JSONEncode({text = message}))
        end)
        if success then
            local data = HttpService:JSONDecode(response)
            -- 仅放行非恶意消息
            if data.NEGATIVE <= 0.7 then
                Chat:Chat(LocalPlayer.Character, message)
            else
                print("Message has been flagged")
            end
        else
            -- API失败时使用词表过滤
            local badWords = {"hate", "stupid"}
            local isBad = false
            for _, word in ipairs(badWords) do
                if string.find(message:lower(), word) then
                    isBad = true
                    break
                end
            end
            if not isBad then
                Chat:Chat(LocalPlayer.Character, message)
            end
        end)
    end)
    -- 注意:客户端Chatted事件无法直接取消默认行为,因此必须完全接管聊天发送逻辑
end)

3. 额外检查点

  • 确认API返回字段大小写:确保脚本中读取的是data.NEGATIVE而非data.negative(与API返回格式一致);
  • 验证HttpService权限:确保Roblox开发者控制台中已启用HttpService,且API域名在白名单内;
  • 测试阈值逻辑:确认>0.7的判断符合预期,避免因边界值(如刚好0.7)导致误判。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:54:52