yokon

yokon

君子终日乾乾,夕惕若厉,无咎
github

Midjourney|如何整合到自己的平台

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

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

大致的流程如图:

Mermaid Loading...

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。

Pasted image 20230519144719

機器人 Token#

這裡需要先創建 discord 機器人,地址:https://discord.com/developers/applications

創建過程很簡單,不做贅述。

Pasted image 20230519145542

我們點擊Reset Token,然後copy這串 Token 即可。

但是我們需要我們的機器人能夠幹活,還需要給他添加些 Scopes。

Pasted image 20230519145939

勾選上 Scope 後,頁面下方會生成一個 Oauth2 授權鏈接。我們複製該鏈接然後在瀏覽器打開。

打開後會出現 OAuth2 授權頁面,我們將機器人添加到我們的伺服器即可。

伺服器 ID、頻道 ID#

這裡比較簡單,我們先打開開發者模式:

Pasted image 20230519150515

然後鼠標右擊伺服器頭像,複製伺服器 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
}'

Pasted image 20230521113818

可以看到我們啟動的task_bot.py監聽服務,已經監聽到消息日誌:

Pasted image 20230521113910

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

Pasted image 20230521114604

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 張。

Pasted image 20230521120322

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
}'

Pasted image 20230521120623

總結#

本篇文章主要介紹了如何接入 Midjourney,然後介紹了我的開源項目 midjourney-api,並介紹了如何使用該項目。

依據改倉庫,大家可以很方便的將 Midjourney 對接到 QQ、微信、釘釘等平台。如果大家感興趣,我將會帶大家製作一個微信機器人或者將它接入到我的個人公眾號。

當然,改倉庫還有很多未完善的地方,比如圖生圖。這些功能我後續會繼續補充,也歡迎大家參與進來。開源地址:https://github.com/yokonsan/midjourney-api

相比於 Stable-Diffusion,Midjourney 對新手更加友好。大家自行體驗。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。