AI Newsletter Digest improvements: fixed QP soft line break decoding, URL extraction, and content cleaning

This commit is contained in:
Krilly
2026-03-04 13:29:22 +00:00
parent 29a98137a7
commit 57dd294675
13706 changed files with 2114953 additions and 237629 deletions

View File

@@ -0,0 +1,45 @@
import fs from 'node:fs';
import { chromium } from 'playwright';
import { ENABLE_POSTING, SESSION_FILE, USER_AGENT } from './common.js';
const text = process.argv.slice(2).join(' ').trim();
if (!text) {
console.error('Usage: npm run post -- "your post text"');
process.exit(1);
}
if (!ENABLE_POSTING) {
console.error('Posting is disabled. Set ENABLE_POSTING=true in .env to enable.');
process.exit(1);
}
if (!fs.existsSync(SESSION_FILE)) {
console.error('No session found. Run: npm run login');
process.exit(1);
}
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({
storageState: SESSION_FILE,
userAgent: USER_AGENT || undefined,
viewport: { width: 1366, height: 900 }
});
const page = await context.newPage();
await page.goto('https://x.com/compose/post', { waitUntil: 'domcontentloaded', timeout: 60000 });
await page.waitForSelector('[data-testid="tweetTextarea_0"]', { timeout: 20000 });
await page.fill('[data-testid="tweetTextarea_0"]', text);
// Safety: we require explicit --confirm to actually click Post
const confirmed = process.argv.includes('--confirm');
if (!confirmed) {
console.log('Draft prepared, not posted. Re-run with --confirm to publish.');
await browser.close();
process.exit(0);
}
await page.click('[data-testid="tweetButtonInline"]');
await page.waitForTimeout(2000);
console.log('Post submitted.');
await browser.close();