feat: 新增美团脚本

This commit is contained in:
duanshuwen committed 2026-03-11 21:56:41 +08:00
1 parent 07d3e10056
commit f084e47c58
6 files changed
+58 -8

No files matched your search

+3 -1
View File
@@ -42,13 +42,15 @@ export function runTaskOperationService() {
})
const results: any[] = []
for (const item of scriptPaths) {
for (let i = 0; i < scriptPaths.length; i++) {
const item = scriptPaths[i]
log.info(`Launching script for channel ${item.channel}: ${item.scriptPath}`)
const result = await executeScriptServiceInstance.executeScript(item.scriptPath, {
roomType: roomType[item.channel],
startTime: options.startTime,
endTime: options.endTime,
operation: options.operation,
tabIndex: i,
})
results.push({
channel: item.channel,
+3 -4
View File
@@ -91,10 +91,9 @@ const toggleRoomByDateIndex = async (page, container, { roomType, dateIndex, ope
};
(async () => {
let browser;
const browser = await chromium.connectOverCDP('http://127.0.0.1:9222');
try {
browser = await chromium.connectOverCDP(`http://127.0.0.1:9222`);
const context = browser.contexts()[0];
await context.addInitScript(() => {
@@ -102,8 +101,8 @@ const toggleRoomByDateIndex = async (page, container, { roomType, dateIndex, ope
});
const pages = await context.pages();
const page = pages.length ? pages[0] : await context.newPage();
const tabIndex = Number(process.env.TAB_INDEX);
const page = pages.length ? pages[tabIndex] : await context.newPage();
await page.goto('https://hotel.fliggy.com/ebooking/hotelBaseInfoUv.htm#/ebk/homeV1');
+3
View File
@@ -0,0 +1,3 @@
```html
<div class="product-container" data-v-2311e292=""><div class="sub-header" data-v-4ad0f163="" data-v-2311e292=""><div class="product-notice-alert" use-custom-pr-freshs="" data-v-bcd285a2="" data-v-4ad0f163=""><div class="lion-push-notice" eventtype="" extrastyle="" usecustomrsfresh="true" usecustomprfresh="false" data-v-1d6a6128="" data-v-bcd285a2="" style="display: none;"><!----></div><div class="supply-notice" eventtype="" extrastyle="" usecustomrsfresh="true" usecustomprfresh="false" data-v-5445a116="" data-v-bcd285a2="" style="display: none;"><!----></div><div class="lz-announcement lz-announcement-warning lz-announcement-closable hotspot-calendar-notice" source="roomstatus" data-v-1d80a1e6="" data-v-bcd285a2=""><i class="lz-announcement-icon lzicon lzicon-warning-circle"></i><div class="lz-announcement-content"><div class="lz-announcement-title"><span class="notice-desc high-light" data-v-1d80a1e6="">第29届安团家博会-贵阳展将至</span><span class="notice-desc" data-v-1d80a1e6="">,请提前调整好</span><span class="notice-desc high-light" data-v-1d80a1e6="">03月20日至03月22日</span><span class="notice-desc" data-v-1d80a1e6="">房价,确保房量和房态准确,</span><span class="notice-desc" data-v-1d80a1e6="">并及时安排好接单人员</span><span data-v-1d80a1e6=""><a href="javascript:;" class="right-link" data-v-1d80a1e6="">查看其他热点</a></span><div class="notice-actions" data-v-1d80a1e6=""><a href="javascript:;" data-v-1d80a1e6="">立即维护</a></div></div><!----><div class="lz-announcement-close"><i class="lzicon lzicon-close-thick"></i></div></div></div></div><!----><!----><!----><!----><div class="eb-header-container" data-v-4ad0f163="" style="margin-bottom: 12px;"><form class="lz-form lz-form-right lz-form-inline" autocomplete="off" style="display: flex; flex-wrap: wrap;"><div class="lz-form-item lz-form-item-right"><!----><div class="lz-form-item-content"><button class="lz-btn lz-btn-primary" type="button"><!---->新增产品(新)</button><!----><!----></div></div><div class="lz-form-item lz-form-item-right"><!----><div class="lz-form-item-content"><button class="lz-btn lz-btn-primary lz-btn-ghost" type="button"><!---->批量修改销售规则</button><!----><!----></div></div><div class="lz-form-item lz-form-item-right"><!----><div class="lz-form-item-content"><button class="lz-btn lz-btn-primary lz-btn-ghost" type="button"><!----><span style="margin-right: 4px;">查看协议与记录</span><i class="lzicon lzicon-down"></i></button><!----><!----></div></div><!----><!----><!----><div class="lz-form-item lz-form-item-right"><!----><div class="lz-form-item-content"><button class="lz-btn lz-btn-primary lz-btn-ghost" type="button"><!---->热点日历</button><!----><!----></div></div></form></div><!----><!----><div class="common-search-area" data-v-4ad0f163=""><div class="merchant-search-area" data-v-df6b8148="" data-v-4ad0f163=""><form class="lz-form lz-form-right lz-form-inline header-form" autocomplete="off" data-v-df6b8148="" style="display: flex; flex-wrap: wrap;"><div class="lz-form-item lz-form-item-right" data-v-df6b8148=""><!----><div class="lz-form-item-content"><button class="lz-btn lz-btn-primary" type="button" data-v-df6b8148=""><!---->快速筛选房型</button><!----><!----></div></div><div class="lz-form-item lz-form-item-right" data-v-df6b8148=""><!----><div class="lz-form-item-content"><div class="calendar-date-picker" data-v-df6b8148=""><div class="lz-date-picker lz-date-picker-selected date-picker popper-identification-symbol" style="width: 175px;"><div class="date-picker lz-date-picker-editor lz-input-wrapper lz-range-picker"><!----><!----><input class="date-picker lz-date-picker-editor lz-input" closable="true" loading="false" show-tag="true" placeholder="" type="text"><span class="range-separator"> ~ </span><input class="date-picker lz-date-picker-editor lz-input" closable="true" loading="false" show-tag="true" placeholder="" type="text"><span class="lz-input-suffix-inner"><i class="lzicon lzicon-calendar-o"></i></span><!----></div></div></div><!----><!----></div></div><div class="lz-form-item lz-form-item-right quick-select-box" data-v-df6b8148=""><!----><div class="lz-form-item-content"><div class="main-container" data-v-20a91b9c="" data-v-df6b8148=""><div class="quick-select-container" data-v-20a91b9c=""><div class="lz-checkbox-group checkbox-wrapper" data-v-20a91b9c=""><label class="lz-checkbox lz-checkbox-checked" data-v-20a91b9c="" style="margin-left: 8px;"><input class="lz-checkbox-input" type="checkbox" style="display: none;"><span class="lz-checkbox-inner"><i class="lzicon lzicon-check-thick"></i></span><span class="lz-checkbox-text">全日房</span></label><label class="lz-checkbox" data-v-20a91b9c="" style="margin-left: 8px;"><input class="lz-checkbox-input" type="checkbox" style="display: none;"><span class="lz-checkbox-inner"><i class="lzicon lzicon-check-thick" style="display: none;"></i></span><span class="lz-checkboLine truncated
```
Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

+46 -2
View File
@@ -1,4 +1,48 @@
import { chromium } from 'playwright';
import log from 'electron-log';
log.info('mt_trace.mjs placeholder: not implemented');
process.exit(0);
const getOrCreateTab = async (context, targetIndex) => {
const idx =
Number.isFinite(targetIndex) && targetIndex >= 0 ? Math.floor(targetIndex) : 1;
let pages = await context.pages();
while (pages.length <= idx) {
await context.newPage();
pages = await context.pages();
}
const page = pages[idx];
await page.bringToFront();
return page;
};
(async () => {
const browser = await chromium.connectOverCDP('http://127.0.0.1:9222');
try {
const context = browser.contexts()[0];
if (!context) {
throw new Error('No browser context available');
}
await context.addInitScript(() => {
Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
});
const tabIndex = Number(process.env.TAB_INDEX);
const page = await getOrCreateTab(context, tabIndex);
await page.goto('https://me.meituan.com/ebooking/merchant/product#/index');
} catch (error) {
log.error(error);
process.exitCode = 1;
} finally {
if (browser) {
try {
if (typeof browser.disconnect === 'function') {
await browser.disconnect();
} else {
await browser.close();
}
} catch {}
}
}
})();
@@ -22,6 +22,7 @@ export class executeScriptService extends EventEmitter {
const startTime = options?.startTime ?? '';
const endTime = options?.endTime ?? '';
const operation = options?.operation ?? '';
const tabIndex = options?.tabIndex ?? '';
const child = spawn('node', [scriptPath], {
env: {
@@ -29,7 +30,8 @@ export class executeScriptService extends EventEmitter {
ROOM_TYPE: String(roomType),
START_DATE: String(startTime),
END_DATE: String(endTime),
OPERATION: String(operation)
OPERATION: String(operation),
TAB_INDEX: String(tabIndex),
},
});