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




