使用discord.py调用Bible API获取随机经文遇KeyError问题求助
问题修复方案
核心错误分析
- KeyError 触发原因:有效响应的JSON数据里不存在
error字段,直接用json_data['error']访问会抛出异常,必须用安全的字段检查方式。 - URL格式错误:请求地址中多余的横杠(
-)导致API无法正确解析章节,不符合BOOK+CHAPTER:VERSE的要求。 - 数据访问错误:API返回的是单个字典而非列表,用
json_data[0]['reference']索引会报错。 - 循环无终止逻辑:原代码仅设置
find_book = False但未跳出循环,会陷入无限执行。
修复后的完整代码
import requests import json import random # 替换为你的圣经书籍名称列表 bible_books = ["Genesis", "Exodus", "Leviticus", "Romans", "John"] def get_random_bible_verse(): while True: # 生成符合API要求的请求地址 book = random.choice(bible_books) chapter = random.randint(1, 150) verse = random.randint(1, 176) url = f"https://bible-api.com/{book}+{chapter}:{verse}" response = requests.get(url) json_data = json.loads(response.text) # 安全检查error字段,不存在则返回None if json_data.get('error') != 'not found': # 正确提取经文信息 reference = json_data['reference'] verse_text = json_data['text'].strip() translation = json_data['translation_name'] # 打印并返回结果 print(f"{reference} ({translation})") print(verse_text) return reference, verse_text, translation
关键修复点说明
- 安全检查错误字段:使用
json_data.get('error')替代直接索引,避免KeyError,当字段不存在时返回None,自然跳过错误判断逻辑。 - 修正请求URL:移除多余的横杠,严格遵循API的
BOOK+CHAPTER:VERSE格式,减少无效请求。 - 正确访问数据:直接通过字典键提取内容(
json_data['reference']、json_data['text']),无需列表索引。 - 添加终止逻辑:获取有效数据后用
return终止函数,同时返回所需的经文信息供discord.py调用。
额外优化建议
不同圣经书籍的章节数差异很大(比如罗马书仅16章,诗篇有150章),可以给每个书籍配置对应的最大章节数,减少无效请求次数,示例:
book_chapters = { "Genesis": 50, "Exodus": 40, "Romans": 16, "John": 21 } # 生成章节时使用对应书籍的最大章节数 chapter = random.randint(1, book_chapters[book])
内容的提问来源于stack exchange,提问作者Beronicous
相关产品推荐
相关产品推荐

