File size: 1,787 Bytes
abed4cc
5d38af1
e6227e8
587da90
abed4cc
5d38af1
 
587da90
 
e6227e8
 
b00a859
e6227e8
b00a859
e6227e8
2817b54
e6227e8
 
587da90
 
b00a859
 
e6227e8
b00a859
5d38af1
c9a97eb
587da90
5d38af1
 
 
587da90
5d38af1
587da90
0b62239
 
 
 
 
587da90
 
c9a97eb
5d38af1
 
587da90
 
5d38af1
587da90
5d38af1
 
587da90
 
 
abed4cc
 
5d38af1
abed4cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
const express = require('express');
const rateLimit = require('express-rate-limit');
const axios = require('axios');

const app = express();
app.use(express.json());

const openai_key = process.env.OPENAI_KEY;

// Определяем лимитер с задержкой 30 секунд на IP
const generateImageLimiter = rateLimit({
  windowMs: 45 * 1000, // 30 секунд
  max: 1, // лимит: 1 запрос на IP
  handler: function (req, res) {
    return res.status(429).json({
      error: "Слишком много запросов с этого IP, пожалуйста, попробуйте позже. (Лимит 1 генерация изображения в 45 секунд)"
    });
  }
});

app.use('/generate-image', generateImageLimiter);

// Применяем лимитер только к определенному маршруту
app.post('/generate-image', async (req, res) => {
  const prompt = req.body.prompt;
  const apiKey = req.body.api || openai_key;

  if (!prompt) {
    return res.status(400).json({ error: 'Требуется параметр "prompt".' });
  }

  try {
    const response = await axios.post('https://api.openai.com/v1/images/generations', {
      prompt: prompt,
      n: 1,
      size: "1024x1024",
      quality: "hd",
      model: "dall-e-3",
    }, {
      headers: {
        'Authorization': `Bearer ${apiKey}`,
        'Content-Type': 'application/json',
      },
    });

    res.json(response.data);
  } catch (error) {
    console.error(error);
    res.status(500).json({ error: 'Произошла ошибка сервера при генерации изображения.' });
  }
});

const port = 7860;
app.listen(port, () => {
  console.log(`API сервер запущен на порту ${port}`);
});