yokon's blog

Midjourney|如何集成到自己的平台

2023.05.21

最近想着把 Midjourney 接入到自己的平台,但由于 Midjourney 没有开放接口,所以退而求其次。利用 Discord 的 Bot API,通过下发/imagine命令,创建 Midjourney bot 的绘画任务。并实时监听 Midjourney bot 的消息,回传给平台。这样就基本上满足我的需求了。

本篇文章我会介绍下我实现的 Midjourney API 项目,并且附上使用教程。

大致的流程如图:

post49_1.png

midjourney-api

开源地址:https://github.com/yokonsan/midjourney-api

该仓库是我在将 Midjourney 接入到平台,开发的一套接口。个人使用下来基本满足大部分需求,现在开源出来,仅供大家参考。大家觉得有用可以点个 star,发现有 bug 可以提 issue 或 pr。

具体的开发细节就不展开了,本篇文章说下如何使用该仓库。

准备工作

注意:本仓库依赖于 Discord 开发的 API,对于如何访问 Discord,大家自行寻找方法。这里默认大家已经在 Discord 创建了自己的服务器,并且将 Midjourney 添加到服务器内。

使用该仓库我们需要 4 个参数:

  1. 用户 Token(调用 API 需要身份验证)
  2. 创建的 Discord 机器人 Token(实时监听 Midjourney 会话)
  3. Discord 自建服务器 ID
  4. Midjourney bot 所在频道 ID

如果大家知道如何获取这几个参数,可以跳到下一节。

用户 Token

登录网页端 discord 按F12打开开发者工具,然后刷新页面。参考下图点击Network,在 filter 栏输入/api/library找到这条请求记录,然后在请求体中找到authorization字段,他的值就是我们需要的 Token。

注意:该 Token 属于隐私信息,不要直接暴露在代码中发布到 Github。

post49_2.png

机器人 Token

这里需要先创建 discord 机器人,地址:https://discord.com/developers/applications

创建过程很简单,不做赘述。

post49_3.png

我们点击Reset Token,然后copy这串 Token 即可。

但是我们需要我们的机器人能够干活,还需要给他添加些 Scopes。

post49_4.png

勾选上 Scope 后,页面下方会生成一个 Oauth2 授权链接。我们复制该链接然后在浏览器打开。

打开后会出现 OAuth2 授权页面,我们将机器人添加到我们的服务器即可。

服务器 ID、频道 ID

这里比较简单,我们先打开开发者模式:

post49_5.png

然后鼠标右击服务器头像,复制服务器 ID。频道也一样,右击频道,复制频道 ID。

安装启动

git clone
pip install -r requirements.txt

.env.template重命名为.env,并填入参数值:

USER_TOKEN=用户token
BOT_TOKEN=机器人token
GUILD_ID=服务器ID
CHANNEL_ID=频道ID
CALLBACK_URL=回调地址,默认http post请求

直接启动

# 启动监听机器人
python task_bot.py
# 启动http服务
python server.py

docker 启动

# 构建镜像  
sh build.sh  
# 启动容器  
sh start.sh

启动后访问接口swagger文档:http://127.0.0.1:8061/docs

midjourney-api 提供接口:

  1. /v1/api/trigger/bot:触发绘画任务,已完成
  2. /v1/api/upload:上传图片,触发任务,待开发

使用

目前只完成了触发绘画任务的接口,我们以此为示例。该接口调用需要参数:

class TriggerType(str, Enum):
    generate = "generate"  # /imagine 根据提示词,生成图片
    upscale = "upscale"  # U 选择索引高清放大
    variation = "variation"  # V 基于索引风格变化
    reset = "reset"  # 重绘


class TriggerBotIn(BaseModel):
    type: TriggerType  # 触发类型
    prompt: str = ""  # 提示词
    msg_id: str = ""  # 消息ID,
    msg_hash: str = ""  # 消息hash
    index: int = 0  # 图片索引,1-4

generate

直接调用接口 /v1/api/trigger/bot 生成,提示词:half fish half dragon hybrid, retro screencap --ar 2:3 --niji 5

curl -X 'POST' \
  'http://127.0.0.1:8062/v1/api/trigger/bot' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "type": "generate",
  "prompt": "half fish half dragon hybrid, retro screencap --ar 2:3 --niji 5",
  "msg_id": "",
  "msg_hash": "",
  "index": 0
}'

post49_6.png

可以看到我们启动的task_bot.py监听服务,已经监听到消息日志:

post49_7.png

upscale

这里我觉得第二张比较符合预期,我们接续调接口放大图片增加细节。这里需要取到 msg_id 和 msg_hash 字段的值。msg_id 就是 CallbackData 的 id 字段,msg_hash 是 Attachment 的 url 去掉后缀,根据_分割的最后一段。

class Attachment(TypedDict):
    id: int
    url: str
    proxy_url: str
    filename: str
    content_type: str
    width: int
    height: int
    size: int
    ephemeral: bool


class CallbackData(TypedDict):
    type: str
    id: int
    content: str
    attachments: List[Attachment]
curl -X 'POST' \
  'http://127.0.0.1:8062/v1/api/trigger/bot' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "type": "upscale",
  "prompt": "",
  "msg_id": "1109686524045443093",
  "msg_hash": "c937b5aa-3f58-4ae5-8dd6-932952243034",
  "index": 2
}'

注意:这里索引是图片的 1-4,不是 0-3

post49_8.png

variation

curl -X 'POST' \
  'http://127.0.0.1:8062/v1/api/trigger/bot' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "type": "variation",
  "prompt": "",
  "msg_id": "1109686524045443093",
  "msg_hash": "c937b5aa-3f58-4ae5-8dd6-932952243034",
  "index": 2
}'

这里我们基于第 2 张图的风格,再生成 4 张。

post49_9.png

reset

基于提示词重绘:

curl -X 'POST' \
  'http://127.0.0.1:8062/v1/api/trigger/bot' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "type": "reset",
  "prompt": "",
  "msg_id": "1109686524045443093",
  "msg_hash": "c937b5aa-3f58-4ae5-8dd6-932952243034",
  "index": 0
}'

post49_10.png

总结

本篇文章主要介绍了如何接入 Midjourney,然后介绍了我的开源项目 midjourney-api,并介绍了如何使用该项目。

依据改仓库,大家可以很方便的将 Midjourney 对接到 QQ、微信、钉钉等平台。如果大家感兴趣,我将会带大家制作一个微信机器人或者将它接入到我的个人公众号。

当然,改仓库还有很多未完善的地方,比如图生图。这些功能我后续会继续补充,也欢迎大家参与进来。开源地址:https://github.com/yokonsan/midjourney-api

相比于 Stable-Diffusion,Midjourney 对新手更加友好。大家自行体验。