github / github/gemoji

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

Đang mở
#331 1 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Ruby
Star
4.5k
Fork
802
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

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

Ниже — доработанный код ассистента, который **умеет собирать данные из соцсетей** (на примере 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:

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Start with the server.js example and the documented /data and /ask entry points, then compare the proposal with the gemoji repository. Run the listed node server.js and curl commands only if this standalone integration is intended; done would require a defined, repository-relevant feature and verification criteria.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
express, javascript, node.js
Lĩnh vực
ai, api, backend
Loại issue
Tính năng
Độ khó
5/5
Thời gian dự kiến
Hơn một tuần
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Cần làm rõ
Mức phù hợp với người mới
5/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.