409 lines
21 KiB
Python
409 lines
21 KiB
Python
import random
|
||
import os
|
||
import json
|
||
import requests
|
||
from config import PIAPI_API_KEY, PIAPI_MODEL, get_proxies
|
||
|
||
PIAPI_URL = "https://api.piapi.ai/v1/chat/completions"
|
||
|
||
class ContentGenerator:
|
||
def __init__(self):
|
||
"""Инициализация генератора контента"""
|
||
print("🔄 Инициализация ContentGenerator...")
|
||
|
||
# Проверяем, есть ли ключ PiAPI
|
||
if PIAPI_API_KEY:
|
||
self.model = PIAPI_MODEL
|
||
self.use_piapi = True
|
||
print("✅ PiAPI подключен!")
|
||
else:
|
||
print("⚠️ PiAPI ключ не найден, использую шаблоны")
|
||
self.use_piapi = False
|
||
|
||
# Шаблоны для запасного варианта (если PiAPI не работает)
|
||
self.templates = {
|
||
'instagram': [
|
||
"🔥 {business_name} — это не просто бизнес, это миссия!\n\n"
|
||
"Рассказываю, как мы пришли к тому, что делаем сегодня.\n"
|
||
"В {years} лет мы прошли путь от идеи до реализации.\n\n"
|
||
"А вы знали, что {business_name} помогает {problem_solution}?\n\n"
|
||
"👉 Напиши в комментариях, сталкивался ли ты с этой проблемой!\n\n"
|
||
"#бизнес #предприниматель #{hashtag} #историяуспеха",
|
||
|
||
"📊 {business_name} — цифры, которые вдохновляют!\n\n"
|
||
"За {years} лет мы:\n"
|
||
"✅ Помогли {clients} клиентам\n"
|
||
"✅ Увеличили прибыль на {profit}%\n"
|
||
"✅ Выросли в {growth} раз\n\n"
|
||
"Хочешь так же? Пиши в DM! 💬\n\n"
|
||
"#бизнес #предпринимательство #{hashtag}"
|
||
],
|
||
|
||
'linkedin': [
|
||
"🚀 Как {business_name} изменил рынок в {years} году?\n\n"
|
||
"Когда мы начинали, казалось, что {problem} — это непреодолимая стена.\n"
|
||
"Но мы нашли решение: {solution}\n\n"
|
||
"Результат: {result} 📈\n\n"
|
||
"Какую бизнес-задачу вы решаете сегодня? Делитесь в комментариях! 💬\n\n"
|
||
"#бизнес #лидерство #{hashtag} #growth",
|
||
|
||
"💡 5 уроков за {years} лет в бизнесе\n\n"
|
||
"1️⃣ {lesson1}\n"
|
||
"2️⃣ {lesson2}\n"
|
||
"3️⃣ {lesson3}\n"
|
||
"4️⃣ {lesson4}\n"
|
||
"5️⃣ {lesson5}\n\n"
|
||
"Какой урок оказался для вас самым важным? 👇\n\n"
|
||
"#бизнес #урокипредпринимательства #{hashtag}"
|
||
],
|
||
|
||
'telegram': [
|
||
"💬 Привет, друзья! 👋\n\n"
|
||
"Сегодня хочу поделиться мыслями о {business_name}.\n\n"
|
||
"Многие спрашивают: «Как ты пришел к этому?»\n"
|
||
"Ответ прост: {short_story}\n\n"
|
||
"А какой бизнес вдохновляет тебя? Пиши в комментариях! 👇\n\n"
|
||
"#бизнес #предприниматель #{hashtag}",
|
||
|
||
"📌 Важный пост для предпринимателей!\n\n"
|
||
"В {business_name} мы верим, что {belief}\n\n"
|
||
"Поэтому сегодня делюсь {tip} советом:\n"
|
||
"{advice}\n\n"
|
||
"А какой совет ты бы дал себе в начале пути? 🔥\n\n"
|
||
"#бизнес #советы #{hashtag}"
|
||
],
|
||
|
||
'twitter': [
|
||
"🧵 Нить: Как {business_name} за {years} лет изменил подход к {industry}\n\n"
|
||
"1/ Мы начинали с {start_point}\n"
|
||
"2/ Главная проблема была: {problem}\n"
|
||
"3/ Решение нашли через {solution}\n"
|
||
"4/ Результат: {result}\n"
|
||
"5/ Вывод: {lesson}\n\n"
|
||
"Согласны? Репост, если цените бизнес-мышление! 🔄\n\n"
|
||
"#бизнес #{hashtag}",
|
||
|
||
"💭 Мысль дня от {business_name}:\n\n"
|
||
"{quote}\n\n"
|
||
"Как думаете, это правда? 👇\n\n"
|
||
"#бизнес #мысли #{hashtag}"
|
||
],
|
||
|
||
'ad': [
|
||
"🎯 Хочешь получить {benefit}?\n\n"
|
||
"В {business_name} мы знаем, как это сделать!\n\n"
|
||
"За {years} лет мы помогли {clients} клиентам достичь {result}\n\n"
|
||
"Напиши «ХОЧУ» в комментариях или DM, и я расскажу как! 💬\n\n"
|
||
"#реклама #бизнес #{hashtag}"
|
||
]
|
||
}
|
||
|
||
print("✅ ContentGenerator готов к работе!")
|
||
|
||
def generate_post(self, business_type, business_description, platform):
|
||
"""
|
||
Генерирует контент для соцсетей
|
||
|
||
Args:
|
||
business_type (str): Тип бизнеса
|
||
business_description (str): Описание бизнеса
|
||
platform (str): Платформа (instagram, linkedin, telegram, twitter, ad)
|
||
|
||
Returns:
|
||
str: Сгенерированный пост
|
||
"""
|
||
print(f"🔄 Генерация поста для {platform}...")
|
||
|
||
# Пробуем сгенерировать через PiAPI
|
||
if self.use_piapi:
|
||
try:
|
||
post = self._generate_with_piapi(business_type, business_description, platform)
|
||
if post and len(post) > 20:
|
||
print("✅ Пост сгенерирован через PiAPI!")
|
||
return post
|
||
except Exception as e:
|
||
print(f"⚠️ Ошибка PiAPI: {e}, использую шаблоны")
|
||
|
||
# Если PiAPI не работает - используем шаблоны
|
||
print("🔄 Использую шаблоны...")
|
||
return self._generate_with_templates(business_type, business_description, platform)
|
||
|
||
def _generate_with_piapi(self, business_type, business_description, platform):
|
||
"""Генерация через PiAPI (OpenAI-совместимый chat/completions)"""
|
||
|
||
platform_names = {
|
||
'instagram': 'Instagram',
|
||
'linkedin': 'LinkedIn',
|
||
'telegram': 'Telegram',
|
||
'twitter': 'Twitter/X',
|
||
'ad': 'рекламный пост'
|
||
}
|
||
|
||
prompt = f"""
|
||
Ты — профессиональный SMM-специалист и копирайтер.
|
||
|
||
Напиши интересный, живой пост для {platform_names.get(platform, 'соцсетей')} о бизнесе.
|
||
|
||
Тип бизнеса: {business_type}
|
||
Описание бизнеса: {business_description}
|
||
|
||
Требования к посту:
|
||
- Длина: 100-200 слов (но не больше 200 слов)
|
||
- Живой, разговорный стиль
|
||
- Полезный контент для предпринимателей
|
||
- Призыв к действию в конце
|
||
- Используй 2-3 эмодзи
|
||
|
||
Напиши только текст поста, без лишних пояснений.
|
||
Пост должен быть уникальным и интересным.
|
||
"""
|
||
|
||
response = requests.post(
|
||
PIAPI_URL,
|
||
headers={
|
||
"Content-Type": "application/json",
|
||
"Authorization": f"Bearer {PIAPI_API_KEY}"
|
||
},
|
||
json={
|
||
"model": self.model,
|
||
"messages": [
|
||
{"role": "system", "content": "Ты профессиональный копирайтер. Пиши ярко, полезно и вовлекающе."},
|
||
{"role": "user", "content": prompt}
|
||
],
|
||
"temperature": 0.9,
|
||
"max_tokens": 500
|
||
},
|
||
proxies=get_proxies(),
|
||
timeout=30
|
||
)
|
||
response.raise_for_status()
|
||
data = response.json()
|
||
|
||
return data["choices"][0]["message"]["content"].strip()
|
||
|
||
def generate_post_with_style(self, business_type, business_description, platform, style, wishes):
|
||
"""Генерирует пост с учётом стиля и пожеланий пользователя"""
|
||
print(f"🔄 Генерация поста в своём стиле для {platform}...")
|
||
|
||
if self.use_piapi:
|
||
try:
|
||
platform_names = {
|
||
'instagram': 'Instagram',
|
||
'linkedin': 'LinkedIn',
|
||
'telegram': 'Telegram',
|
||
'twitter': 'Twitter/X',
|
||
'ad': 'рекламный пост'
|
||
}
|
||
|
||
prompt = f"""
|
||
Ты — профессиональный SMM-специалист и копирайтер.
|
||
|
||
Напиши пост для {platform_names.get(platform, 'соцсетей')} о бизнесе.
|
||
|
||
Тип бизнеса: {business_type}
|
||
Описание бизнеса: {business_description}
|
||
Стиль поста: {style}
|
||
Пожелания к посту: {wishes}
|
||
|
||
Требования к посту:
|
||
- Длина: 100-200 слов
|
||
- Строго придерживайся указанного стиля и пожеланий
|
||
- Призыв к действию в конце
|
||
- Используй 2-3 эмодзи
|
||
|
||
Напиши только текст поста, без лишних пояснений.
|
||
"""
|
||
|
||
response = requests.post(
|
||
PIAPI_URL,
|
||
headers={
|
||
"Content-Type": "application/json",
|
||
"Authorization": f"Bearer {PIAPI_API_KEY}"
|
||
},
|
||
json={
|
||
"model": self.model,
|
||
"messages": [
|
||
{"role": "system", "content": "Ты профессиональный копирайтер. Точно следуешь стилю и пожеланиям клиента."},
|
||
{"role": "user", "content": prompt}
|
||
],
|
||
"temperature": 0.9,
|
||
"max_tokens": 500
|
||
},
|
||
proxies=get_proxies(),
|
||
timeout=30
|
||
)
|
||
response.raise_for_status()
|
||
post = response.json()["choices"][0]["message"]["content"].strip()
|
||
if post and len(post) > 20:
|
||
print("✅ Пост в стиле сгенерирован через PiAPI!")
|
||
return post
|
||
except Exception as e:
|
||
print(f"⚠️ Ошибка PiAPI: {e}, использую шаблоны")
|
||
|
||
print("🔄 Использую шаблоны...")
|
||
post = self._generate_with_templates(business_type, business_description, platform)
|
||
return f"{post}\n\n💭 Пожелания учтены частично (без ИИ): {wishes}"
|
||
|
||
def generate_content_plan(self, business_type, business_description, days):
|
||
"""Генерирует контент-план на несколько дней вперёд"""
|
||
print(f"🔄 Генерация контент-плана на {days} дн...")
|
||
|
||
if self.use_piapi:
|
||
try:
|
||
prompt = f"""
|
||
Ты — SMM-стратег. Составь контент-план на {days} дней для бизнеса.
|
||
|
||
Тип бизнеса: {business_type}
|
||
Описание бизнеса: {business_description}
|
||
|
||
Для каждого дня укажи платформу (instagram, linkedin, telegram, twitter или ad) и короткую идею поста (1 предложение).
|
||
|
||
Верни ТОЛЬКО валидный JSON без пояснений в формате:
|
||
{{"plan": [{{"day": 1, "platform": "instagram", "idea": "..."}}, ...]}}
|
||
"""
|
||
|
||
response = requests.post(
|
||
PIAPI_URL,
|
||
headers={
|
||
"Content-Type": "application/json",
|
||
"Authorization": f"Bearer {PIAPI_API_KEY}"
|
||
},
|
||
json={
|
||
"model": self.model,
|
||
"messages": [
|
||
{"role": "system", "content": "Ты отвечаешь только валидным JSON, без markdown и пояснений."},
|
||
{"role": "user", "content": prompt}
|
||
],
|
||
"temperature": 0.7,
|
||
"max_tokens": 1000,
|
||
"response_format": {"type": "json_object"}
|
||
},
|
||
proxies=get_proxies(),
|
||
timeout=30
|
||
)
|
||
response.raise_for_status()
|
||
content = response.json()["choices"][0]["message"]["content"].strip()
|
||
parsed = json.loads(content)
|
||
plan = parsed.get("plan")
|
||
if plan:
|
||
print("✅ Контент-план сгенерирован через PiAPI!")
|
||
return plan
|
||
except Exception as e:
|
||
print(f"⚠️ Ошибка PiAPI: {e}, использую шаблонный план")
|
||
|
||
print("🔄 Использую шаблонный план...")
|
||
return self._generate_template_plan(business_type, days)
|
||
|
||
def _generate_template_plan(self, business_type, days):
|
||
"""Простой контент-план без обращения к ИИ (запасной вариант)"""
|
||
platforms = ['instagram', 'linkedin', 'telegram', 'twitter', 'ad']
|
||
ideas = [
|
||
f"Расскажи историю успеха {business_type}",
|
||
f"Покажи закулисье работы {business_type}",
|
||
"Поделись отзывом клиента",
|
||
"Развенчай миф из твоей ниши",
|
||
"Дай практический совет подписчикам",
|
||
"Проведи опрос среди аудитории",
|
||
"Расскажи о новинке или акции"
|
||
]
|
||
plan = []
|
||
for day in range(1, days + 1):
|
||
plan.append({
|
||
'day': day,
|
||
'platform': platforms[(day - 1) % len(platforms)],
|
||
'idea': ideas[(day - 1) % len(ideas)]
|
||
})
|
||
return plan
|
||
|
||
def _generate_with_templates(self, business_type, business_description, platform):
|
||
"""Генерация через шаблоны (запасной вариант)"""
|
||
|
||
# Если платформы нет в шаблонах - используем instagram
|
||
if platform not in self.templates:
|
||
platform = 'instagram'
|
||
|
||
# Подготовка данных для шаблона
|
||
data = {
|
||
'business_name': business_type,
|
||
'industry': business_description[:30] if business_description else "твоей нише",
|
||
'years': random.randint(2, 15),
|
||
'clients': random.randint(50, 5000),
|
||
'profit': random.randint(20, 300),
|
||
'growth': random.randint(2, 10),
|
||
'problem': random.choice([
|
||
"не хватало знаний", "было сложно найти клиентов",
|
||
"конкуренты давили", "не было системы"
|
||
]),
|
||
'solution': random.choice([
|
||
"инновационный подход", "автоматизация процессов",
|
||
"клиентоориентированность", "стратегическое планирование"
|
||
]),
|
||
'result': random.choice([
|
||
"выручка выросла в 3 раза", "число клиентов удвоилось",
|
||
"бренд узнали в 5 городах", "создали команду из 30 человек"
|
||
]),
|
||
'problem_solution': random.choice([
|
||
"решает главную проблему предпринимателей",
|
||
"помогает бизнесу расти быстрее",
|
||
"упрощает сложные процессы",
|
||
"делает мир лучше"
|
||
]),
|
||
'lesson1': "Не бойся пробовать новое",
|
||
'lesson2': "Клиент всегда прав (почти всегда)",
|
||
'lesson3': "Команда — это всё",
|
||
'lesson4': "Без маркетинга никуда",
|
||
'lesson5': "Верь в своё дело",
|
||
'short_story': random.choice([
|
||
"я просто начал и не остановился",
|
||
"увидел проблему и решил её",
|
||
"поверил в идею, несмотря на сомнения",
|
||
"просто делал то, что люблю"
|
||
]),
|
||
'belief': random.choice([
|
||
"успех приходит к тем, кто не боится ошибаться",
|
||
"лучший способ предсказать будущее — создать его",
|
||
"качество всегда побеждает количество"
|
||
]),
|
||
'tip': random.choice(["простой", "важный", "ключевой"]),
|
||
'advice': random.choice([
|
||
"не распыляйся на всё подряд — фокусируйся на главном",
|
||
"слушай своих клиентов — они лучшие советчики",
|
||
"инвестируй в своё развитие — это окупается",
|
||
"не бойся делегировать задачи"
|
||
]),
|
||
'start_point': random.choice([
|
||
"идеи и ноутбука", "небольшого стартапа",
|
||
"мечты и энтузиазма", "первых 5 клиентов"
|
||
]),
|
||
'quote': random.choice([
|
||
"Бизнес — это не про деньги, а про ценность, которую ты создаёшь",
|
||
"Каждый отказ приближает тебя к успеху",
|
||
"Лучший момент начать — прямо сейчас",
|
||
"Сложно — значит ты на правильном пути"
|
||
]),
|
||
'benefit': random.choice([
|
||
"прибыль без головной боли",
|
||
"стабильный доход",
|
||
"финансовую свободу",
|
||
"масштабирование бизнеса"
|
||
]),
|
||
'hashtag': random.choice([
|
||
"бизнесрост", "предприниматель", "успех",
|
||
"бизнесидеи", "мойбизнес", "развитие"
|
||
])
|
||
}
|
||
|
||
# Выбираем случайный шаблон для платформы
|
||
template = random.choice(self.templates[platform])
|
||
|
||
# Заполняем шаблон данными
|
||
try:
|
||
post = template.format(**data)
|
||
except KeyError as e:
|
||
# Если какие-то ключи отсутствуют
|
||
post = f"📝 Пост для {platform.upper()}\n\n" \
|
||
f"Бизнес: {business_type}\n" \
|
||
f"Описание: {business_description or 'Не указано'}\n\n" \
|
||
f"Расскажи о своём бизнесе в комментариях! 👇\n\n#бизнес #предприниматель"
|
||
|
||
return post |