run.py (Основной скрипт)
1 import os 2 import json 3 import time 4 import requests 5 from dotenv import load_dotenv 6 from google import genai 7 from google.genai import types 8 9 # Загрузка настроек 10 load_dotenv() 11 12 GEMINI_KEY = os.getenv("GEMINI_API_KEY") 13 TG_TOKEN = os.getenv("TG_BOT_TOKEN") 14 TG_CHAT_ID = os.getenv("TG_CHAT_ID") 15 16 TOPICS_FILE = "topics.txt" 17 DONE_FILE = "done.txt" 18 IMAGE_PATH = "temp_image.png" 19 20 def log(msg): 21 print(f"[{time.strftime('%H:%M:%S')}] {msg}") 22 23 def get_topic(): 24 """Берет первую тему из файла и удаляет её оттуда""" 25 if not os.path.exists(TOPICS_FILE): return None 26 with open(TOPICS_FILE, "r", encoding="utf-8") as f: 27 lines = f.readlines() 28 if not lines: return None 29 30 topic = lines[0].strip() 31 with open(TOPICS_FILE, "w", encoding="utf-8") as f: 32 f.writelines(lines[1:]) 33 return topic 34 35 def generate_post(topic): 36 """Генерация текста и промпта для картинки через Gemini""" 37 client = genai.Client(api_key=GEMINI_KEY) 38 prompt = f"Напиши пост для Telegram на тему: '{topic}'. Верни JSON: {{'title': '..', 'body': '..', 'img_prompt': 'en prompt'}}" 39 40 try: 41 response = client.models.generate_content( 42 model="gemini-2.0-flash", 43 contents=prompt, 44 config=types.GenerateContentConfig(response_mime_type="application/json") 45 ) 46 return json.loads(response.text) 47 except Exception as e: 48 log(f"Ошибка текста: {e}") 49 return None 50 51 def generate_image(prompt): 52 """Генерация картинки через Imagen 3 (Nano Banana)""" 53 client = genai.Client(api_key=GEMINI_KEY) 54 try: 55 response = client.models.generate_content( 56 model="imagen-3.0-generate-002", 57 contents=prompt, 58 config=types.GenerateContentConfig(response_modalities=["IMAGE"]) 59 ) 60 for part in response.candidates[0].content.parts: 61 if part.inline_data: 62 with open(IMAGE_PATH, "wb") as f: 63 f.write(part.inline_data.data) 64 return True 65 except Exception as e: 66 log(f"Ошибка картинки: {e}") 67 return False 68 69 def send_to_tg(title, body): 70 """Отправка в Telegram через Bot API""" 71 text = f"<b>{title}</b>\n\n{body}" 72 url = f"https://api.telegram.org/bot{TG_TOKEN}/sendPhoto" 73 74 try: 75 if os.path.exists(IMAGE_PATH): 76 with open(IMAGE_PATH, "rb") as img: 77 requests.post(url, data={"chat_id": TG_CHAT_ID, "caption": text, "parse_mode": "HTML"}, files={"photo": img}) 78 os.remove(IMAGE_PATH) 79 else: 80 requests.post(url.replace("sendPhoto", "sendMessage"), data={"chat_id": TG_CHAT_ID, "text": text, "parse_mode": "HTML"}) 81 return True 82 except Exception as e: 83 log(f"Ошибка отправки: {e}") 84 return False 85 86 def main(): 87 topic = get_topic() 88 if not topic: 89 log("Список тем пуст.") 90 return 91 92 data = generate_post(topic) 93 if data: 94 generate_image(data.get("img_prompt")) 95 if send_to_tg(data.get("title"), data.get("body")): 96 with open(DONE_FILE, "a", encoding="utf-8") as f: 97 f.write(f"{topic}\n") 98 log(f"Готово: {topic}") 99 100 if name == "main": 101 main()
1 GEMINI_API_KEY=your_google_ai_studio_key 2 TG_BOT_TOKEN=your_bot_father_token 3 TG_CHAT_ID=your_channel_id_or_chat_id