我目前正在尝试编写一个程序,该程序从NASA天文图片每日一图API获取数据,然后将数据以简单网页的形式呈现给用户。API返回的是JSON格式的数据,我在Python中将其转换为简单的文本字符串。由于这个字符串非常长,我试图使用Google的Gemini AI API将文本作为输入并提供摘要。然而,每当我使用我的API密钥时,它只是返回一个KeyError,指向os.py文件中的行(不是我的程序)。我可以通过Google AI Studio网站访问我的API,网站上显示有几次请求被接收。任何帮助都将不胜感激!
以下是我的代码:(请查看第12-14行以了解API配置,以及apod()函数的最后部分以了解问题代码)(为了隐私,已将实际的API密钥替换为API KEY)
# 导入功能模块import requests import google.generativeai as genai # AI编译器import os# requests模块 --> 允许我们向API发送/接收数据包# 我们在这个程序中使用了3个API;2个NASA开放API和一个Google AI API SDK。# 我们从前两个API中提取信息,并使用Google API进行总结,# 然后以简单网页的形式呈现给用户。# NASA API配置key = 个人开发密钥 # --> NASA API密钥# Google API配置 --> 在开发AI密钥后迁移到openai genai.configure(api_key=os.environ["API KEY"]) # --> Google AI API model = genai.GenerativeModel("gemini-1.5-flash") # --> 生成稳定模型# API引用字典apis = { "apod" : "https://api.nasa.gov/planetary/apod?api_key="+ key }# 检查API错误代码rcodes = { 200 : "成功", 301 : "重定向", 400 : "无效请求", 401 : "无效登录", 403 : "未授权页面", 404 : "页面未找到", 503 : "服务器未准备好"}# 函数用于通过Google OpenAI库传递文本: -> # 解析每个API数据的函数块def apod(data): # 此块将apod数据追加到data.txt f.write(i + ": \n") print(data['date']) # 日期 f.write(str(data['url'] + "\n")) # URL imgexp = str(data['explanation']) # 变量用于存储说明 f.write(imgexp) # <-- 将说明写入data.txt airesp = model.generate_content("总结以下文本,优先考虑科学信息,同时保持足够简单,以便非专业人士也能理解:" + imgexp) print(airesp) f = open("data.txt", "w") # 以写入模式打开数据文件for i in apis: # 遍历API列表 # 从API获取数据:I response = requests.get(apis[i]) # 返回状态代码 respt = response.json() # 将API数据的文本值存储为字典 # 完全集成后删除此部分 --> print(i + "-" + rcodes[response.status_code]) # 打印状态代码 print(respt['url']) # 完全集成后删除此部分 <-- # 确定解析函数的块 if i == "apod": apod(respt) # <-- 将API响应的字典通过解析函数传递 else: pass # 最后调用此行,以启用完整数据写入f.close() # 关闭文件以防止意外写入
运行此代码会导致:
genai.configure(api_key=os.environ['API KEY']) # --> Google AI API File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/os.py", line 675, in __getitem__ raise KeyError(key) from NoneKeyError: 'API KEY'
回答:
您不应将API密钥包含在代码中 – 请将它们分开存放。
一种方法(有几种方法)是使用一个Python脚本,从中导入所需的值。在我的开发环境中,我有一个apikeys.py文件来存储我的密钥。
使用这种方法,您可以实现一个更简单的实现,如下所示:
import google.generativeai as genaiimport requestsfrom apikeys import NASA, GAPIfrom functools import cacheAI = "总结以下文本,优先考虑科学信息,同时保持足够简单,以便非天文学家也能理解:"APIS = [ "https://api.nasa.gov/planetary/apod"]MODEL = "gemini-1.5-flash"@cachedef get_model(): genai.configure(api_key=GAPI) return genai.GenerativeModel(MODEL)if __name__ == "__main__": with requests.Session() as session: for api in APIS: with session.get(api, params={"api_key": NASA}) as response: response.raise_for_status() if explanation := response.json().get("explanation"): print(get_model().generate_content(AI + explanation).text) else: print("没有说明!")