Files
memind/scripts/push-wechat-news-morning-draft-now.mjs
john 91d5c7a1fd chore(infra): update Studio/103 host IP to 114.85.107.50
Replace all references to the previous Portal host 180.159.29.143 with
114.85.107.50 across release scripts, safety gates, runbooks, and docs.

Also add scripts/push-wechat-news-morning-draft-now.mjs for direct draft
push without waiting on the worker poll interval.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-21 09:49:09 +08:00

111 lines
3.6 KiB
JavaScript

#!/usr/bin/env node
/**
* 在 Portal 主机(103/143)上直接推送一条新闻早报到微信公众号草稿箱。
* 不依赖 worker 轮询,适合手动试推。
*
* 用法(在 143 上):
* cd /Users/john/Project/Memind
* node scripts/push-wechat-news-morning-draft-now.mjs
* node scripts/push-wechat-news-morning-draft-now.mjs --allow-yesterday
* node scripts/push-wechat-news-morning-draft-now.mjs --dry-run
*/
import process from 'node:process';
import mysql from 'mysql2/promise';
import { loadH5Environment } from './load-env.mjs';
import { loadWechatMpConfig } from '../wechat-mp-config.mjs';
import { createWechatNewsMorningDraftService } from '../wechat-news-morning-draft.mjs';
loadH5Environment(import.meta.dirname);
const DEFAULT_TANG_USER_ID = 'a70ff537-8908-486e-9b6c-042e07cc25db';
async function ensureDraftConfig(service) {
const current = await service.getConfig();
if (current.sourceUserId && current.enabled) return current;
const userId = String(process.env.H5_WECHAT_NEWS_MORNING_DRAFT_USER_ID ?? DEFAULT_TANG_USER_ID).trim();
return service.updateConfig({
enabled: true,
sourceUserId: userId,
autoPushEnabled: current.autoPushEnabled ?? false,
autoGenerateEnabled: current.autoGenerateEnabled ?? false,
}, { updatedBy: 'push-now-script' });
}
async function main() {
const dryRun = process.argv.includes('--dry-run');
const allowYesterday = process.argv.includes('--allow-yesterday');
if (!process.env.DATABASE_URL) {
console.error('DATABASE_URL missing');
process.exit(1);
}
const mpConfig = loadWechatMpConfig(process.env);
if (!mpConfig.enabled) {
console.error('微信服务号未启用:请确认 H5_WECHAT_MP_ENABLED=1 且 appId/secret/token/publicBaseUrl 齐全');
process.exit(1);
}
const pool = mysql.createPool({ uri: process.env.DATABASE_URL, connectionLimit: 2 });
const h5Root = process.env.H5_ROOT?.trim() || process.cwd();
const service = createWechatNewsMorningDraftService(pool, {
mpConfig,
h5Root,
memindLibRoot: h5Root,
env: process.env,
logger: console,
});
const config = await ensureDraftConfig(service);
console.log(JSON.stringify({
dryRun,
allowYesterday,
sourceUserId: config.sourceUserId,
templateId: config.templateId ?? null,
templateVersion: config.templateVersion ?? null,
h5Root,
}, null, 2));
const preview = await service.pushDraft({
dryRun: true,
requireToday: !allowYesterday,
triggeredBy: 'manual-push-now',
});
console.log('\n[preview]');
console.log(JSON.stringify({
pageSlug: preview.preview?.page?.slug ?? null,
pageUrl: preview.preview?.page?.slug ? preview.preview.page.publicUrl : null,
isTodayPage: preview.preview?.page?.isTodayPage ?? null,
title: preview.preview?.article?.title ?? null,
contentLength: preview.preview?.article?.content?.length ?? 0,
}, null, 2));
if (dryRun) {
console.log('\ndry-run:未调用微信 draft/add');
await pool.end();
return;
}
const result = await service.pushDraft({
requireToday: !allowYesterday,
triggeredBy: 'manual-push-now',
});
console.log('\n[success]');
console.log(JSON.stringify({
draftMediaId: result.draftMediaId,
pageSlug: result.preview?.page?.slug ?? null,
pageUrl: result.preview?.page?.publicUrl ?? null,
coverSource: result.cover?.source ?? null,
runId: result.run?.id ?? null,
}, null, 2));
await pool.end();
}
main().catch((error) => {
console.error('\n[failed]', error instanceof Error ? error.message : error);
if (error?.run) {
console.error(JSON.stringify(error.run, null, 2));
}
process.exit(1);
});