github / github/gemoji

ИИ‑ассистент для сбора информации: расширенная версия с поддержкой соцсетей

Offen
#331 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Ruby
Sterne
4.5k
Forks
802
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

## ИИ‑ассистент для сбора информации: расширенная версия с поддержкой соцсетей

Ниже — доработанный код ассистента, который **умеет собирать данные из соцсетей** (на примере API VK и Telegram) и комбинировать их с локальными данными.

### 1. Обновлённые зависимости

Добавьте библиотеки для работы с API соцсетей:
```bash
npm install axios querystring dotenv-expand
```

### 2. Обновлённый `.env` (с ключами соцсетей)

```env
OPENAI_API_KEY=sk-your-openai-api-key-here
PORT=3000

# VK API
VK_API_KEY=your-vk-api-key
VK_GROUP_ID=123456789

# Telegram Bot (опционально)
TELEGRAM_BOT_TOKEN=your-telegram-bot-token
TELEGRAM_CHAT_ID=your-chat-id
```

### 3. Обновлённый `server.js` (с интеграцией соцсетей)

```javascript
require('dotenv').config();
const express = require('express');
const { OpenAI } = require('openai');
const fs = require('fs');
const path = require('path');
const axios = require('axios');
const querystring = require('querystring');

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

// Инициализация OpenAI
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});

// Промежуточное ПО для логирования
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`);
next();
});

// Функция: загрузка локальных данных
async function loadLocalData() {
const dataPath = path.join(__dirname, 'data', 'sample_data.json');
const data = fs.readFileSync(dataPath, 'utf8');
return JSON.parse(data);
}

// Функция: получение постов из VK
async function fetchVKPosts() {
try {
const params = {
owner_id: `-${process.env.VK_GROUP_ID}`,
count: 5,
access_token: process.env.VK_API_KEY,
v: '5.131'
};

const response = await axios.get(
'https://api.vk.com/method/wall.get',
{ params }
);

return response.data.response.items.map(post => ({
id: post.id,
text: post.text,
date: new Date(post.date * 1000).toISOString(),
likes: post.likes.count
}));
} catch (error) {
console.error('Ошибка при запросе к VK API:', error.message);
return [];
}
}

// Функция: комбинированный сбор данных
async function gatherAllData() {
const [localData, vkPosts] = await Promise.all([
loadLocalData(),
fetchVKPosts()
]);

return {
local: localData,
social: { vk: vkPosts },
timestamp: new Date().toISOString()
};
}

// Функция: запрос к OpenAI с мульти-источником
async function askOpenAI(prompt, context) {
const completion = await openai.chat.completions.create({
model: 'gpt-4-turbo', // лучше для анализа разнородных данных
messages: [
{
role: 'system',
content: `Ты — ассистент по сбору информации. Анализируй данные из разных источников (локальные данные, соцсети).
Если информации нет — скажи "Данных недостаточно". Отвечай кратко и по делу.`
},
{
role: 'user',
content: `Контекст:\n${JSON.stringify(context, null, 2)}\n\nВопрос:\n${prompt}`
}
],
temperature: 0.2,
max_tokens: 1500,
});
return completion.choices[0].message.content;
}

// Маршрут: задать вопрос ассистенту
app.post('/ask', async (req, res) => {
try {
const { question } = req.body;

if (!question) {
return res.status(400).json({ error: 'Поле "question" обязательно' });
}

// Собираем все данные
const allData = await gatherAllData();

// Отправляем запрос в OpenAI
const answer = await askOpenAI(question, allData);

res.json({
answer,
sources: {
local: allData.local ? 'доступно' : 'нет данных',
vk: allData.social.vk.length > 0 ? `${allData.social.vk.length} постов` : 'нет данных'
}
});
} catch (error) {
console.error('Ошибка:', error);
res.status(500).json({ error: 'Произошла ошибка на сервере' });
}
});

// Маршрут: проверка здоровья
app.get('/health', (req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});

// Маршрут: ручной сбор данных (для отладки)
app.get('/data', async (req, res) => {
try {
const data = await gatherAllData();
res.json(data);
} catch (error) {
res.status(500).json({ error: error.message });
}
});

// Запуск сервера
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Сервер запущен на порту ${PORT}`);
console.log('Доступные маршруты:');
console.log(' POST /ask — задать вопрос');
console.log(' GET /health — проверка состояния');
console.log(' GET /data — получить все собранные данные');
});
```

### 4. Тестирование расширенной версии

1. Запустите сервер:
```bash
node server.js
```

2. Проверьте сбор данных:
```bash
curl http://localhost:3000/data
```

3. Задайте вопрос с учётом соцсетей:
```bash
curl -X POST http://localhost:3000/ask \
-H "Content-Type: application/json" \
-d '{"question": "Какие темы обсуждаются в группе VK за последнюю неделю?"}'
```

**Пример ответа:**
```json
{
"answer": "В группе VK обсуждаются: 1) обновление API, 2) планы по релизу CRM, 3) вопросы безопасности.",
"sources": {
"local": "доступно",
"vk": "5 постов"
}
}
```

### 5. Дополнительные интеграции

#### Для Telegram (бот)
Добавьте маршрут для приёма сообщений:
```javascript
app.post('/telegram-hook', async (req, res) => {
const message = req.body.message.text;
const answer = await askOpenAI(message, await gatherAllData());

// Отправка ответа через Telegram Bot API
await axios.post(
`https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/sendMessage`,
{
chat_id: process.env.TELEGRAM_CHAT_ID,
text: answer
}
);
res.status(200).send('OK');
});
```

#### Для других соцсетей
- **Twitter/X**: используйте `twitter-api-v2`.
- **LinkedIn**: официальный API или `axios` с OAuth2.
- **Одноклассники**: API через `axios`.

### 6. Рекомендации по безопасности

1. **Ограничение доступа к API**:
```javascript
// Middleware для API-ключей
app.use('/ask', (req, res, next) => {
const apiKey = req.headers['x-api-key'];
if (apiKey !== process.env.API_SECRET) {
return res.status(401).json({ error: 'Неавторизованно' });
}
next();
});
```

2. **Валидация входных данных**:
```javascript
const { body } = req;
if (typeof body.question !== 'string' || body.question.length > 1000) {
return res.status(400).json({ error:

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.