diff --git a/src/app.js b/src/app.js index 5639e9b..c240ed8 100644 --- a/src/app.js +++ b/src/app.js @@ -144,6 +144,13 @@ app.get('/admin/domains', adminAuth, async (req, res) => { } catch (e) { res.render('admin/domains', { ssrData: initScript({}) }); } }); +app.get('/admin/mapper', adminAuth, async (req, res) => { + try { + const adsense = await db.query('SELECT id, name, client_id FROM adsense_configs ORDER BY id'); + res.render('admin/mapper', { ssrData: initScript({ adsense: adsense.rows, siteId: req.query.id || null }) }); + } catch (e) { res.render('admin/mapper', { ssrData: initScript({}) }); } +}); + app.get('/admin/logs', adminAuth, async (req, res) => { try { const logs = await db.query(`SELECT l.*, s.name AS site_name FROM crawl_logs l LEFT JOIN sites s ON s.id = l.site_id ORDER BY l.created_at DESC LIMIT 100`); diff --git a/src/routes/api.js b/src/routes/api.js index b3a7239..12b5df6 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -74,6 +74,29 @@ router.delete('/sites/:id', async (req, res) => { } }); +// ===================== 페이지 프리뷰 (비주얼 매퍼용) ===================== + +router.post('/fetch-page', async (req, res) => { + try { + const { url } = req.body; + if (!url) return res.status(400).json({ error: 'URL is required' }); + const axios = require('axios'); + const https = require('https'); + const response = await axios.get(url, { + httpsAgent: new https.Agent({ rejectUnauthorized: false }), + timeout: 30000, + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7', + }, + maxRedirects: 5, + }); + res.json({ html: response.data, finalUrl: response.request?.res?.responseUrl || url }); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + // ===================== 크롤링 ===================== // 즉시 크롤링 실행 diff --git a/views/admin/layout.ejs b/views/admin/layout.ejs index 50f8732..d28c11d 100644 --- a/views/admin/layout.ejs +++ b/views/admin/layout.ejs @@ -99,6 +99,7 @@ tr:hover td{background:rgba(255,255,255,.02)} 📊 대시보드 🌐 사이트 관리 💰 AdSense 관리 + 🧙 비주얼 매퍼 🔗 도메인 매핑 📝 로그
diff --git a/views/admin/mapper.ejs b/views/admin/mapper.ejs new file mode 100644 index 0000000..2d3fdd6 --- /dev/null +++ b/views/admin/mapper.ejs @@ -0,0 +1,358 @@ +<%- include('layout', { page: 'mapper', pageTitle: '비주얼 매퍼', body: ` + + + +
+ +
+
+ + +
+ +
+ URL을 입력하고 "페이지 가져오기"를 클릭하세요 +
+
+ + +
+ +
+

1 데이터 타입

+
+ + +
+
+ + + + + + + + + +
+
+ + +` }) %>