Open1
DIGコード
'use strict';
// ########################################
// 初期設定など
// ########################################
// モジュールの読み込み
const line = require('@line/bot-sdk');
const openai = require('openai');
const express = require('express');
const PORT = process.env.PORT || 3000;
// 設定
const config = {
channelSecret: process.env.CHANNEL_SECRET || '●●●●●●●●●●●●',
channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN || '●●●●●●●●●●●●',
};
// クライアントの作成
const client = new line.Client(config);
const gptConfig = new openai.Configuration({
organization: process.env.OPENAI_ORGANIZATION || "●●●●●●●●●●●●",
apiKey: process.env.OPENAI_API_KEY || '●●●●●●●●●●●●',
});
const gpt = new openai.OpenAIApi(gptConfig);
const makeCompletion = async (userMessage) => {
const prompt = {
role: "system",
content: `## あなたはユーモラスな人です。
## userが「どこ」で「何を」買ったか送ってくるので、「どこでなにを」までを3文字にまとめて下さい。
## くすっと笑えるまとめかたにして、面白い解説も下さい。` // プロンプトを入力
};
userMessage.unshift(prompt);
console.log(userMessage);
return await gpt.createChatCompletion({
model: "gpt-3.5-turbo",
messages: userMessage,
temperature: 0.5,
n: 1
});
};
// 画像メッセージの処理
async function handleImageMessage(event) {
// 画像のURLを指定して送信
const imageUrl = 'https://i.gyazo.com/784ae1f305617baf1bf16d5cedb96809.jpg';
const imageMessage = {
type: 'image',
originalContentUrl: 'https://i.gyazo.com/244d4737c6940ba0f3ef33f85f835533.png',
previewImageUrl: 'https://i.gyazo.com/244d4737c6940ba0f3ef33f85f835533.png'
};
const textMessage = {
type: 'text',
text: `画像が送信されました。\n画像のURL: ${imageUrl}`
};
await client.replyMessage(event.replyToken, [imageMessage, textMessage]);
}
// メッセージイベントの処理
async function handleEvent(event) {
// テキストメッセージ以外は無視
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
const userMessage = [{
role: "user",
content: event.message.text
}];
// ChatGPT APIにリクエストを送る
try {
const completion = await makeCompletion(userMessage);
// レスポンスから返答を取得
const reply = completion.data.choices[0].message.content;
// ChatGPT APIからの返答を受け取り、テキストメッセージとスタンプを一度に送信
await client.replyMessage(event.replyToken, [
{ type: 'text', text: reply },
{ type: 'sticker', packageId: '1070', stickerId: '17849' }
]);
return Promise.resolve(null);
} catch (error) {
// エラーが発生した場合はログに出力
console.error(error);
return Promise.resolve(null);
}
}
const app = express();
app.get('/', (req, res) => res.send('Hello LINE BOT! (HTTP GET)'));
app.post('/webhook', line.middleware(config), (req, res) => {
if (req.body.events.length === 0) {
res.send('Hello LINE BOT! (HTTP POST)');
console.log('検証イベントを受信しました!');
return;
} else {
console.log('受信しました:', req.body.events);
}
Promise.all(req.body.events.map(async (event) => {
if (event.type === 'message') {
if (event.message.type === 'image') {
// 画像メッセージの処理
await handleImageMessage(event);
} else if (event.message.type === 'text') {
// テキストメッセージの処理
await handleEvent(event);
}
}
})).then((result) => res.json(result));
});
app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);
ログインするとコメントできます