ИИ‑ассистент для сбора информации: расширенная версия с поддержкой соцсетей
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 5/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Cần làm rõ
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- express, javascript, node.js
Hướng nghiên cứu
Bắt đầu với ví dụ server.js và các điểm truy cập /data và /ask đã được tài liệu hóa, sau đó so sánh đề xuất với repository gemoji. Chỉ chạy các lệnh node server.js và curl được liệt kê nếu dự định triển khai tích hợp độc lập này; để được coi là hoàn tất, cần có một tính năng được xác định, phù hợp với repository, cùng các tiêu chí xác minh.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
ИИ‑ассистент для сбора информации: расширенная версия с поддержкой соцсетей
Ниже — доработанный код ассистента, который умеет собирать данные из соцсетей (на примере API VK и Telegram) и комбинировать их с локальными данными.
1. Обновлённые зависимости
Добавьте библиотеки для работы с API соцсетей:
npm install axios querystring dotenv-expand
2. Обновлённый .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 (с интеграцией соцсетей)
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. Тестирование расширенной версии
- Запустите сервер:
node server.js
- Проверьте сбор данных:
curl http://localhost:3000/data
- Задайте вопрос с учётом соцсетей:
curl -X POST http://localhost:3000/ask \
-H "Content-Type: application/json" \
-d '{"question": "Какие темы обсуждаются в группе VK за последнюю неделю?"}'
Пример ответа:
{
"answer": "В группе VK обсуждаются: 1) обновление API, 2) планы по релизу CRM, 3) вопросы безопасности.",
"sources": {
"local": "доступно",
"vk": "5 постов"
}
}
5. Дополнительные интеграции
Для Telegram (бот)
Добавьте маршрут для приёма сообщений:
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. Рекомендации по безопасности
-
Ограничение доступа к API:
// 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(); }); -
Валидация входных данных:
const { body } = req; if (typeof body.question !== 'string' || body.question.length > 1000) { return res.status(400).json({ error:
- Ngôn ngữ chính
- Ruby
- Star
- 4.5k
- Fork
- 804
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của github/gemoji
-
QR- vpnĐang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 20/100
-
[email protected]Đang mở
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 10/100
-
Is this project dead?Đang mở
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 20/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 25/100
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 10/100
Tất cả issue của github/gemoji
Issue tương tự
-
Update leinigen to 2.13.1Đang mở
Độ khó 2/5 Dưới một giờ Mức phù hợp với người mới 70/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Mend: dependency security vulnerability
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Mend: dependency security vulnerability
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
-
Mend: dependency security vulnerability
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 72/100
ManageIQ/manageiq-rpm_build#737 ·