画像生成AIDALL-E2をDISCORDBOTで使えるようにしてみた!
はじめに
OPENAIのCHATGPTをdiscordBOTにするのは多いのにDALL-E2を使うものはあまりなかったのでメモとして書いていきます。基本的にCHATGPTに送るところをDALL-E2に変えるだけです。
開発環境
ubuntu20.04LTS
Node.js (v20.2.0)
npm (v9.6.6)
環境作成
npm init
//package.json
{
"name": "bot",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
}
$npm install discord.js dotenv openai
.envにはopenaiのAPIKEY、discordBOTのトークンをいれてください
$emacs .env
OPENAI_API_KEY = ""//OPENAIのAPIKEY
DISCORD_TOKEN = ""//DISCORDのTOKEN
APIとトークンの取得方法
OPENAIのAPIKEYを取得する
openaiにログインしてAPI keys - OpenAI APIにアクセス。
+Create new secret key を押し、好きな名前を入力。
その後出てくるAPIKEYをコピーしてなくさないところに保存してください。
DISCORDのトークンを取得する。
Discord Developer Portal — My Applicationsにアクセスし、New Applicationを押してNAMEを入力。
BOTタブに行きTOKENをコピーして保存する。
Privileged Gateway Intents下のSERVER MEMBERS INTENT,MESSAGE CONTENT INTENTをオンにしておく
これを.envに入れておく
コードを作成
基本的に形はchatGPTと同じなので参考にしたサイトと同じような以下のプログラムになる。(参考は最後記述)
//モジュールの読み込み
require("dotenv").config();
var fs = require("fs");
const { Client, GatewayIntentBits } = require("discord.js");
const Discord = require("discord.js");
// Discordクライアントを初期化する
const client = new Discord.Client({
intents: Object.values(Discord.IntentsBitField.Flags),
});
//OpenAIのAPIキーを設定
const { Configuration, OpenAIApi } = require("openai");
const configuration = new Configuration({
apikey:process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
// Discordクライアントが起動すると、slashコマンドの定義をする
client.once("ready", () => {
console.log(`${client.user.tag} Ready`);
});
client.on ("ready", async () => {
const chat = [
{
name:"dalle2",
description:"画像を生成します",
options:[
{
type:3,
name:"prompt",
description:"プロンプト(生成したいものを入力)",
required:true,
},
],
},
];
await client.application.commands.set(chat);
});
//interaction
client.on("interactionCreate", async (interaction) => {
if(!interaction.isCommand()) return;
const command = interaction.commandName;
if(command === "dalle2"){
const question = interaction.options.getString("prompt");
console.log(question);
await interaction.deferReply();
//設定とpromptの中身を送りurl形式で戻ってきたものをBOTに送信
(async () =>{
try{
const response = await openai.createImage({
prompt: `${question}`,
n: 1,
size: "512x512",
responce_format:"url"
});
await interaction.editReply(
`${question}\n>>${response.data.url}\r\n`
);
} catch (error) {
console.error(error);
await interaction.editReply(`エラーが発生しました: ${error.message}`);
}
})();
}
});
//discordBOTにログイン
client.login(process.env.DISCORD_TOKEN);
node index.js
で起動する。systemctlやrc.local で自動起動にすれば問題ないだろう。
BOTを招待する
OAuth2タブからURLジェネレーター
bot,applications.commandsを選択し、個人向けならAdministratorでいい。
(send messageとUse Slash Commandsでもいい。)
下のリンクをコピーしてサーバーに招待し/をうてば利用できるようになる
終わりに(課題)
メッセージでリンクを送信しているので文字が邪魔。
image2imageなどもできるようにしたい。
参考にしたサイト様
ChatGPT APIを使ったDiscord返答ボットの作成【初心者向け】 - Qiita
Image generation - OpenAI API
本当にありがとうございます。