2026淡纹眼膜深度测评!紧致提亮抗皱全能款,适配眼周松弛暗沉人群首选
/** * 通用媒介回链模板(适配媒介行/媒介盒子/超级媒介) * 用法:node meijie_unified.js 平台名称(meijiehang/meijiehezi/chaojimeijie) 媒体名称 抓取URL * 前提:Chrome以 --remote-debugging-port=9222 启动 */ const puppeteer = require('puppeteer-core'); const CDP = require('chrome-remote-interface'); const axios = require('axios'); const cheerio = require('cheerio'); const fs = require('fs'); const path = require('path'); const { URL } = require('url'); // ====================== 原版配置 100% 不动 ====================== const PLATFORM_CONFIG = { meijiehang: { usePuppeteer: true, cdpPort: 9222, logDir: path.join(process.env.USERPROFILE || process.env.HOME, 'Desktop'), crawlMaxPages: 5, maxProcessPages: 5, timeout: 15000, shortTitleLength: 16, randomDelayRange: [500, 1500], selector: { table: '.re_table', row: 'tr.re_tbody', checkbox: 'input[name="CheckMed"]', page: '.pagmun', iframe: 'iframe[src*="Order_Release.aspx"]', input: 'input[placeholder="出稿链接禁止出现违规信息"]', submit: 'input[value="提交出稿"]', confirm: '.layui-layer-btn0', publish: 'input[value="出稿"]' }, skipStatus: ['已完成','已出稿','已撤稿','已拒绝','已退款'], baseUrl: (mediaName, customWebname) => `http://vip.meijiehang.com/Manage/Order_list.aspx?1=1&Year=9&PdState=2&Webname=${customWebname || encodeURIComponent(mediaName)}` }, meijiehezi: { usePuppeteer: false, cdpPort: 9222, logDir: path.join(process.env.USERPROFILE || process.env.HOME, 'Desktop'), crawlMaxPages: 5, maxProcessPages: 5, timeout: 15000, matchThreshold: 80, shortTitleLength: 16, randomDelayRange: [800, 2000], selector: { publishTab: 'button.am-btn:contains("发布中")', mediaInput: '#media_name', searchBtn: 'button.am-btn-primary:contains("搜索")', orderTable: '.am-table tbody tr', publishBtn: '.am-btn-primary:contains("发布")', urlInput: '#pub_url2, .am-modal-active input[placeholder*="网址"]', submitBtn: '#my-confirm1_2.am-modal-active .am-btn-primary', closeBtn: '.am-modal-active .am-modal-close', resultAlert: '#my-alert.am-modal-active', pagination: '#my_order_info', pageInput: '#changePage', pageBtn: '#dataTable-btn', prevPage: '#my_order_previous' }, skipStatus: ['已完成'] }, chaojimeijie: { usePuppeteer: false, cdpPort: 9222, logDir: path.join(process.env.USERPROFILE || process.env.HOME, 'Desktop'), crawlMaxPages: 5, maxProcessPages: 5, timeout: 15000, shortTitleLength: 16, randomDelayRange: [800, 2000], selector: { publishTab: 'label.el-radio-button:contains("发布中")', mediaInput: 'label.el-form-item__label:contains("媒体名称") + div input.el-input__inner', searchBtn: 'button.el-button--primary:contains("搜索")', orderTable: '.el-table__body tr', publishBtn: 'button:contains("发布")', urlInput: '.el-dialog input:not(.is-hidden)', submitBtn: '.el-dialog button:contains("提交")', closeBtn: '.el-dialog__close', successAlert: '.el-message--success', errorAlert: '.el-message--error', pagination: '.el-pagination', lastPage: '.el-pagination li.number:last-child', prevPage: '.btn-prev' }, skipStatus: ['已完成'] } }; // ====================== 原版参数校验 100% 不动 ====================== if (process.argv.length < 5) { console.log('\x1B[31m❌ 用法:node meijie_unified.js 平台名称 媒体名称 抓取URL\x1B[0m'); console.log('\x1B[36m示例:node meijie_unified.js chaojimeijie 诸城新闻网 http://www.zcnews.net.cn/zixun\x1B[0m'); process.exit(1); } const [, , platformKey, mediaName, crawlUrl] = process.argv; if (!PLATFORM_CONFIG[platformKey]) { console.log('\x1B[31m❌ 平台名称仅支持:meijiehang/meijiehezi/chaojimeijie\x1B[0m'); process.exit(1); } const CONFIG = PLATFORM_CONFIG[platformKey]; // ====================== 原版工具函数 100% 不动 ====================== const now = () => new Date().toTimeString().slice(0,8); const fileTime = () => new Date().toISOString().replace(/\D/g,'').slice(0,15); const sleep = ms => new Promise(r => setTimeout(r, ms)); const logFile = path.join(CONFIG.logDir, `meijie_unified_${fileTime()}.txt`); const writeLog = (msg) => { const line = `[${now()}] ${msg}`; const color = /成功|✅/.test(msg) ? '\x1B[32m%s\x1B[0m' : /失败|❌/.test(msg) ? '\x1B[31m%s\x1B[0m' : '%s'; console.log(color, line); try { fs.appendFileSync(logFile, line+'\n','utf8'); } catch (e) {} }; // ====================== 原版文章抓取 100% 不动 ====================== let articles = [], exactTitleIndex = {}; const loadArticles = async () => { let currentPage = 1, nextPageUrl = crawlUrl, totalFetched = 0, totalFiltered = 0; articles = [], exactTitleIndex = {}; writeLog(`✅ 开始抓取【${mediaName}】文章:${crawlUrl}`); try { while (currentPage <= CONFIG.crawlMaxPages && nextPageUrl) { writeLog(`🔍 抓取第${currentPage}页`); const res = await axios.get(nextPageUrl, { timeout: CONFIG.timeout, headers: {'User-Agent': 'Mozilla/5.0'} }); const $ = cheerio.load(res.data); const pageArticles = []; $('a').each((_, el) => { const $el = $(el); const title = $el.text().trim().replace(/\s+/g, ' '); let url = $el.attr('href'); if (!title || !url || title.length < 6) return; if (url.startsWith('/')) url = new URL(url, nextPageUrl).href; if (url.startsWith('http')) pageArticles.push({ title, url }); }); const newArticles = pageArticles.filter(art => !articles.some(exist => exist.url === art.url)); articles.push(...newArticles); newArticles.forEach(art => exactTitleIndex[art.title] = art.url); totalFetched += pageArticles.length; totalFiltered += newArticles.length; nextPageUrl = $(`a:contains("下一页")`).attr('href') || null; currentPage++; await sleep(1000); } writeLog(`✅ 抓取完成:有效文章${totalFiltered}篇`); } catch (e) { process.exit(1); } }; // ====================== 原版标题匹配 100% 不动 ====================== const matchUrl = (orderTitle) => { if (!orderTitle || orderTitle.length < 5) return null; const cleanTitle = orderTitle.trim().replace(/\s+/g, ' '); if (exactTitleIndex[cleanTitle]) { writeLog(` ✅ 精确匹配`); return exactTitleIndex[cleanTitle]; } const shortTitle = cleanTitle.length > 16 ? cleanTitle.substring(0, 16) : cleanTitle; for (const art of articles) { if (art.title.includes(shortTitle)) { writeLog(` ✅ 短标题匹配`); return art.url; } } writeLog(` ❌ 匹配失败`); return null; }; // ====================== 原版初始化 100% 不动 ====================== let browser, page, cdpClient; const stats = { success: 0, failed: 0, skipped: 0, noMatch: 0 }; const initChrome = async () => { try { if (CONFIG.usePuppeteer) { browser = await puppeteer.connect({ browserURL: `http://127.0.0.1:${CONFIG.cdpPort}` }); page = (await browser.pages())[0]; } else { const targets = await CDP.List({ port: CONFIG.cdpPort }); const target = targets.find(t => t.url?.includes(platformKey)) || targets[0]; cdpClient = await CDP({ target, port: CONFIG.cdpPort }); await cdpClient.Runtime.enable(); } writeLog(`✅ Chrome连接成功`); } catch (e) { process.exit(1); } }; // ====================== 🔥 核心:三个平台完全独立 100% 原生代码 ====================== const processPlatformOrders = async () => { // ============================================== // 媒介行:原版代码 100% 不动 // ============================================== if (platformKey === 'meijiehang') { const baseUrl = CONFIG.baseUrl(mediaName); await page.goto(baseUrl); await sleep(2000); const orders = await page.$$eval(CONFIG.selector.row, rows => rows.map(r => ({ id: r.querySelector('input[name="CheckMed"]')?.value, title: r.querySelectorAll('td')[2]?.textContent.trim() || '', status: r.querySelectorAll('td')[5]?.textContent.trim() || '' }))); for (const order of orders) { if (CONFIG.skipStatus.some(s => order.status.includes(s))) { stats.skipped++; continue; } const url = matchUrl(order.title); if (!url) { stats.noMatch++; continue; } try { await page.evaluate(oid => Tccg('出稿', `Order_Release.aspx?Oid=${oid}`, '520px'), order.id); await sleep(2000); const frame = await (await page.$(CONFIG.selector.iframe)).contentFrame(); await frame.$eval(CONFIG.selector.input, (el, val) => { el.value = val; el.dispatchEvent(new Event('input')); }, url); await frame.click(CONFIG.selector.submit); stats.success++; writeLog(` ✅ 提交成功`); } catch (e) { stats.failed++; writeLog(` ❌ 提交失败`); } } } // ============================================== // 媒介盒子:直接用你【单独能跑】的 meijiehezi1.js 原生代码 // 流程:1输入媒体名 → 2发布中 → 3搜索 // ============================================== else if (platformKey === 'meijiehezi') { const cdpEval = async (exp) => { const res = await cdpClient.Runtime.evaluate({ expression: exp, returnByValue: true }); return res.result.value || ''; }; // 1 输入媒体名称(原生代码) writeLog("1. 媒介盒子:输入媒体名称"); await cdpEval(` const inp = document.getElementById('media_name'); inp.value = '${mediaName.replace(/'/g, "\\'")}'; inp.dispatchEvent(new Event('input', { bubbles: true })); `); await sleep(1000); // 2 点击发布中(原生代码) writeLog("2. 媒介盒子:点击发布中"); await cdpEval(`document.querySelector('button.am-btn:contains("发布中")').click();`); await sleep(1500); // 3 点击搜索(原生代码) writeLog("3. 媒介盒子:点击搜索"); await cdpEval(`document.querySelector('button.am-btn-primary:contains("搜索")').click();`); await sleep(4000); // 回链逻辑(原生代码) const orders = JSON.parse(await cdpEval(` JSON.stringify(Array.from(document.querySelectorAll('.am-table tbody tr')).map((tr, idx) => ({ idx, title: tr.querySelectorAll('td')[2].textContent.trim() }))) `)); for (const order of orders) { const url = matchUrl(order.title); if (!url) { stats.noMatch++; continue; } try { await cdpEval(`document.querySelectorAll('.am-btn-primary:contains("发布")')[${order.idx}].click();`); await sleep(2000); await cdpEval(`document.querySelector('#pub_url2').value = '${url.replace(/'/g, "\\'")}';`); await cdpEval(`document.querySelector('#my-confirm1_2 .am-btn-primary').click();`); await sleep(2000); stats.success++; writeLog(` ✅ 提交成功`); } catch (e) { stats.failed++; writeLog(` ❌ 提交失败`); } } } // ============================================== // 超级媒介:直接用你【单独能跑】的 chaojimeijie1.js 原生代码 // 流程:1输入媒体名 → 2发布中 → 3搜索 // ============================================== else if (platformKey === 'chaojimeijie') { const cdpEval = async (exp) => { const res = await cdpClient.Runtime.evaluate({ expression: exp, returnByValue: true }); return res.result.value || ''; }; // 1 输入媒体名称(原生代码) writeLog("1. 超级媒介:输入媒体名称"); await cdpEval(` const label = Array.from(document.querySelectorAll('label.el-form-item__label')).find(l => l.textContent.includes('媒体名称')); const inp = label.parentElement.querySelector('input.el-input__inner'); inp.value = '${mediaName.replace(/'/g, "\\'")}'; inp.dispatchEvent(new Event('input', { bubbles: true })); `); await sleep(1000); // 2 点击发布中(原生代码) writeLog("2. 超级媒介:点击发布中"); await cdpEval(`document.querySelector('label.el-radio-button:contains("发布中")').click();`); await sleep(1500); // 3 点击搜索(原生代码) writeLog("3. 超级媒介:点击搜索"); await cdpEval(`document.querySelector('button.el-button--primary:contains("搜索")').click();`); await sleep(4000); // 回链逻辑(原生代码) const orders = JSON.parse(await cdpEval(` JSON.stringify(Array.from(document.querySelectorAll('.el-table__body tr')).map((tr, idx) => ({ idx, title: tr.querySelectorAll('td')[1].textContent.trim() }))) `)); for (const order of orders) { const url = matchUrl(order.title); if (!url) { stats.noMatch++; continue; } try { await cdpEval(` const rows = document.querySelectorAll('.el-table__body tr'); rows[${order.idx}].querySelector('button:contains("发布")').click(); `); await sleep(2000); await cdpEval(` const inp = document.querySelector('.el-dialog input:not(.is-hidden)'); inp.value = '${url.replace(/'/g, "\\'")}'; inp.dispatchEvent(new Event('input', { bubbles: true })); `); await cdpEval(`document.querySelector('.el-dialog button:contains("提交")').click();`); await sleep(2000); stats.success++; writeLog(` ✅ 提交成功`); } catch (e) { stats.failed++; writeLog(` ❌ 提交失败`); } } } }; // ====================== 原版主流程 100% 不动 ====================== const main = async () => { await loadArticles(); await initChrome(); await processPlatformOrders(); writeLog(`\n✅ 成功:${stats.success} ❌ 失败:${stats.failed} ⏭ 跳过:${stats.skipped} ❌ 不匹配:${stats.noMatch}`); process.exit(0); }; main().catch(e => { console.log(e); process.exit(1); });
【免责声明】
此文为在诸城新闻网出于传播更多信息的转载发布,不代表本文的观点及立场。所涉文、图等资料的一切权力和法律责任归材料提供方所有和承担。文章内容仅供参考,不构成任何购买、投资等建议,据此操作风险自担!如若本文有任何内容侵犯您的权益,请及时联系本站邮箱:1958 11781@qq.com,本站将会在24小时内处理完毕。