wechat.js 4.22 KB
/**
 * routes/wechat.js — 微信数据导入 REST 路由
 *
 * POST /api/wechat/import-contacts  body: { limit? }
 *   → 调用 WechatImporter.importContacts(),返回导入统计
 *
 * POST /api/wechat/import-chat      body: { username, limit? }
 *   → 调用 WechatImporter.importChatHistory()
 *
 * GET  /api/wechat/contacts         query: ?q=搜索词&limit=50
 *   → 调用 WechatReader.getContacts() 然后本地过滤
 *
 * GET  /api/wechat/sessions         query: ?limit=100
 *   → 返回最近会话列表
 */

const express = require('express');
const router = express.Router();
const { WechatReader } = require('../services/wechat/wechat-reader');
const { WechatImporter } = require('../services/wechat/wechat-importer');

// 懒加载单例
let _reader = null;
let _importer = null;

function reader() {
    if (!_reader) _reader = new WechatReader();
    return _reader;
}
function importer() {
    if (!_importer) _importer = new WechatImporter();
    return _importer;
}

/**
 * POST /api/wechat/import-contacts
 * 批量导入微信联系人到图谱
 */
router.post('/import-contacts', (req, res) => {
    try {
        const limit = Math.min(parseInt(req.body?.limit) || 200, 20000);
        const result = importer().importContacts(limit);
        res.json({ ok: true, ...result });
    } catch (e) {
        console.error('[wechat] import-contacts error:', e);
        res.status(500).json({ ok: false, error: e.message });
    }
});

/**
 * POST /api/wechat/import-chat
 * 导入指定联系人的聊天记录
 */
router.post('/import-chat', (req, res) => {
    const { username, limit } = req.body || {};
    if (!username) {
        return res.status(400).json({ ok: false, error: '缺少 username 参数' });
    }
    try {
        const msgLimit = parseInt(limit) || 99999;
        const result = importer().importChatHistory(username, msgLimit);
        res.json({ ok: true, ...result });
    } catch (e) {
        console.error('[wechat] import-chat error:', e);
        res.status(500).json({ ok: false, error: e.message });
    }
});

/**
 * GET /api/wechat/contacts?q=搜索词&limit=50
 * 从 wechat_plain 搜索联系人(不写图谱)
 */
router.get('/contacts', (req, res) => {
    try {
        const q = (req.query.q || '').trim().toLowerCase();
        const limit = Math.min(parseInt(req.query.limit) || 50, 1000);

        // 读取足够多联系人以便本地过滤
        const fetchLimit = q ? 5000 : limit;
        let contacts = reader().getContacts(fetchLimit);

        if (q) {
            contacts = contacts.filter(c =>
                c.nickName.toLowerCase().includes(q) ||
                c.remark.toLowerCase().includes(q) ||
                c.alias.toLowerCase().includes(q) ||
                c.username.toLowerCase().includes(q)
            ).slice(0, limit);
        } else {
            contacts = contacts.slice(0, limit);
        }

        res.json({ ok: true, total: contacts.length, contacts });
    } catch (e) {
        console.error('[wechat] contacts error:', e);
        res.status(500).json({ ok: false, error: e.message });
    }
});

/**
 * GET /api/wechat/messages/:username?page=1&pageSize=200&q=关键词
 * 分页 + 搜索聊天记录(直接读 SQLite,不写图谱)
 */
router.get('/messages/:username', (req, res) => {
    const { username } = req.params;
    const page     = Math.max(1, parseInt(req.query.page)     || 1);
    const pageSize = Math.min(Math.max(1, parseInt(req.query.pageSize) || 200), 500);
    const q        = (req.query.q || '').trim();
    try {
        const result = reader().getMessagesPaged(username, page, pageSize, q);
        res.json({ ok: true, ...result });
    } catch (e) {
        console.error('[wechat] messages error:', e);
        res.status(500).json({ ok: false, error: e.message });
    }
});

/**
 * GET /api/wechat/sessions?limit=100
 * 获取最近会话列表
 */
router.get('/sessions', (req, res) => {
    try {
        const limit = Math.min(parseInt(req.query.limit) || 100, 500);
        const sessions = reader().getSessions(limit);
        res.json({ ok: true, total: sessions.length, sessions });
    } catch (e) {
        console.error('[wechat] sessions error:', e);
        res.status(500).json({ ok: false, error: e.message });
    }
});

module.exports = router;