Initial commit
This commit is contained in:
parent
7c9ff0a69b
commit
cd9bbcec2d
|
|
@ -354,5 +354,41 @@
|
||||||
{
|
{
|
||||||
"id": 89,
|
"id": 89,
|
||||||
"89": "рисует члены под окнами"
|
"89": "рисует члены под окнами"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 90,
|
||||||
|
"90": "серый анус"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 91,
|
||||||
|
"91": "මගුලයි, තොපිට කෙලවෙලා"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 92,
|
||||||
|
"92": "любит 卍卍卍"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 93,
|
||||||
|
"93": "хуесос придорасович"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 94,
|
||||||
|
"94": "и директриса ебаные пидоры"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 95,
|
||||||
|
"95": "выпрыгнул в окно"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 96,
|
||||||
|
"96": "а как?"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 97,
|
||||||
|
"97": "ХАХАХА ТЫ ГДЕ ЭТО РАЗДОБЫЛ"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 98,
|
||||||
|
"98": "В Советском Союзе делали всё тихо, не спеша, не дыша, не шиша. Четыре карандаша, не пержа, не жужжа, не гроша, черемша, не тужа, лёжа, дрожа, черемша. Вороша без ковша, со второго этажа, без гаража, без экипажа, без лишнего багажа, без массажа, без монтажа, без камуфляжа, черемша. Для антуража. Без знания падежа, без мятежа. В три ножа, два коржа, черемша. Без репортажа, без стажа. С лицом вождя, с душой моржа. С повадкой ежа, с запахом ржа. тихо, не спеша, без суеты, почти неслышно, с лёгкой улыбкой с тёплым сердцем медленно, но верно спокойно, без лишних слов с внутренним светом чуть задумчиво, но ясно с мягкой уверенностью бережно, как будто впервые с тихой радостью неспешно, наслаждаясь моментом с добрым ожиданием мягко, словно ветер светло, как утро вдумчиво, без суеты с теплом в глазах неторопливо, но глубоко с лёгкой надеждой тихо, но наполненно с уверенностью в хорошем спокойно, принимая всё с мягкой верой в лучшее чуть мечтательно с тихим счастьем внутренне спокойно с ощущением уюта с нежной благодарностью медленно, смакуя жизнь с тёплой тишиной внутриделали это тихо, почти неслышно не спеша, с лёгкой улыбкой с тёплым сердцем медленно, но верно спокойно, без лишних слов с внутренним светом чуть задумчиво, но ясно с мягкой уверенностью бережно, как будто впервые с тихой радостью неспешно, наслаждаясь моментом с добрым ожиданием мягко, словно ветер светло, как утро вдумчиво, без суеты с теплом в глазах неторопливо, но глубоко с лёгкой надеждой тихо, но наполненно с уверенностью в хорошем спокойно, принимая всё с мягкой верой в лучшее чуть мечтательно с тихим счастьем внутренне спокойно с ощущением уюта с нежной благодарностью медленно, смакуя жизнь с тёплой тишиной внутриделали это тихо, почти неслышно не спеша, с лёгкой улыбкой с тёплым сердцем медленно, но верно спокойно, без лишних слов с внутренним светом чуть задумчиво, но ясно с мягкой уверенностью бережно, как будто впервые с тихой радостью неспешно, наслаждаясь моментом с добрым ожиданием мягко, словно ветер светло, как утро вдумчиво, без суеты с теплом в глазах неторопливо, но глубоко с лёгкой надеждой тихо, но наполненно с уверенностью в хорошем спокойно, принимая всё с мягко"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
103
code/sergay.py
103
code/sergay.py
|
|
@ -2,6 +2,8 @@ import json
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import urllib.request
|
||||||
|
import requests
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
|
|
@ -19,7 +21,12 @@ PREFIX_WORD = "серГЕЙ"
|
||||||
JSON_FILE = "sergay.json"
|
JSON_FILE = "sergay.json"
|
||||||
SERVICE_NAME = "sergay-bot"
|
SERVICE_NAME = "sergay-bot"
|
||||||
|
|
||||||
|
# Токен для связи с сайтом (тот, что мы прописывали в api.php)
|
||||||
|
SITE_API_TOKEN = "super_secret_bot_token_123"
|
||||||
|
|
||||||
WAITING_NEW_PHRASE = 1
|
WAITING_NEW_PHRASE = 1
|
||||||
|
P_TITLE = 2
|
||||||
|
P_PHOTOS = 3
|
||||||
|
|
||||||
|
|
||||||
def load_phrases(file_path: str) -> list[str]:
|
def load_phrases(file_path: str) -> list[str]:
|
||||||
|
|
@ -128,6 +135,7 @@ async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||||
"Вот список команд:\n\n"
|
"Вот список команд:\n\n"
|
||||||
"Получить фразу — /phrase\n"
|
"Получить фразу — /phrase\n"
|
||||||
"Добавить фразу — /new\n"
|
"Добавить фразу — /new\n"
|
||||||
|
"Добавить картинки на сайт — /new_p\n"
|
||||||
)
|
)
|
||||||
await update.message.reply_text(text)
|
await update.message.reply_text(text)
|
||||||
|
|
||||||
|
|
@ -143,6 +151,24 @@ async def phrase(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
text = f"Ошибка: {e}"
|
text = f"Ошибка: {e}"
|
||||||
|
|
||||||
|
# Шанс 30% прикрепить картинку
|
||||||
|
if random.random() < 0.3 and not text.startswith("Ошибка"):
|
||||||
|
try:
|
||||||
|
req = urllib.request.Request("https://www.vlv-s.site/api.php?action=random")
|
||||||
|
with urllib.request.urlopen(req, timeout=5) as response:
|
||||||
|
api_data = json.loads(response.read().decode('utf-8'))
|
||||||
|
img_url = api_data.get("url")
|
||||||
|
|
||||||
|
if img_url:
|
||||||
|
await context.bot.send_photo(
|
||||||
|
chat_id=update.effective_chat.id,
|
||||||
|
photo=img_url,
|
||||||
|
caption=text
|
||||||
|
)
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Ошибка загрузки фото из API: {e}")
|
||||||
|
|
||||||
await update.message.reply_text(text)
|
await update.message.reply_text(text)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -173,6 +199,68 @@ async def new_cancel(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
|
||||||
return ConversationHandler.END
|
return ConversationHandler.END
|
||||||
|
|
||||||
|
|
||||||
|
# --- ЛОГИКА ДЛЯ /new_p (Загрузка картинок) ---
|
||||||
|
async def new_p_start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
|
||||||
|
context.user_data['new_p_photos'] = []
|
||||||
|
await update.message.reply_text("Введите заголовок для новых картинок (он применится ко всем загружаемым сейчас фото):")
|
||||||
|
return P_TITLE
|
||||||
|
|
||||||
|
async def new_p_title(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
|
||||||
|
context.user_data['new_p_title'] = update.message.text.strip()
|
||||||
|
await update.message.reply_text(
|
||||||
|
"Принято! Теперь отправляй мне картинки.\n"
|
||||||
|
"Можешь отправить одну или выделить сразу несколько в галерее.\n\n"
|
||||||
|
"Когда все нужные картинки загрузятся, отправь команду /done"
|
||||||
|
)
|
||||||
|
return P_PHOTOS
|
||||||
|
|
||||||
|
async def new_p_photo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
|
||||||
|
if update.message.photo:
|
||||||
|
# Сохраняем ID самого большого размера картинки
|
||||||
|
photo_id = update.message.photo[-1].file_id
|
||||||
|
context.user_data['new_p_photos'].append(photo_id)
|
||||||
|
return P_PHOTOS
|
||||||
|
|
||||||
|
async def new_p_done(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
|
||||||
|
photos = context.user_data.get('new_p_photos', [])
|
||||||
|
title = context.user_data.get('new_p_title', 'Новое фото')
|
||||||
|
|
||||||
|
if not photos:
|
||||||
|
await update.message.reply_text("Ты не отправил ни одной картинки. Операция отменена.")
|
||||||
|
return ConversationHandler.END
|
||||||
|
|
||||||
|
await update.message.reply_text(f"⏳ Скачиваю и отправляю {len(photos)} фото на сервер. Это может занять пару минут...")
|
||||||
|
|
||||||
|
try:
|
||||||
|
files_payload = []
|
||||||
|
for i, pid in enumerate(photos):
|
||||||
|
new_file = await context.bot.get_file(pid)
|
||||||
|
p_bytes = await new_file.download_as_bytearray()
|
||||||
|
# Формируем пакет файлов так же, как отправляет браузер (массив photos[])
|
||||||
|
files_payload.append(('photos[]', (f'img_tg_{i}.jpg', p_bytes, 'image/jpeg')))
|
||||||
|
|
||||||
|
data_payload = {
|
||||||
|
'title': title,
|
||||||
|
'description': '',
|
||||||
|
'api_token': SITE_API_TOKEN
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = requests.post("https://www.vlv-s.site/api.php?action=upload", files=files_payload, data=data_payload)
|
||||||
|
resp_json = resp.json()
|
||||||
|
|
||||||
|
if resp_json.get('success'):
|
||||||
|
await update.message.reply_text("✅ Успех! Картинки добавлены в галерею на сайт.")
|
||||||
|
else:
|
||||||
|
await update.message.reply_text(f"❌ Сайт вернул ошибку: {resp_json}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
await update.message.reply_text(f"❌ Ошибка соединения или загрузки: {e}")
|
||||||
|
|
||||||
|
# Очищаем данные
|
||||||
|
context.user_data.clear()
|
||||||
|
return ConversationHandler.END
|
||||||
|
|
||||||
|
|
||||||
async def gitup(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
async def gitup(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||||
await update.message.reply_text("Запускаю gitup...")
|
await update.message.reply_text("Запускаю gitup...")
|
||||||
|
|
||||||
|
|
@ -206,10 +294,25 @@ def main() -> None:
|
||||||
fallbacks=[CommandHandler("cancel", new_cancel)],
|
fallbacks=[CommandHandler("cancel", new_cancel)],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
new_p_handler = ConversationHandler(
|
||||||
|
entry_points=[CommandHandler("new_p", new_p_start)],
|
||||||
|
states={
|
||||||
|
P_TITLE: [
|
||||||
|
MessageHandler(filters.TEXT & ~filters.COMMAND, new_p_title)
|
||||||
|
],
|
||||||
|
P_PHOTOS: [
|
||||||
|
MessageHandler(filters.PHOTO, new_p_photo),
|
||||||
|
CommandHandler("done", new_p_done)
|
||||||
|
]
|
||||||
|
},
|
||||||
|
fallbacks=[CommandHandler("cancel", new_cancel)],
|
||||||
|
)
|
||||||
|
|
||||||
app.add_handler(CommandHandler("start", start))
|
app.add_handler(CommandHandler("start", start))
|
||||||
app.add_handler(CommandHandler("phrase", phrase))
|
app.add_handler(CommandHandler("phrase", phrase))
|
||||||
app.add_handler(CommandHandler("gitup", gitup))
|
app.add_handler(CommandHandler("gitup", gitup))
|
||||||
app.add_handler(new_handler)
|
app.add_handler(new_handler)
|
||||||
|
app.add_handler(new_p_handler)
|
||||||
|
|
||||||
app.run_polling()
|
app.run_polling()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue