可行但必须绕开discord走官方restful接口;否则用puppeteer模拟发消息稳定性差、易限频、无法处理失败任务。核心缺陷:无结构化状态、错误不可解析、图片链接48小时失效、无法绑定用户上下文。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

直接上结论:用 Midjourney API 批量生成头像可行,但必须绕开 Discord 交互层,走官方 RESTful 接口;否则所谓“自动化”只是用 Puppeteer 模拟发消息,稳定性差、易被限频、无法处理失败任务。
为什么不能用 Discord bot 或 Selenium 自动发 /imagine
Discord 不是设计给机器调用的——它的 rate limit 极其严格(每秒最多 1 条消息),且会主动检测并封禁非人类行为模式。实测中,连续发送 20 条 /imagine 后,账号大概率触发风控,需人工滑块验证;更关键的是,Discord 不提供任务 ID 或 webhook 回调,你根本不知道某张图是否生成失败、卡在排队、还是被拒绝(比如含品牌词或人脸)。
这些都不是“写个循环就能解决”的问题,而是架构层面的不可靠。
无序列表呈现核心缺陷:
- 无法获取结构化任务状态(
queued/processing/finished/failed) - 错误信息仅显示在 Discord 消息里,无法自动解析(如
"This prompt was blocked due to safety filters") - 图片 URL 是临时链接,48 小时后失效,不支持直传 CDN 或存入自有图床
- 无法绑定用户上下文(比如为不同账号生成带对应昵称水印的头像)
/imagine 接口调用必须带 callback_url 或轮询 /task/{id}
Midjourney 官方 API 的设计逻辑是「异步 + 状态驱动」:你 POST 一个 prompt,它立刻返回 task_id;后续要么自己轮询 GET /task/{id},要么让它用 webhook 主动推结果到你的服务端。
轮询看似简单,但容易踩坑:
- 首次查询太早(404 或
not_found,不是失败,是还没入库 - 轮询间隔不能固定 1s——应采用指数退避(1s → 2s → 4s → 8s),避免被判定为扫描行为
-
status字段可能为submitted(已接收)、running(渲染中)、succeeded(成功)、failed(失败),其中failed需检查failure_reason字段才能定位是 prompt 违规、token 不足,还是超时
示例关键判断逻辑(Python):
if task["status"] == "succeeded":
avatar_url = task["result"]["url"]
elif task["status"] == "failed":
reason = task.get("failure_reason", "unknown")
if "safety" in reason.lower():
# 需替换 prompt 中敏感词,如 "realistic face" → "stylized portrait"
elif "timeout" in reason.lower():
# 重试时加 quality=1 或减 seed 范围
批量头像生成的提示词模板必须参数化 + 可控降噪
头像不是艺术画,核心诉求是:辨识度高、背景干净、风格统一、适配小尺寸(如 400×400)。直接扔一句 "a person" 会触发 Midjourney 的默认美化逻辑——加光影、换姿势、模糊背景,反而削弱一致性。
实操建议如下:
- 强制关闭自动构图:
--no "shadow, blurry background, photorealistic" - 锁定比例与尺寸:
"--ar 1:1 --quality 1"(质量设 1 足够,头像不需 2K 细节) - 用变量注入身份特征:把
{name}、{job_title}、{brand_color}写进 prompt 字符串,再用 Python 的.format()或 f-string 替换 - 慎用
seed:批量场景下,固定 seed 会导致所有头像构图雷同;建议每个请求用random.randint(1000, 9999),既保差异又不失控
一个可用的模板示例:
f"professional headshot of a {role}, wearing {attire}, clean white background, sharp focus, studio lighting, --ar 1:1 --quality 1 --no text, logo, watermark"
失败重试必须区分错误类型,不能无脑 time.sleep(5); retry()
API 返回的 failed 状态背后原因完全不同,盲目重试只会让问题恶化:
-
"prompt contains banned words":需清洗输入字段(如过滤 emoji、特殊符号、中文标点),不是等几秒就能好 -
"rate limit exceeded":说明你没按文档要求控制并发数(官方限制 3 个并发任务),该加队列或降速 -
"insufficient credits":要查账户余额接口GET /user/credits,而不是继续发请求 -
"timeout":大概率是 prompt 太长或含歧义词,应截断到 60 字以内,并移除主观形容词(如 "beautiful", "amazing")
真正健壮的流水线,会在每次失败后记录 task_id + failure_reason + 时间戳到数据库,供人工复核;对可自动修复的错误(如超时、credit 不足),才触发重试。
最后提醒一点:Midjourney 的 v6 模型对“头像类”提示词有隐式偏好,它会自动增强皮肤质感和眼神光——如果你要的是扁平化/插画风头像,必须显式加 --style raw 或切到 niji 模型,否则生成结果永远偏写实。这点文档没写清楚,但实测误差率超 70%。











