Ubuntu环境下Python脚本调用Affectiva API及MongoDB存储问题求助
解决Affectiva API调用与MongoDB存储问题
嘿,我来帮你搞定这两个问题——先把Affectiva的API调用理顺,再把分析结果存进MongoDB。咱们一步步来:
一、Affectiva API的正确打开方式
你现在用requests.get直接访问的方式不对,Affectiva Cloud API是通过API密钥认证,并且需要用POST请求提交分析任务(因为视频分析是异步的,得先创建任务再轮询结果)。
1. 先做准备工作
- 去Affectiva开发者平台注册/登录,获取你的专属API密钥(这是认证的关键,别用用户名密码直接请求)
- 确保要分析的视频能被Affectiva访问:如果是本地视频,得先传到公开存储(比如AWS S3);如果是YouTube视频,直接用公开的视频URL就行
2. 修正后的API调用代码
下面是完整的任务提交+结果轮询代码,替换你现有的片段就行:
import requests import json import time from pymongo import MongoClient # 后面存MongoDB要用 # 替换成你的Affectiva API密钥 AFFECTIVA_API_KEY = "你的API密钥" BASE_API_URL = "https://api.affectiva.com/v4" # 要分析的视频URL(比如公开的YouTube链接) target_video_url = "https://www.youtube.com/watch?v=xxxxxxx" # 1. 提交分析任务 auth_headers = { "Authorization": f"Bearer {AFFECTIVA_API_KEY}", "Content-Type": "application/json" } task_payload = { "url": target_video_url, "tasks": ["emotion"] # 指定要执行的情感分析任务 } # 发起POST请求创建任务 try: create_task_res = requests.post(f"{BASE_API_URL}/analyze", headers=auth_headers, json=task_payload) create_task_res.raise_for_status() # 请求失败直接抛出异常 except requests.exceptions.RequestException as e: print(f"创建任务失败: {e}") exit(1) task_id = create_task_res.json()["id"] print(f"分析任务已创建,ID: {task_id}") # 2. 轮询任务状态,直到完成 task_status = "processing" while task_status in ["queued", "processing"]: time.sleep(10) # 每10秒查一次状态,别太频繁 try: status_res = requests.get(f"{BASE_API_URL}/analyze/{task_id}", headers=auth_headers) status_res.raise_for_status() except requests.exceptions.RequestException as e: print(f"查询任务状态失败: {e}") exit(1) task_data = status_res.json() task_status = task_data["status"] print(f"当前任务状态: {task_status}") # 3. 获取最终分析结果 if task_status == "completed": analysis_result = task_data["results"] print("分析结果获取成功!") else: print(f"任务执行失败,状态: {task_status}") exit(1)
二、把JSON结果存进MongoDB
接下来咱们把拿到的Affectiva分析结果存入MongoDB,很简单:
1. 先装依赖
在Ubuntu终端里跑这个命令安装MongoDB的Python驱动:
pip install pymongo
2. 连接MongoDB并存储数据
在上面的代码末尾加上这段,就能把结果存进去了:
# 连接本地MongoDB(默认端口27017) try: mongo_client = MongoClient("mongodb://localhost:27017/") # 创建或选择数据库 db = mongo_client["affectiva_emotion_db"] # 创建或选择集合(相当于SQL里的表) collection = db["video_analysis"] except Exception as e: print(f"连接MongoDB失败: {e}") exit(1) # 给结果加一些元信息(方便后续查询,可选) analysis_result["video_url"] = target_video_url analysis_result["task_id"] = task_id analysis_result["created_time"] = time.time() # 插入文档到MongoDB insert_result = collection.insert_one(analysis_result) print(f"结果已成功存入MongoDB,文档ID: {insert_result.inserted_id}")
三、踩坑提示
- 认证失败:检查API密钥是否正确,Authorization头的格式必须是
Bearer 你的密钥,别写错 - 任务一直processing:视频太大或者Affectiva服务器忙,多等会儿;如果是私有视频,得确保Affectiva能访问到这个资源
- MongoDB连不上:先检查本地MongoDB服务有没有启动(终端跑
sudo systemctl start mongod),或者连接地址是不是错了
内容的提问来源于stack exchange,提问作者dsmith
相关产品推荐
相关产品推荐

