forked from admin/zeropost-engine
feat: Зеро-персонаж, auto-publish, auto-series, channel-stats, fallback covers
- Персонаж Зеро: 23 позы (zeroCharacter.js), скрипты генерации - Auto-publish статей в TG: multipart upload, кнопки, режим alternating Zero/cover - Fallback цепочка обложек: aiprimetech gpt-5.5 → Pollinations → local SVG (6 палитр) - Auto-series: Claude haiku определяет серию для каждой статьи автоматически - Channel stats: подписчики, история, delta 24h/7d - Photo-search: Yandex API, профили доменов, Redis лимиты - Scheduled posts runner: backfill, preview, queue, cancel - promptBuilder: author_persona Зеро, голос от первого лица - Fixes: dollar-placeholder bugs в PATCH channels/autogen, listArticles фильтры - AI model: gpt-5.5 для image generation
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const axios = require('axios');
|
||||
const FormData = require('form-data');
|
||||
|
||||
process.chdir('/var/www/zeropost-engine');
|
||||
require('dotenv').config({ path: '/var/www/zeropost-engine/.env' });
|
||||
const settings = require('/var/www/zeropost-engine/src/services/settings');
|
||||
const { query } = require('/var/www/zeropost-engine/src/config/db');
|
||||
|
||||
(async () => {
|
||||
const { rows: chs } = await query(`SELECT * FROM channels WHERE id=1`);
|
||||
const channel = chs[0];
|
||||
const tgBase = await settings.get('TELEGRAM_API_BASE', 'https://api.telegram.org');
|
||||
|
||||
const files = [
|
||||
'/var/www/zeropost-uploads/zero-avatar-1780332236389.webp',
|
||||
'/var/www/zeropost-uploads/zero-laptop-1780332301106.webp',
|
||||
];
|
||||
|
||||
const form = new FormData();
|
||||
form.append('chat_id', String(channel.tg_channel_id));
|
||||
const media = files.map((_, i) => ({
|
||||
type: 'photo',
|
||||
media: `attach://photo${i}`,
|
||||
caption: i === 0 ? `🧪 Тест Зеро — 2 ракурса:\n1. аватар (анфас)\n2. за ноутбуком\n\n(третий не пошёл, шлюз поломался)\n\nКак тебе персонаж? Стоит дорабатывать или искать другой образ?` : undefined,
|
||||
}));
|
||||
form.append('media', JSON.stringify(media));
|
||||
files.forEach((f, i) => form.append(`photo${i}`, fs.createReadStream(f)));
|
||||
|
||||
const res = await axios.post(`${tgBase}/bot${channel.bot_token}/sendMediaGroup`, form, {
|
||||
headers: form.getHeaders(),
|
||||
timeout: 60000, maxContentLength: Infinity, maxBodyLength: Infinity,
|
||||
});
|
||||
const ids = (res.data?.result || []).map(m => m.message_id);
|
||||
console.log('sent ids:', ids.join(','));
|
||||
})().catch(e => console.error('FAIL:', e.response?.data || e.message));
|
||||
Reference in New Issue
Block a user