不用魔法,快速、手摸手上线Midjourney!【附源码】【示例】

这篇具有很好参考价值的文章主要介绍了不用魔法,快速、手摸手上线Midjourney!【附源码】【示例】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先来一波感谢:
感谢laf提供赞助,目前可以免费使用Midjourney进行开发和测试。
感谢白夜、米开朗基杨@sealos.io的耐心解答,让我对laf有了更多的使用与了解。
什么是laf?来了解下。
文末有【示例】

开始

废话不多说,进入正题。
laf在做一个活动,可以使用快速上手Midjourney《人人都能接入 Midjourney》。具体活动,可以查看论坛。

原理

原理部分不涉及代码,涉及背景介绍,熟悉的同学可以略过。因为midjourney官方没有提供API功能,所以有国外大神将开源了一款模拟请求工具,来请求midjourney,laf将这代码集成到内部的npm包中。如果需要github地址,欢迎留言,我私信给您。
所以laf平台,加上下面的实例代码可以很好的快速接入到系统中。

开始

要现有个laf账号,会有免费1月的试用,本次调用mj(以下代指midjourney),所以要在laf.dev上注册使用,这是运行在新加坡环境上。

代码逻辑

我的核心思想是这样的:先要有个核心与midjourney交互的代码,上层的我们想做的业务逻辑可以自己定义。

代码

laf 是一个云开发平台,可以将代码暴露成api形式,进行调用,一些其他鉴权等,可以在之前我写的文章中找到灵感:腾讯云开发迁移实录

  • 要做一个云函数,处理与midjourney交互,我这里起名云函数mj-send
import cloud from '@lafjs/cloud'
import { Midjourney, MidjourneyMessage } from 'midjourney'
const SERVER_ID = '' // Midjourney 服务 ID
const CHANNEL_ID = '' // Midjourney 频道 ID
const SALAI_TOKEN = '' // Midjourney 服务 Token

const Limit = 100
const MaxWait = 3

const client = new Midjourney({
  ServerId: SERVER_ID,
  ChannelId: CHANNEL_ID,
  SalaiToken: SALAI_TOKEN,
  Debug: true,
  SessionId: SALAI_TOKEN,
  Limit: Limit,
  MaxWait: MaxWait
});

export default async function (ctx: FunctionContext) {
  const { type, param } = ctx.body
  switch (type) {
    case 'RetrieveMessages':
      return await RetrieveMessages(param)
    case 'imagine':
      return await imagine(param)
    case 'upscale':
      return await upscale(param)
    case 'variation':
      return await variation(param)
  }

}

// 查询最近消息
async function RetrieveMessages(param) {
  console.log("RetrieveMessages")
  const client = new MidjourneyMessage({
    ChannelId: CHANNEL_ID,
    SalaiToken: SALAI_TOKEN,
  });
  const msg = await client.RetrieveMessages();
  console.log("RetrieveMessages success ", msg)
  return msg
}

// 创建生图任务
async function imagine(param) {
  console.log("imagine", param)
  const { question, msg_Id } = param
  const msg = await client.Imagine(
    `[${msg_Id}] ${question}`,
    (uri: string, progress: string) => {
      console.log("loading", uri, "progress", progress);
    }
  );
  console.log("imagine success ", msg)
  return true
}

// upscale 放大图片
async function upscale(param) {
  console.log("upscale", param)
  const { question, index, id, url } = param
  const hash = url.split("_").pop()?.split(".")[0] ?? ""
  console.log(hash)
  const msg = await client.Upscale(
    question,
    index,
    id,
    hash,
    (uri: string, progress: string) => {
      console.log("loading", uri, "progress", progress);
    }
  );
  console.log("upscale success ", msg)
  return msg
}

// variation 变换图片
async function variation(param) {
  console.log("variation", param)
  const client = new Midjourney({
    ServerId: SERVER_ID,
    ChannelId: CHANNEL_ID,
    SalaiToken: SALAI_TOKEN,
    Debug: true,
    SessionId: SALAI_TOKEN,
    Limit: Limit,
    MaxWait: 100
  });
  const { question, index, id, url } = param
  const hash = url.split("_").pop()?.split(".")[0] ?? ""
  const msg = await client.Variation(
    question,
    index,
    id,
    hash,
    (uri: string, progress: string) => {
      console.log("loading", uri, "progress", progress);
    }
  );
  console.log("variation success ", msg)
  return msg
}

什么?没有账号?仔细看帖,里面有获取方式
什么?已经有了midjourney付费账号,没有key?大佬我们做朋友,留言我来告诉你。
发布即可调用,怎么调用?我把curl给你,你看看结构就懂了,该替换的替换。

  • 画图

画图需要一些时间,这里默认使用的fast,但也是会花时间的,所以成图我们要在之后调用查询接口查看。

  • question:就是prompt,这里要输入英文。
  • 关注下参数msg_Id,后面有用
curl --location --request POST 'https://<你的发布地址服务>' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Content-Type: application/json' \
--data-raw '{
  "type": "imagine",
  "param": {
    "question": "a dog",
    "msg_Id": 1684585158
  }
}'
  • 查询
curl --location --request POST 'https://<你的发布地址服务>' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Content-Type: application/json' \
--data-raw '{
  "type":"RetrieveMessages"
}'

如何获取到我刚创建的图呢?先看一下返回的结果。

[
    {
        "id": "1109565864640008202",
        "type": 0,
        "content": "**[1684582132] a dog --seed 8925 --v 5** - <@1013684342851117146> (fast)",
        "channel_id": "1109368983364313204",
        "author": {
            "id": "936929561302675456",
            "username": "Midjourney Bot",
            "global_name": null,
            "avatar": "4a79ea7cd151474ff9f6e08339d69380",
            "discriminator": "9282",
            "public_flags": 589824,
            "bot": true,
            "avatar_decoration": null
        },
        "attachments": [
            {
                "id": "1109565863994077215",
                "filename": "johnsonmaureen_1684582132_a_dog_a062b5e2-ab39-40b0-b281-1365695529d5.png",
                "size": 4275948,
                "url": "https://cdn.discordapp.com/attachments/1109368983364313204/1109565863994077215/johnsonmaureen_1684582132_a_dog_a062b5e2-ab39-40b0-b281-1365695529d5.png",
                "proxy_url": "https://media.discordapp.net/attachments/1109368983364313204/1109565863994077215/johnsonmaureen_1684582132_a_dog_a062b5e2-ab39-40b0-b281-1365695529d5.png",
                "width": 2048,
                "height": 2048,
                "content_type": "image/png"
            }
        ]
    }
    **省略其他数据**
]

返回结果为数组,还记得上面的msg_Id吗,在JSON结构中查看content部分,就可以看到
"content": "**[1684582132] a dog --seed 8925 --v 5** - <@1013684342851117146> (fast)", 所以,我们可以用这个字段来进行筛选。$.attachments[0].url就是成图了。

  • 选取生成大图
    如果再返回的四张图有一张看得不错,怎么生成大图呢?先给你个表格,告诉你哪是1,哪是3
1 2
3 4

然后来看如何传参

curl --location --request POST 'https://<你的发布地址服务>' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Content-Type: application/json' \
--data-raw '{
  "type": "upscale",
  "param": {
    "id": "1109460470152319086",
    "question":"a dog",
    "index": 3,
"url":"https://cdn.discordapp.com/attachments/1109368983364313204/1109460469628022915/johnsonmaureen_1684585158_a_dog_d5b7e35c-0fce-4f7d-b440-35f5602d2f25.png"
  }
}'

解释下参数:

  • id: 是查询返回结果体里的id
  • question,是最开始输入进去的prompt
  • index: 你想要的第几张图
  • url:是查询返回结果体里的url,四张图拼一起的那个。

别问我怎么知道的,我都是翻代码看得。

  • 重绘
    当看上这4张图中某一个的风格或者样式之后,可以根据这个风格重绘。
curl --location --request POST 'https://<你的发布地址服务>' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Content-Type: application/json' \
--data-raw '{
  "type": "variation",
  "param": {
    "id": "1109460470152319086",
    "question": "a dog",
    "index": 3,
    "url": "https://cdn.discordapp.com/attachments/1109368983364313204/1109460469628022915/johnsonmaureen_1684585158_a_dog_d5b7e35c-0fce-4f7d-b440-35f5602d2f25.png"
  }
}'

参数解释不说了,跟上面类似。

至此教程结束了

赶紧去上手做点什么吧,实践出真知~

作品展示

这次其实是laf在组织活动,想我这种平台级别思考大佬的人,不会去钻到某个应用当中,我来看看大家都画了什么图,所以我做了个简陋的页面,本人前端能力有限,代码实现全靠ChatGPT。
上链接:

laf比赛作品大赏

如果觉得不错打个赏吧,后面是答疑环节

不用魔法,快速、手摸手上线Midjourney!【附源码】【示例】

问题

  • 我怎么知道mj的图画完没有呢?
    可以根据$.attachments[0].width的尺寸大小来看,如果小于2048,则没有生成完,没生成完其实应该是512。
  • 怎么让图片结果与请求msg_Id绑定?
    正如上文所说要自己实现一个逻辑去匹配结果,另外还有一个就是用好触发器,他会定时执行你的服务,这样你就可以将数据进行增量处理。

`文章来源地址https://www.toymoban.com/news/detail-453622.html

到了这里,关于不用魔法,快速、手摸手上线Midjourney!【附源码】【示例】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手摸手教你写任务中心-积分领取&消耗&回收

    继上一篇签到任务之后呢, 就有朋友让我写一下任务积分的领取和使用, 以及回收; 其实前面两种都不难, 就只是积分的加减而已, 真正麻烦的是回收, 有回收的话你就需要考虑到每笔积分存在多种状态的可能了; 明细表(mysql) 记录积分的每一笔获取, 消耗的回收的记录, 并且回收

    2024年02月08日
    浏览(55)
  • 手摸手2-springboot编写基础的增删改查

    创建controller层 实现 test 表中的添加、修改、删除及列表查询接口(未分页) 添加service层接口 service层实现 添加mapper层 mapper层对应的sql 添加扫描注解,对应sql文件的目录

    2024年02月10日
    浏览(46)
  • 手摸手带你 在Windows系统中安装Istio

    通过负载均衡、服务间的身份验证、监控等方法,Istio 可以轻松地创建一个已经部署了服务的网络,而服务的代码只需很少更改甚至无需更改。 通过在整个环境中部署一个特殊的 sidecar 代理为服务添加 Istio 的支持,而代理会拦截微服务之间的所有网络通信,然后使用其控制

    2024年02月06日
    浏览(50)
  • 手摸手教你把Ingress Nginx集成进Skywalking

    在微服务大行其道的今天,如何观测众多微服务、快速理清服务间的依赖、如何对服务之间的调用性能进行衡量,成了摆在大家面前的难题。对此,Skywalking应运而生,它是托管在 Apache 基金会下的开源项目,旨在帮助开发者监控分布式程序的性能、了解各个服务的调用关系和

    2024年04月23日
    浏览(33)
  • 手摸手接入Github实现Oauth2第三方登录

    最近在学习oauth2授权登录流程,oauth2简单来说就是接入第三方应用(qq、微信、github、gitee等),不用在本站登录,而是去请求第三方应用的用户信息完成登录。 下面就一起来看一下如何接入github实现第三方登录 首先,我们需要在github中添加OAuth App,登录你的github(如果还有

    2024年02月04日
    浏览(69)
  • 泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~

    最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了。之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog.csdn.net/sinat_26918145/article/details/79591717   现代的模型对于图生图的支持效果已经非常好了,

    2024年02月06日
    浏览(58)
  • 使用 Burp Suite 暴力破解密码 撞库攻击 从0到1手摸手教学

    一个学习的过程 增加自己网络安全知识 切勿用于违法用途 设置密码尽量使用6位以上并规避简单数字组合、加强对同一ip的频繁访问次数限制、设置人机验证减小撞库攻击的危害 本地环境 kali 2022 Burp Suite FireFox 靶机环境 一台服务器 CentOS 7 宝塔面板 一个域名(你不会没有吧)

    2024年02月09日
    浏览(41)
  • 手摸手教你Vite+Vue3项目初始化及开源部署到GItee

    本片文章主要记录项目的环境,项目搭建。 在开始本次学习中,鉴于你有前端三件套和vue的知识基础。 文档创建于2023年5月20日,大家都去过情人节了~我在肝代码! 环境的搭建 node版本使用18.16.0。 目前(2023.05.20)的稳定版本,这里推荐使用nvm来管理node的版本。Nvm使用教程

    2024年02月04日
    浏览(57)
  • 【AI帮我写代码,上班摸鱼不是梦】手摸手图解CodeWhisperer的安装使用

    除了借助ChatGPT通过问答的方式生成代码,也可以通过IDEA插件在写代码是直接帮助我们生成代码。 目前,IDEA插件有CodeGeeX、CodeWhisperer、Copilot。其中,CodeGeeX和CodeWhisperer是完全免费的,Copilot是收费的,每月10美元。 下面我们来了解CodeWhisperer的安装和使用,如果你还想了解其他

    2024年02月11日
    浏览(46)
  • 无需魔法,教你Midjourney随意用【内附源码】【示例】

    感谢laf提供云资源赞助,小伙伴可白piao用来做测试。 感谢laf团队、白夜、米开朗基杨@sealos.io的热心布道 ,life is short, u need laf : ) 欢迎你也来加入laf开发。 正好现在laf在做一个活动,一起搞起来吧人人都能接入 Midjourney 目标 由于Midjourney官方并没有提供api接口,有大佬开封装

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包