Cách tích hợp n8n với Sora2 API: Hướng dẫn từng bước
Tìm hiểu cách tự động hóa việc tạo video AI bằng cách tích hợp Sora2 API với n8n. Hướng dẫn đầy đủ từ thiết lập khóa API đến kiểm tra kết quả.
Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách tự động hóa việc tạo video AI bằng cách tích hợp Sora2 API với n8n, công cụ tự động hóa quy trình làm việc mạnh mẽ. Cuối hướng dẫn này, bạn sẽ có thể kích hoạt tạo video cấp chuyên nghiệp từ bất kỳ nguồn dữ liệu nào (như Google Sheets, Telegram hoặc cơ sở dữ liệu Airtable) một cách tự động.
- Tài khoản Sora2 API với gói đăng ký đang hoạt động.
- Một phiên bản n8n (tự lưu trữ hoặc Cloud).
- Hiểu biết cơ bản về JSON và các yêu cầu HTTP.
1. Tạo khóa Sora2 API của bạn
Trước khi chuyển sang n8n, bạn cần thông tin xác thực của mình. Đăng nhập vào Sora2 API, điều hướng đến phần Khóa API và tạo một khóa mới bắt đầu bằng 'sk-'.

Bước 1: Lấy khóa API của bạn từ bảng điều khiển
2. Thiết lập nút tạo video
Trong n8n, thêm một nút HTTP Request. Đặt Method thành POST, URL thành https://sora2api.org/api/generate-video và sử dụng Header Auth với 'Authorization: Bearer YOUR_API_KEY'.

Bước 2: Cấu hình yêu cầu HTTP để tạo video
3. Lấy ID tác vụ
API sẽ trả về một taskId. Lưu ID này để kiểm tra trạng thái tạo video của bạn sau này.
4. Thực hiện logic chờ và kiểm tra
Thêm một nút Wait trong 30 giây, sau đó một nút HTTP Request khác để gọi /api/check-video-status với taskId.

Bước 4: Cấu hình nút Wait để kiểm tra

Bước 4: Kiểm tra phản hồi thành công và URL video
5. Kiểm tra trạng thái và lặp lại
Sử dụng một nút If để kiểm tra xem trạng thái có phải là 'succeeded' hay không. Nếu không, lặp lại bước chờ.

Bước 5: Sử dụng nút IF để kiểm tra trạng thái
{
"name": "Sora2Api-Workflow-Template",
"nodes": [
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [0, 0],
"name": "When clicking ‘Execute workflow’"
},
{
"parameters": {
"method": "POST",
"url": "https://sora2api.org/api/generate-video",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "{\n \"prompt\": \"A beautiful sunset over the ocean\",\n \"aspectRatio\": \"16:9\",\n \"type\": \"text2video\",\n \"duration\": 10\n}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [250, 0],
"name": "Start Video Generation"
},
{
"parameters": {
"amount": 30
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [500, 0],
"name": "Wait 30s"
},
{
"parameters": {
"method": "POST",
"url": "https://sora2api.org/api/check-video-status",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "taskId",
"value": "={{ $json.data.taskId }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [750, 0],
"name": "Check Status"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $json.data.status }}",
"rightValue": "succeeded",
"operator": {
"type": "string",
"operation": "equals",
"name": "equals"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [1000, 0],
"name": "Check if Succeeded"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"name": "Final_Video_URL",
"value": "={{ $json.data.videoUrl }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [1250, -100],
"name": "Final Result"
}
],
"connections": {
"When clicking ‘Execute workflow’": {
"main": [[{"node": "Start Video Generation", "type": "main", "index": 0}]]
},
"Start Video Generation": {
"main": [[{"node": "Wait", "type": "main", "index": 0}]]
},
"Wait": {
"main": [[{"node": "Check Status", "type": "main", "index": 0}]]
},
"Check Status": {
"main": [[{"node": "Check if Succeeded", "type": "main", "index": 0}]]
},
"Check if Succeeded": {
"main": [
[{"node": "Final Result", "type": "main", "index": 0}],
[{"node": "Wait", "type": "main", "index": 0}]
]
}
}
}