Сложно справиться с этим в одиночку?
На первичной 20-минутной ознакомительной встрече мы бережно разберем вашу ситуацию.
Записаться на консультацию'Full Engine Online']); exit; } // ---------------------------------------------------- // Вспомогательные функции // ---------------------------------------------------- function tgReq($method, $data) { global $BOT_TOKEN; $url = "https://api.telegram.org/bot{$BOT_TOKEN}/{$method}"; $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode($data), CURLOPT_TIMEOUT => 25 ]); $raw = curl_exec($ch); curl_close($ch); $res = json_decode($raw, true); if (isset($res['ok']) && $res['ok'] === false && isset($data['parse_mode'])) { unset($data['parse_mode']); $ch2 = curl_init($url); curl_setopt_array($ch2, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode($data), CURLOPT_TIMEOUT => 25 ]); $res = json_decode(curl_exec($ch2), true); curl_close($ch2); } return $res; } function slugify($text) { $text = mb_strtolower($text, 'UTF-8'); $translit = [ 'а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'yo','ж'=>'zh', 'з'=>'z','и'=>'i','й'=>'y','к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o', 'п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'kh','ц'=>'ts', 'ч'=>'ch','ш'=>'sh','щ'=>'shch','ъ'=>'','ы'=>'y','ь'=>'','э'=>'e','ю'=>'yu','я'=>'ya', ' '=>'-','_'=>'-' ]; $text = strtr($text, $translit); $text = preg_replace('/[^a-z0-9\-]/', '', $text); return trim(preg_replace('/-+/', '-', $text), '-'); } function getRussianDate() { $months = [ 1=>'января', 2=>'февраля', 3=>'марта', 4=>'апреля', 5=>'мая', 6=>'июня', 7=>'июля', 8=>'августа', 9=>'сентября', 10=>'октября', 11=>'ноября', 12=>'декабря' ]; return date('j') . ' ' . $months[(int)date('n')] . ' ' . date('Y'); } function getFallbackImage($cat, $title = '') { $t = mb_strtolower($cat . ' ' . $title, 'UTF-8'); if (preg_match('/(тревог|страх|паник|фоби|перфекцион)/u', $t)) return '../images/article-perfektsionizm-preview.webp'; if (preg_match('/(выгоран|перегор|устал|прокраст|сил)/u', $t)) return '../images/18.webp'; if (preg_match('/(самооценк|самозван|неуверен|стыд|ошиб)/u', $t)) return '../images/62.webp'; if (preg_match('/(деньг|финанс|доход|бедн|богат)/u', $t)) return '../images/71.webp'; if (preg_match('/(отношен|партнер|брак|любв|развод|расстав|семь)/u', $t)) return '../images/78.webp'; if (preg_match('/(emdr|дпдг|травм)/u', $t)) return '../images/article-emdr-preview.webp'; if (preg_match('/(стресс|напряжен|релакс|телесн|зажим)/u', $t)) return '../images/93.webp'; if (preg_match('/(кпт|терапи)/u', $t)) return '../images/article-kpt-preview.webp'; return '../images/reshenie-33.webp'; } // Подбор 3 рекомендуемых статей для блока "Читайте также" function getRelatedArticlesHtml($currentSlug) { $pool = [ ['url' => 'kpt-terapiya-chto-eto.html', 'title' => 'КПТ-терапия: что это такое и как она работает'], ['url' => 'simptomy-trevozhnogo-rasstroystva.html', 'title' => 'Симптомы тревожного расстройства — как распознать'], ['url' => 'kak-prinyat-reshenie.html', 'title' => 'Как принять важное решение, если боишься ошибиться'], ['url' => 'perfektsionizm-i-trevoga.html', 'title' => 'Перфекционизм и тревога: почему «хорошо» никогда не достаточно'], ['url' => 'deneshnye-scenarii-detstva.html', 'title' => 'Денежные сценарии детства: откуда берётся страх бедности'], ['url' => 'sindrom-samozvantsa.html', 'title' => 'Синдром самозванца: почему успешные люди боятся разоблачения'], ['url' => 'dpdg-emdr-chto-eto.html', 'title' => 'ДПДГ (EMDR): что это такое и как работает'], ['url' => 'finansovye-konflikty-v-pare.html', 'title' => 'Финансовые конфликты в паре: кто платит и почему это не про деньги'], ['url' => 'kak-spravitsya-s-panicheskimi-atakami.html', 'title' => 'Как справиться с паническими атаками: техники самопомощи'] ]; $filtered = array_filter($pool, function($item) use ($currentSlug) { return strpos($item['url'], $currentSlug) === false; }); shuffle($filtered); $selected = array_slice($filtered, 0, 3); $html = '
'; return $html; } // ========================================================== // 1. ОБРАБОТКА ИНЛАЙН-КНОПОК (CALLBACK QUERY) // ========================================================== if (isset($update['callback_query'])) { $cb = $update['callback_query']; $chat_id = (string)$cb['from']['id']; $data = $cb['data']; if (!in_array($chat_id, $ALLOWED_USERS)) exit; // --- КНОПКА: НАРИСОВАТЬ СЮРРЕАЛИСТИЧЕСКУЮ ОБЛОЖКУ --- if (strpos($data, 'img_') === 0) { $id = substr($data, 4); $drafts = file_exists($DRAFTS_FILE) ? json_decode(file_get_contents($DRAFTS_FILE), true) : []; if (!isset($drafts[$id])) { tgReq('answerCallbackQuery', ['callback_query_id' => $cb['id'], 'text' => 'Черновик устарел']); exit; } tgReq('answerCallbackQuery', ['callback_query_id' => $cb['id'], 'text' => 'Создаю образ с человеком...']); tgReq('sendMessage', [ 'chat_id' => $chat_id, 'text' => "🎨 Нейросеть генерирует эмоциональную обложку...\nВ центре кадра: человек и его эмоциональное состояние.\n\n⏳ Подождите около 15–20 секунд.", 'parse_mode' => 'HTML' ]); @ignore_user_abort(true); @set_time_limit(90); $imgPrompt = "Cinematic fine-art photography with deep emotional storytelling and subtle psychological surrealism. Subject: a realistic person expressing a profound, relatable human emotion reflecting the theme '" . $drafts[$id]['title'] . "' (emotional relief, contemplation, exhaustion, vulnerability, or quiet inner strength). The person's posture and facial expression convey authentic psychological depth. Gentle dreamlike poetic elements in the atmosphere in the style of Rene Magritte. Color palette: extremely calm, muted warm sand, soft beige, ivory, gentle sage green, soft warm natural morning light. Masterpiece, 8k, photorealistic textures. Strictly NO horror, NO gore, NO blood, NO broken or distorted bodies, strictly NO TEXT, NO LETTERS, NO WORDS."; $chImg = curl_init('https://api.proxyapi.ru/v1/images/generations'); curl_setopt_array($chImg, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Authorization: Bearer ' . $PROXY_API_KEY ], CURLOPT_POSTFIELDS => json_encode([ 'model' => 'openai/gpt-image-1-mini', 'prompt' => $imgPrompt, 'size' => '1024x1024' ]), CURLOPT_TIMEOUT => 40 ]); $imgRaw = curl_exec($chImg); $curlErr = curl_error($chImg); $httpCode = curl_getinfo($chImg, CURLINFO_HTTP_CODE); curl_close($chImg); $imgRes = json_decode($imgRaw, true); $b64 = $imgRes['data'][0]['b64_json'] ?? null; $imgData = null; if ($b64) { $imgData = base64_decode($b64); } elseif (!empty($imgRes['data'][0]['url'])) { $imgData = @file_get_contents($imgRes['data'][0]['url']); } if ($imgData) { $imgName = 'art-' . time() . '.png'; file_put_contents($IMAGES_DIR . $imgName, $imgData); $drafts[$id]['image'] = '../images/' . $imgName; file_put_contents($DRAFTS_FILE, json_encode($drafts, JSON_UNESCAPED_UNICODE)); tgReq('sendMessage', [ 'chat_id' => $chat_id, 'text' => "✅ Уникальная обложка сгенерирована и сохранена на сайте!\n\nТеперь вы можете отредактировать текст или опубликовать статью:", 'parse_mode' => 'HTML', 'reply_markup' => ['inline_keyboard' => [ [['text' => '✏️ Редактировать текст', 'url' => "https://pozitiv-psychology.ru/api/editor.php?id={$id}"]], [['text' => '🚀 Опубликовать на сайте', 'callback_data' => 'pub_' . $id]] ]] ]); } else { $detail = $imgRes['error']['message'] ?? $curlErr ?? "HTTP {$httpCode}: " . mb_substr($imgRaw, 0, 100); tgReq('sendMessage', ['chat_id' => $chat_id, 'text' => "❌ Ошибка генерации: " . htmlspecialchars($detail)]); } exit; } // --- КНОПКА: ОПУБЛИКОВАТЬ НА САЙТЕ --- if (strpos($data, 'pub_') === 0) { $id = substr($data, 4); $drafts = file_exists($DRAFTS_FILE) ? json_decode(file_get_contents($DRAFTS_FILE), true) : []; if (isset($drafts[$id])) { $article = $drafts[$id]; $slug = slugify($article['title']) . '-' . substr($id, -4); $fileName = $slug . '.html'; $fullPath = $STORAGE_DIR . $fileName; // Привязываем slug к короткому цифровому ID черновика для надежного удаления $drafts[$id]['slug'] = $slug; file_put_contents($DRAFTS_FILE, json_encode($drafts, JSON_UNESCAPED_UNICODE)); // ДЕКОДИРОВАНИЕ СУЩНОСТЕЙ (устраняет — -> —) $decodedBody = html_entity_decode($article['html_content'], ENT_QUOTES | ENT_HTML5, 'UTF-8'); $cleanTitle = html_entity_decode($article['title'], ENT_QUOTES | ENT_HTML5, 'UTF-8'); $category = !empty($article['category']) ? html_entity_decode($article['category'], ENT_QUOTES | ENT_HTML5, 'UTF-8') : 'Психология'; // Чистый лид $cleanLead = !empty($article['lead']) ? htmlspecialchars(html_entity_decode($article['lead'], ENT_QUOTES | ENT_HTML5, 'UTF-8'), ENT_QUOTES, 'UTF-8') : 'Практическое руководство по преодолению психологических трудностей и техникам доказательной самопомощи.'; $articleImage = !empty($article['image']) ? $article['image'] : getFallbackImage($category, $cleanTitle); $currentDate = getRussianDate(); $readTime = max(8, min(14, ceil(mb_strlen($decodedBody) / 550))) . ' мин чтения'; // Адрес страницы для шеринга $pageUrl = "https://pozitiv-psychology.ru/articles/" . $fileName; // Блок "Читайте также" на 3 статьи $relatedHtml = getRelatedArticlesHtml($slug); $html = '' . $cleanLead . '
На первичной 20-минутной ознакомительной встрече мы бережно разберем вашу ситуацию.
Записаться на консультацию" . $cleanLead . "
\n" . " \n" . "{$slugToDelete}",
'parse_mode' => 'HTML'
]);
}
exit;
}
// ==========================================================
// 2. ОБРАБОТКА ТЕМЫ (ЗОЛОТОЙ БАЛАНС ОБЪЕМА 5000-6000 ЗНАКОВ)
// ==========================================================
if (isset($update['message']['text'])) {
$msg = $update['message'];
$chat_id = (string)$msg['chat']['id'];
$text = trim($msg['text']);
if (!in_array($chat_id, $ALLOWED_USERS)) exit;
if ($text === '/start') {
tgReq('sendMessage', [
'chat_id' => $chat_id,
'text' => "Здравствуйте, Камила! 🌿\n\nЯ ваш персональный редактор лонгридов.\n\nОтправьте мне любую тему статьи, и я подготовлю фундаментальный экспертный материал (5 000 – 6 000 знаков, 9–11 минут чтения) в вашем авторском стиле B17.",
'parse_mode' => 'HTML'
]);
exit;
}
tgReq('sendMessage', [
'chat_id' => $chat_id,
'text' => "✨ Принято!\nПишу глубокий лонгрид (пропорция 70/30, доказательный стиль КПТ)...\n\nГенерация займет около 18–22 секунд, пожалуйста, подождите.",
'parse_mode' => 'HTML'
]);
// АКАДЕМИЧЕСКИЙ ПРОМПТ С РАЗДЕЛЬНЫМ ЛИДОМ И СТАТЬЕЙ БЕЗ ПОВТОРОВ
$sysPrompt = "Ты — Камила Золотова, практикующий психолог, магистр психологии, сертифицированный КПТ и EMDR специалист, член Ассоциации когнитивно-поведенческой психотерапии (АКПП).
Напиши обстоятельный, глубокий экспертный лонгрид на тему пользователя.
ТРЕБОВАНИЯ К ОБЪЕМУ И СТРУКТУРЕ (СТРОГО):
1. ОБЪЕМ: полноценный лонгрид ровно на 5 000 – 6 000 знаков (время чтения 9–11 минут). Исследуй тему глубоко, подробно раскрывай механизмы, но без водянистых повторов.
2. БАЛАНС 70 НА 30:
- 70% статьи — это связный, глубокий авторский текст обычными абзацами . Каждая мысль подробно аргументируется с позиции доказательной психотерапии. - Не более 30% — визуальные врезки. Между любыми блоками ОБЯЗАТЕЛЬНО должно быть 2–3 развернутых текстовых абзаца! 3. ТОНАЛЬНОСТЬ B17: зрелый, клинический, доказательный стиль члена АКПП, но бережный и человечный. Зачин через историю из практики в кабинете («В моём кабинете...»), подробное исследование механизмов и когнитивных ловушек. 4. КАТЕГОРИЧЕСКИЙ ЗАПРЕТ НА ДЕШЕВЫЕ МЕТАФОРЫ: никаких выражений вроде «натирая душу», «израненное сердце», «доспехи сильной женщины». Психолог АКПП объясняет суть через триггеры, когнитивные искажения, цикл избегания, эмоциональную регуляцию. ДИЗАЙН-АРСЕНАЛ (ПРАВИЛО ВАРИАТИВНОСТИ): Выбирай только 2-3 органичных инструмента под конкретную тему: -
Клинический вывод
Суть техники
[Краткое описание БЕЗ повторения цифры!]
, заголовками