嘿,大家好!今天我们来聊一个特别实用又有点酷的技术:用 Python 来批量修改图片里的文字。想象一下,你手上有一大堆产品图,需要把上面的“促销价”换成“新品上市”,或者给一堆海报统一加上活动标签,一张张用 PS 改得改到什么时候?这时候,就得请出我们今天的主角——Nano Banana API 了。

这篇文章会带你从零开始,一步步搞明白怎么用 Python 调用这个强大的 AI 工具,让图片编辑工作变得自动化、高效率。咱们这就开始吧!

1. 功能揭秘:Nano Banana API 是什么,能干嘛?

核心定义与价值

说白了,Nano Banana API 是一个基于 Google Gemini AI 的图像生成服务。你给它一段文字描述,它就能生成一张全新的图片;更厉害的是,你还可以给它一张参考图片,让它基于这张图进行修改或再创作。

它的核心价值在于将创意和编辑指令通过代码转化为实际的图像操作。这意味着我们可以把繁琐、重复的图片处理工作,交给程序去自动执行,极大地解放生产力。

典型应用场景

光说概念有点干,咱们来看几个实际场景,你马上就能 get 到它的好用之处:

  • 电商营销:批量修改商品图上的促销标签,比如“满 100 减 20”换成“第二件半价”。
  • UI/UX 设计:快速生成不同语言版本的 App 界面截图,用于多语言市场测试。
  • 社交媒体运营:为一系列图片批量添加统一的品牌 Logo 或活动水印。
  • 创意内容生成:输入“把这张图里的猫换成狗”,AI 就能帮你“脑洞大开”,实现图片的趣味再创作。

2. 环境准备与安全配置:工欲善其事,必先利其器

在开始敲代码之前,我们得先把“兵器”准备好。这一步很简单,但非常重要。

环境要求

  • Python:确保你的电脑上安装了 Python 3.6 或更高版本。
  • ** API密钥**: 去 Defapi 注册并生成
  • requests 库:这是我们用 Python 发送 HTTP 请求的“瑞士军刀”,非常好用。如果还没安装,打开你的终端或命令行工具,敲下面这行命令就行:
    pip install requests
    

API 密钥的安全管理

调用 API 需要一个“通行证”,也就是 API Key。这个 Key 跟你的账户绑定,可千万不能泄露了。

错误示范:直接把 Key 写在代码里,比如 api_key = "dk-1234567890abcdef"。这样一旦代码上传到 GitHub 或者分享给别人,你的 Key 就暴露了,非常危险!

正确姿势:使用环境变量。这是一种更安全、更专业的做法。

  1. 设置环境变量(以 macOS/Linux 为例):

    export NANO_BANANA_API_KEY="你的真实API密钥"
    

    (Windows 用户可以在系统属性里设置,或者在 PowerShell 里用 $env:NANO_BANANA_API_KEY="你的真实API密钥"

  2. 在 Python 中读取
    我们用 os 模块来安全地读取这个 Key,这样代码里就不会出现明文密钥了。

3. API 接口详解:请求与响应的“对话艺术”

了解了 API 是什么,也准备好了环境,现在我们来深入看看怎么跟它“对话”。API 的交互就像一问一答,我们得搞清楚“怎么问”(请求)和“答是什么”(响应)。

请求结构:如何向 API 发出指令?

Nano Banana API 的核心请求地址是 https://api.defapi.org/api/image/gen,我们需要用 POST 方法向它发送数据。一个完整的请求包含三个部分:

  1. 地址https://api.defapi.org/api/image/gen
  2. 认证:在请求头里加上 Authorization 字段,值就是 Bearer 加上你的 API Key,格式为 Bearer <your-api-key>
  3. 参数:这是请求的“正文”,是一个 JSON 对象,用来告诉 AI 我们想做什么。主要字段有:
    • model:指定使用的模型,这里我们就填 "google/nano-banana"
    • prompt这是最重要的部分! 用自然语言描述你想要的图片效果。比如,“把图片中的文字‘Hello’改成‘你好’”。
    • images:一个数组,里面可以放最多 4 张参考图片的 URL。AI 会参考这些图片的构图和内容进行修改。
    • callback_url(可选):如果你不想一直等待结果,可以提供一个回调地址,任务完成后 API 会主动通知你。

响应解析:如何听懂 API 的“回答”?

发送请求后,API 会立刻返回一个响应。这个响应通常不是最终的图片,而是一个确认信息,告诉我们任务已经收到了。

  • 成功响应:返回的 JSON 里 code0data 中会包含一个 task_id。这个 task_id 是我们后续查询任务的唯一凭证,一定要拿好!
    {
      "code": 0,
      "message": "ok",
      "data": {
        "task_id": "ta12345678-1234-1234-1234-123456789abc"
      }
    }
    
  • 失败响应:如果参数不对或者 Key 有问题,code 会是非 0 值,messagedetail 字段会告诉你哪里错了。

拿到 task_id 后,我们需要用另一个接口 https://api.defapi.org/api/task/query?task_id=你的任务ID 去轮询查询结果。这个查询接口的响应会告诉我们任务的状态(status),比如 pending(排队中)、in_progress(处理中)、success(成功)或 failed(失败)。如果成功了,result 字段里就会包含生成图片的 URL。

4. Python 代码实战:从零到一构建图片编辑脚本

理论讲完了,激动人心的实战环节来了!下面我们严格按照“导入 -> 配置 -> 构建 -> 发送 -> 处理”的逻辑,用 Python 写一个完整的调用脚本。

import os
import requests
import time
import json

# --- 步骤1: 导入所需库 ---
# 已在文件顶部完成

# --- 步骤2: 配置基础信息 ---
# 从环境变量安全地获取 API Key
API_KEY = os.environ.get("NANO_BANANA_API_KEY")
BASE_URL = "https://api.defapi.org"

if not API_KEY:
    raise ValueError("错误:未找到环境变量 NANO_BANANA_API_KEY。请先设置它。")

# 设置请求头,包含认证信息
headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# --- 步骤3: 构建请求体 ---
# 我们要修改一张图片中的文字
# 这里用一张公开的图片作为示例
payload = {
    "model": "google/nano-banana",
    "prompt": "Change the text 'Body Lotion' to '身体乳'. Keep the style and background the same.",
    "images": [
        "https://cdn.openai.com/API/docs/images/body-lotion.png"
    ]
    # callback_url 是可选的,这里我们先不用,用轮询的方式查询
}

print("🚀 正在提交图片生成任务...")

# --- 步骤4: 发送请求 ---
try:
    response = requests.post(
        f"{BASE_URL}/api/image/gen",
        headers=headers,
        data=json.dumps(payload)
    )
    response.raise_for_status()  # 如果状态码不是2xx,则抛出异常

    task_info = response.json()
    if task_info.get("code") != 0:
        print(f"❌ 任务提交失败: {task_info.get('message')}")
        exit()

    task_id = task_info["data"]["task_id"]
    print(f"✅ 任务提交成功!任务ID: {task_id}")

except requests.exceptions.RequestException as e:
    print(f"❌ 网络请求错误: {e}")
    exit()

# --- 步骤5: 处理结果 (轮询查询任务状态) ---
print("⏳ 正在查询任务结果,请稍候...")
query_url = f"{BASE_URL}/api/task/query"
params = {"task_id": task_id}
max_attempts = 30  # 最多尝试查询30次
attempt = 0

while attempt < max_attempts:
    try:
        query_response = requests.get(query_url, headers=headers, params=params)
        query_response.raise_for_status()
        result_data = query_response.json()

        if result_data.get("code") != 0:
            print(f"❌ 查询失败: {result_data.get('message')}")
            break

        task_status = result_data["data"]["status"]
        print(f"   - 第 {attempt + 1} 次查询,当前状态: {task_status}")

        if task_status == "success":
            print("🎉 任务完成!图片已生成:")
            # 结果可能有多张图片
            for item in result_data["data"]["result"]:
                image_url = item["image"]
                print(f"    - {image_url}")
            break
        elif task_status == "failed":
            error_reason = result_data["data"]["status_reason"].get("message", "未知错误")
            print(f"💥 任务失败!原因: {error_reason}")
            break
        else:
            # 如果还在进行中,就等一会儿再查
            time.sleep(5)  # 等待5秒

    except requests.exceptions.RequestException as e:
        print(f"❌ 查询时发生网络错误: {e}")
        break

    attempt += 1

if attempt == max_attempts:
    print("⏰ 查询超时,任务可能仍在处理中。请稍后手动使用 task_id 查询。")

代码讲解

  1. 导入与配置:我们导入了必要的库,并从环境变量中安全地加载了 API Key。同时,设置了包含认证信息的 headers
  2. 构建请求payload 字典就是我们发给 API 的“指令”。prompt 字段清晰地描述了我们的需求——把 “Body Lotion” 改成 “身体乳”。images 数组里放了我们要修改的原始图片 URL。
  3. 发送与获取 task_id:用 requests.post 发送请求,成功后从返回的 JSON 中解析出 task_id。这是后续查询的关键。
  4. 轮询处理结果:这是一个 while 循环,模拟了“耐心等待”的过程。我们每隔 5 秒就去查询一次任务状态。
    • 如果状态是 success,皆大欢喜,打印出图片的 URL。
    • 如果是 failed,打印出错误原因,方便排查问题。
    • 如果是 in_progress 或其他中间状态,就继续等待。
    • 为了防止程序无限等下去,我们还设置了一个最大尝试次数。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐