You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

修复Roblox聊天消息推送Discord程序中的KeyError: 'data'问题及潜在bug咨询

修复Roblox聊天消息推送Discord程序中的KeyError: 'data'问题及潜在bug咨询

首先来说你遇到的KeyError: 'data'问题,这个错误的核心原因是:你的请求没有从Roblox API拿到预期的响应。大概率是这两种情况:

  • 你填写的cookie无效(比如过期、格式错误,或者被Roblox的反机制拦截),导致API返回了错误内容(比如401未授权的JSON,里面根本没有data字段);
  • 网络问题导致请求未成功,返回的内容不是合法的JSON格式。

先解决KeyError的直接修复方案

你可以给请求加上错误处理逻辑,先确认请求是否成功,再去读取data字段,避免直接访问不存在的键:

import requests
import json

# 建议后续用环境变量存储敏感信息,不要直接写在代码里
cookie = "__"
webhook_url = "__"

try:
    conversations_response = requests.get(
        "https://chat.roblox.com/v2/get-user-conversations?pageNumber=1&pageSize=30",
        headers={"Cookie": cookie}
    )
    # 自动抛出HTTP请求错误(比如401、403),快速定位授权问题
    conversations_response.raise_for_status()
    
    # 用get方法避免KeyError,没有data就返回空列表
    conversations_data = conversations_response.json().get('data', [])
    unread_conversations = [
        conversation for conversation in conversations_data
        # 同样用get处理字段不存在的情况
        if conversation.get("hasUnreadMessages", False)
    ]
    
    for conversation in unread_conversations:
        try:
            messages_response = requests.get(
                f"https://chat.roblox.com/v2/get-conversation-messages?conversationId={conversation['id']}&pageSize=50",
                headers={"Cookie": cookie}
            )
            messages_response.raise_for_status()
            
            messages_data = messages_response.json().get('data', [])
            if not messages_data:
                print(f"对话 {conversation['title']} 没有消息数据")
                continue
                
            latest_message = messages_data[-1]
            message_contents = latest_message.get("content", "无内容")
            
            discord_message = {
                "embeds": [{
                    "title": f"New message from {conversation['title']}",
                    "description": message_contents
                }]
            }
            # 检查Discord推送是否成功
            discord_response = requests.post(webhook_url, json=discord_message)
            discord_response.raise_for_status()
            print(f"成功推送消息到Discord: {message_contents}")
            
        except requests.exceptions.RequestException as e:
            print(f"处理对话 {conversation['title']} 失败: {e}")
            
except requests.exceptions.RequestException as e:
    print(f"获取对话列表失败: {e}")

另外要重点确认:你的cookie是否是完整有效的Roblox会话凭证?正常应该是类似.ROBLOSECURITY=你的会话字符串这样的完整格式,如果只是填了__,那肯定会导致授权失败,这是最常见的触发这个错误的原因!

代码里的其他潜在bug和优化建议

除了当前的KeyError,你的代码还有几个需要注意的点:

  • 重复推送问题:每次运行程序都会把所有未读对话的最新消息推一次,如果重复运行脚本,会重复推送相同的消息。解决方法是:推送后调用Roblox的mark-conversation-as-read API标记对话为已读,或者记录每次推送的最新消息ID,下次运行时只推送比这个ID新的消息。
  • 分页覆盖问题:如果某个对话的消息超过50条,messages_data[-1]可能不是真正的最新未读消息(Roblox API通常把最新消息放在数组最后,但如果未读消息在更早的分页里,就会漏掉)。可以考虑循环获取所有分页的消息,或者先检查未读消息的起始位置。
  • 安全性问题:直接把cookie写在代码里非常不安全,建议用环境变量(比如os.getenv("ROBLOX_COOKIE"))或者单独的配置文件来存储敏感信息。
  • 异常处理缺失:原代码没有处理网络请求失败、JSON解析失败等异常,一旦出现问题就会直接崩溃,上面的修改版加了try-except块来捕获这些异常,让程序更健壮。

备注:内容来源于stack exchange,提问作者Faded

火山引擎 最新活动