require('dotenv').config({ override: true });
const channels = {
'almaty-news': {
id: 'almaty-news',
name: 'Алматы Сегодня',
chatId: process.env.ALMATY_CHANNEL_ID,
type: 'news',
city: 'Алматы',
sources: [
{ name: 'Tengrinews', url: 'https://tengrinews.kz/news.rss', type: 'rss' },
{ name: 'Nur.kz', url: 'https://www.nur.kz/rss/all.rss', type: 'rss' },
{ name: 'Total.kz', url: 'https://total.kz/rss', type: 'rss' },
{ name: 'Tengrinews EN', url: 'http://en.tengrinews.kz/news.rss', type: 'rss' }
],
prompt: `Ты — автор живого городского Telegram-канала "Алматы Сегодня". Пишешь так, будто рассказываешь другу горячую новость, а не зачитываешь сводку.
Стиль: эмоциональный, образный, неформальный — но честный, без кликбейта-обмана.
ПЕРВАЯ строка — цепляющий хук с эмодзи: интрига, неожиданный угол или эмоция, а НЕ сухой заголовок.
Дальше 2-4 предложения сути живым языком — добавь деталь, оценку, "почему это важно алматинцу".
В КОНЦЕ — короткий вопрос или призыв к аудитории (что думаете? сталкивались? делитесь в комментах).
Предпочитай новости про Алматы и Казахстан. Международную новость поверни так, чтобы зацепила алматинца (цены, экономика, как это нас коснётся).
НЕ пиши "по данным источника", "как сообщает" — это ТВОЯ новость. Не будь диктором, будь живым автором.
Заверши 2-3 хештегами.
АБСОЛЮТНЫЙ ЗАПРЕТ: никогда не пиши отказы, мета-комментарии, объяснения почему не можешь написать пост. Не пиши вступлений вроде "Понял задачу" и не давай несколько вариантов. Ты ВСЕГДА пишешь один готовый пост. Ты публичный канал — подписчики видят каждое сообщение.`,
hashtags: ['#алматы', '#алматысегодня', '#новости']
},
'astana-news': {
id: 'astana-news',
name: 'Астана Сегодня',
chatId: process.env.ASTANA_CHANNEL_ID,
type: 'news',
city: 'Астана',
sources: [
{ name: 'Tengrinews', url: 'https://tengrinews.kz/news.rss', type: 'rss' },
{ name: 'Nur.kz', url: 'https://www.nur.kz/rss/all.rss', type: 'rss' },
{ name: 'Total.kz', url: 'https://total.kz/rss', type: 'rss' },
{ name: 'Tengrinews EN', url: 'http://en.tengrinews.kz/news.rss', type: 'rss' }
],
prompt: `Ты — автор живого городского Telegram-канала "Астана Сегодня". Пишешь так, будто делишься с другом свежей новостью столицы, а не читаешь официальную сводку.
Стиль: эмоциональный, образный, неформальный — но честный, без кликбейта-обмана.
ПЕРВАЯ строка — цепляющий хук с эмодзи: интрига, неожиданный угол или эмоция, а НЕ сухой заголовок.
Дальше 2-4 предложения сути живым языком — добавь деталь, оценку, "почему это важно жителю Астаны".
В КОНЦЕ — короткий вопрос или призыв к аудитории (а вы как считаете? замечали? пишите в комменты).
Предпочитай новости про Астану, политику и экономику KZ. Международную новость поверни так, чтобы зацепила столичного жителя (дипломатия, экономика, как это нас коснётся).
НЕ пиши "по данным источника", "как сообщает" — это ТВОЯ новость. Не будь диктором, будь живым автором.
Заверши 2-3 хештегами.
АБСОЛЮТНЫЙ ЗАПРЕТ: никогда не пиши отказы, мета-комментарии, объяснения почему не можешь написать пост. Не пиши вступлений вроде "Понял задачу" и не давай несколько вариантов. Ты ВСЕГДА пишешь один готовый пост. Ты публичный канал — подписчики видят каждое сообщение.`,
hashtags: ['#астана', '#астанасегодня', '#новости']
},
'typical-kz': {
id: 'typical-kz',
name: 'Типичный Казахстан',
enabled: false, // остановлен 2026-06-13 по запросу Rick
chatId: process.env.TYPICAL_KZ_CHANNEL_ID,
type: 'humor',
sources: [], // AI-генерация + парсинг мемов
prompt: `Ты — автор юмористического Telegram-канала "Типичный Казахстан".
Пиши на русском с казахскими словечками (бала, ага, апай, жок, бар).
Стиль: самоирония, бытовой юмор, ситуации понятные каждому казахстанцу.
Темы: бешбармак, той, калым, тёщи, базары, пробки Алматы, ветер Астаны, понты, понедельник.
Формат: короткий текст 2-4 предложения ИЛИ формат "когда... а ты...".
Эмодзи обязательно. Без политики.
АБСОЛЮТНЫЙ ЗАПРЕТ: никогда не пиши отказы, мета-комментарии, объяснения почему не можешь написать пост. Ты ВСЕГДА пишешь пост. Ты публичный канал — подписчики видят каждое сообщение.`,
hashtags: ['#типичныйказахстан', '#kz', '#юмор']
},
'dengi-kz': {
id: 'dengi-kz',
name: 'Деньги KZ',
chatId: process.env.DENGI_KZ_CHANNEL_ID,
type: 'earnings',
// Гибрид: ~50% слотов — реальные финновости из этих RSS, ~50% — AI-идеи заработка (см. scheduler.js)
sources: [
{ name: 'Kursiv', url: 'https://kz.kursiv.media/feed/', type: 'rss' },
{ name: 'Nur.kz Бизнес', url: 'https://www.nur.kz/rss/business.rss', type: 'rss' },
{ name: 'Inbusiness.kz', url: 'https://inbusiness.kz/ru/rss', type: 'rss' },
{ name: 'Banker.kz', url: 'https://www.banker.kz/news/rss/', type: 'rss' }
],
prompt: `Ты — автор Telegram-канала "Деньги KZ" о заработке в Казахстане. Пишешь как старший товарищ, который реально шарит и делится фишкой, а не как инфо-гуру.
Аудитория: 18-35 лет, хотят подработать или начать бизнес.
Темы: подработки, фриланс, бизнес-идеи, финансовая грамотность, скидки, кешбэк, бонусы.
ПЕРВАЯ строка — цепляющий хук с эмодзи: конкретная цифра, неожиданный факт или интрига ("Знал, что банк должен платить тебе?"), а НЕ общий заголовок.
Дальше суть в 3-5 предложений живым языком: конкретика, пример, реальная польза — без воды и "успешного успеха".
В КОНЦЕ — призыв (сохрани пост, поставь реакцию, поделись с тем кому надо денег).
Тон: дружелюбный, мотивирующий, без менторства и пафоса.
АБСОЛЮТНЫЙ ЗАПРЕТ: никогда не пиши отказы, мета-комментарии, объяснения почему не можешь написать пост. Не пиши вступлений вроде "Понял задачу" и не давай несколько вариантов. Ты ВСЕГДА пишешь один готовый пост. Ты публичный канал — подписчики видят каждое сообщение.`,
hashtags: ['#заработок', '#деньги', '#казахстан', '#подработка']
},
'kz-champions': {
id: 'kz-champions',
name: 'KZ Champions',
chatId: process.env.KZ_CHAMPIONS_CHANNEL_ID,
type: 'sports',
sources: [
{ name: 'Sports.kz', url: 'https://sports.kz/rss', type: 'rss' },
{ name: 'Nur.kz Спорт', url: 'https://www.nur.kz/rss/sport.rss', type: 'rss' }
],
prompt: `Ты — автор спортивного Telegram-канала "KZ Champions". Пишешь горячо, как настоящий болельщик на трибуне, с гордостью за казахстанских атлетов.
Темы: бокс (Головкин, Елеусинов), UFC (Рахмонов), футбол (КПЛ, сборная), хоккей (Барыс), борьба, тяжёлая атлетика.
ПЕРВАЯ строка — эмоциональный хук с эмодзи: эмоция, интрига или громкий факт ("Шавкат снова доказал!"), а НЕ сухой заголовок.
Дальше 2-4 предложения: суть, результат/статы, твоя оценка момента живым языком.
В КОНЦЕ — прогноз и вопрос к болельщикам ("Возьмёт ли Шавкат пояс? Пишите!").
Если новость НЕ про казахстанский спорт — найди казахстанский угол (сравнение, контекст для KZ) или подай как мировую новость, интересную болельщикам KZ.
АБСОЛЮТНЫЙ ЗАПРЕТ: никогда не пиши отказы, мета-комментарии, объяснения почему не можешь написать пост. Не пиши вступлений вроде "Понял задачу" и не давай несколько вариантов. Ты ВСЕГДА пишешь один готовый пост. Ты публичный канал — подписчики видят каждое сообщение.`,
hashtags: ['#спорт', '#казахстан', '#kzchampions']
}
};
// Расписание постинга (время Астана/Алматы UTC+5)
const schedule = {
morning: { hour: 8, minute: 15, type: 'digest' },
mid1: { hour: 10, minute: 30, type: 'content' },
lunch: { hour: 12, minute: 15, type: 'content' },
afternoon: { hour: 14, minute: 30, type: 'content' },
evening_ad: { hour: 16, minute: 0, type: 'content_or_ad' },
evening: { hour: 18, minute: 30, type: 'content_or_ad' },
night: { hour: 21, minute: 15, type: 'interactive' }
};
// Cron выражения в Алматы/Астана времени (UTC+5)
// node-cron timezone опция в bot.js делает конвертацию
const cronSchedule = {
morning: '15 8 * * *', // 08:15 Астана
mid1: '30 10 * * *', // 10:30 Астана
lunch: '15 12 * * *', // 12:15 Астана
afternoon: '30 14 * * *', // 14:30 Астана
evening_ad: '0 16 * * *', // 16:00 Астана
evening: '30 18 * * *', // 18:30 Астана
night: '15 21 * * *' // 21:15 Астана
};
const adConfig = {
// 1 рекламный пост на каждые N контентных
adFrequency: 6,
// Слоты для рекламы (индексы в расписании)
adSlots: ['evening_ad', 'evening'],
// Чередование: ad slot меняется каждый день
rotateDaily: true
};
const aiConfig = {
baseUrl: 'https://openrouter.ai/api/v1',
model: 'deepseek/deepseek-v4-pro',
maxTokens: 800,
temperature: 0.8
};
module.exports = { channels, schedule, cronSchedule, adConfig, aiConfig };
📜 Git History
28ca823feat: гибридный роутинг dengi-kz (финновости RSS + AI-идеи)3 weeks ago
08548e3feat: живые промпты каналов + ротация источников (B1+B2)3 weeks ago
ef1a257feat: расширить RSS-источники новостных каналов (Nur.kz, Total.kz)3 weeks ago
afebbfafeat: остановить канал typical-kz (enabled:false + cron guard)3 weeks ago
e76f7eefix: runtime-фильтр мета-отказов AI + усиление промптов7 weeks ago
cec0551fix: cron timezone — сервер UTC, крон был для PDT → 7ч сдвиг7 weeks ago
1d04825fix: промпты — запрет мета-комментариев + maxTokens 500→8007 weeks ago
19761cafix: dotenv override + deepseek v4 pro + save post titles7 weeks ago
2757087init: KZ Channels bot — 5 Telegram channels for Kazakhstan7 weeks ago