Zenn
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サーバーを実行中です…`);
ログインするとコメントできます