ИИ‑ассистент для сбора информации: расширенная версия с поддержкой соцсетей
還沒有人認領這個 Issue。
評估
- 難度
- 5/5
- 預估耗時
- 一週以上
- 新手友好度
- 5/100
- Issue 類型
- 功能
- 描述清晰度
- 需要釐清
- 活躍度
- 停滯
- 技術堆疊
- express, javascript, node.js
研究方向
先從 server.js 範例以及文件中說明的 /data 和 /ask 入口開始,然後將該提案與 gemoji repository 進行比較。只有在確實打算實作這項獨立整合時,才執行列出的 node server.js 和 curl 指令;若要視為完成,則需要有明確定義且與 repository 相關的功能,以及驗證標準。
由索引模型根據 Issue 內容生成。
描述
ИИ‑ассистент для сбора информации: расширенная версия с поддержкой соцсетей
Ниже — доработанный код ассистента, который умеет собирать данные из соцсетей (на примере 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:
- 主要語言
- Ruby
- 星號
- 4.5k
- 分支
- 804
- PR 合併指標
- 30 天內沒有已合併 PR
環境準備
- 沒有 Dockerfile 或 Docker Compose 檔案
- 沒有 Pull Request 範本
- 閱讀貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
github/gemoji 的其他 Issue
-
QR- vpn未關閉
難度 4/5 3-5 天 新手友好度 20/100
-
難度 5/5 一週以上 新手友好度 10/100
-
難度 5/5 一週以上 新手友好度 20/100
-
難度 2/5 1-3 小時 新手友好度 25/100
-
難度 5/5 一週以上 新手友好度 10/100
相似的 Issue
-
難度 2/5 1 小時以內 新手友好度 70/100
-
難度 2/5 1-3 小時 新手友好度 76/100
維護者通常 1 天內回覆
-
Mend: dependency security vulnerability
難度 2/5 1-3 小時 新手友好度 68/100
維護者通常 1 天內回覆
-
Mend: dependency security vulnerability
難度 2/5 1-3 小時 新手友好度 65/100
-
Mend: dependency security vulnerability
難度 1/5 1 小時以內 新手友好度 72/100
ManageIQ/manageiq-rpm_build#737 ·