telegram bot

This commit is contained in:
Kirchik
2025-08-02 22:39:11 +02:00
parent 255fff75e2
commit d5ce15c3b6
29 changed files with 1497 additions and 219 deletions
+162
View File
@@ -0,0 +1,162 @@
# Telegram Bot для создания постов и планирования путешествий
## Функции бота
### 📝 Создание постов
- Создание заголовка и основного текста поста
- Загрузка фото в лучшем качестве или для быстрой загрузки в `public/images/`
- Добавление видео
- Интеграция YouTube видео через Hugo shortcodes
- Локации с Яндекс.Карт
- Автоматическое создание Hugo markdown файлов в `content/post/`
- Генерация правильного front matter для Hugo
### 🌍 Календарь поездок
- Создание названия и описания поездки
- Добавление фото к поездкам
- Автоматическое обновление файла `content/plan.md`
### 📅 Управление календарём поездок
- Добавление месячных поездок (системные ежемесячные варианты)
- Добавление специальных поездок (праздничные и особенные события)
- Удаление существующих поездок из списка
- Просмотр всех доступных вариантов поездок
- Автоматическое обновление выпадающего списка в форме на сайте
### 🔄 Git интеграция
- Автоматический commit всех изменений после создания поста
- Автоматический commit при обновлении календаря поездок
- Автоматический push в репозиторий Gitea/GitHub
- Осмысленные commit сообщения с указанием источника (Telegram бот)
## Установка и запуск
1. **Установите зависимости:**
```bash
pip3 install -r requirements.txt
```
2. **Настройте токен бота:**
```bash
export TELEGRAM_BOT_TOKEN="ваш_токен_здесь"
```
Или создайте файл `.env`:
```
TELEGRAM_BOT_TOKEN=ваш_токен_здесь
```
3. **Запустите бота:**
```bash
./start_bot.sh
```
Или напрямую:
```bash
python3 telegram_bot.py
```
## Использование
1. Запустите бота командой `/start`
2. Выберите действие из главного меню:
- **📝 Создать пост** - для создания новых постов
- **🌍 Хочу поехать** - для добавления записей в календарь поездок
- **📅 Управление календарём** - для управления вариантами поездок в форме
### Создание поста
1. Введите заголовок поста
2. Введите основной текст поста
3. Используйте кнопки для добавления:
- 📸 Фото (с выбором качества)
- 🎥 Видео
- 🔗 YouTube ссылки
- 📍 Локации с Яндекс.Карт
4. Нажмите "✅ Опубликовать пост"
5. Бот автоматически создаст Hugo markdown файл и сделает Git commit
### Календарь поездок
1. Введите название поездки
2. Опишите детали поездки
3. При желании добавьте фото
4. Сохраните запись
5. Бот автоматически обновит `plan.md` и сделает Git commit
### Управление календарём поездок
1. **Добавить месячную поездку:**
- Выберите "➕ Добавить месячную поездку"
- Введите название в формате "Полёты в [месяц] [год] года"
- Новая опция автоматически добавится в форму на сайте
2. **Добавить специальную поездку:**
- Выберите "✨ Добавить специальную поездку"
- Введите название события (например: "Новогодние каникулы в горах")
- Опция будет добавлена в выпадающий список
3. **Удалить поездку:**
- Выберите "❌ Удалить поездку"
- Выберите поездку из списка для удаления
- Опция будет удалена из формы на сайте
4. **Просмотреть список:**
- Выберите "📋 Просмотреть список"
- Увидите все текущие варианты поездок
## Интеграция с Hugo и Git
### Структура файлов
- `content/post/` - markdown файлы постов
- `public/images/` - загруженные изображения и видео
- `content/plan.md` - файл календаря поездок
### Создаваемые файлы
#### Hugo пост (content/post/название-поста-20250802.md):
```markdown
+++
title = 'Название поста'
slug = 'название-поста-20250802'
date = "2025-08-02T14:30:00"
image = 'images/post_20250802_143000_1.jpg'
+++
Основной текст поста
## Фотографии
{{< gallery dir="/images/" />}}
## Видео
{{< youtube dQw4w9WgXcQ >}}
## Локации
📍 [Посмотреть на карте](https://yandex.ru/maps/...)
{{< rawhtml >}}
{{< back-to-top >}}
{{< /rawhtml >}}
```
### Git коммиты
#### Пример коммита для поста:
```
Добавлен новый пост: Название поста
🤖 Создано через Telegram бота
```
#### Пример коммита для календаря:
```
Обновлен календарь поездок: Поездка в горы
🤖 Создано через Telegram бота
```
## Требования
- Git репозиторий должен быть настроен с правами на push
- Бот должен запускаться из корня Hugo проекта
- Необходимые Python библиотеки: `python-telegram-bot`, `requests`
+106
View File
@@ -0,0 +1,106 @@
# TODO для Telegram бота
## ✅ Выполненные задачи
- [x] **Add location input for post creation**
- ✅ Добавлен запрос направления/города при создании поста
- ✅ Новый шаг между заголовком и текстом поста
- [x] **Update image naming to match existing pattern (City-YYYYMMDD-N.jpg)**
- ✅ Изменено именование файлов с `post_timestamp_N.jpg` на `City-YYYYMMDD-N.jpg`
- ✅ Используется введенное направление и текущая дата
- [x] **Update Hugo post generation to use correct image paths**
- ✅ Обновлена генерация Hugo постов для использования правильных путей к изображениям
- ✅ Учтена новая схема именования файлов
- [x] **Create function to transliterate city names to Latin**
- ✅ Функция транслитерации с русского на латиницу
- ✅ Обработка популярных городов/направлений (30+ городов)
- ✅ Fallback для неизвестных названий
- [x] **Update post workflow to include location step**
- ✅ Изменена последовательность создания поста:
1. Заголовок
2. **Направление/город**
3. Основной текст
4. Медиафайлы
5. Публикация
## 🔄 Обновленный workflow бота
### 📝 Создание постов:
1. **Заголовок поста** - пользователь вводит название
2. **Описание для превью** - краткое описание (1-2 слова)
3. **Направление/город** - пользователь указывает локацию (Москва, Алтай, и т.д.)
4. **Основной текст** - описание поста
5. **Медиафайлы** (опционально):
- Фото с автоматическим именованием `Город-YYYYMMDD-N.jpg`
- Видео с тем же принципом именования
- YouTube ссылки
- Локации Яндекс.Карт
6. **Публикация** - создание Hugo файла и Git commit
### 📅 Управление календарём поездок:
1. **Добавить месячную поездку** - системные ежемесячные поездки (например: "Полёты в октябре 2025 года")
2. **Добавить специальную поездку** - особенные события (например: "Новогодние каникулы в горах")
3. **Удалить поездку** - удаление существующих опций из выпадающего списка
4. **Просмотреть список** - показать все текущие варианты поездок
5. **Автоматическое обновление** - изменения сразу отражаются в form на сайте
## 📝 Обновления
### Новое приветственное сообщение:
```
🤖 Добро пожаловать в бот предназначенный для загрузки контента на сайт "Пока ты спал"!
Выберите действие:
```
### Добавлено поле description:
- Отображается в Hugo front matter как `description = 'Поход'`
- Используется для превью постов
- Запрашивается после заголовка, до локации
### Новая последовательность создания поста:
1. Заголовок: "Поездка в горы Алтая"
2. **Описание: "Поход"** ← НОВОЕ
3. Локация: "Алтай" → Altai (с пояснением про организацию фото)
4. Основной текст: "Невероятная поездка..."
5. Медиафайлы и публикация
## 📸 Обновления по фото
### Упрощенная загрузка фото:
- Убран выбор качества
- Только загрузка через файл/документ для максимального качества
- Понятные сообщения об ошибках при неправильной загрузке
### Логика фото:
- **Первое фото** = главное для превью (в front matter как `image`)
- **Остальные фото** = дополнительные для галереи
- Статус указывается при добавлении каждого фото
### Текст при запросе направления:
```
Теперь введите направление/город поездки (на русском):
Это нужно для организации фото по названиям файлов.
Например: Москва, Питер, Алтай, Кавказ, Тула...
```
### Текст при загрузке фото:
```
📸 Отправьте фото как файл через Telegram:
Для сохранения качества обязательно отправляйте фото как документ/файл!
Первое фото будет главным (в превью), остальные добавятся в галерею.
```
## Текущая схема именования
Существующие файлы: `Aleksin-20210515-1.jpg`, `Altai-20220912-1.jpg`, etc.
Нужно: `Направление-YYYYMMDD-номер.jpg`
## Примеры направлений в проекте
- Aleksin, Altai, Moscow, Piter, Tula, Tver, Yaroslavl, Vladimir, Serpuhov, Dmitrov, Kalyazin
- Kavkaz, Murmansk, Kaliningrad, KBR (Кабардино-Балкария)
- Pokrov, Sergiev, Rostov, Ryazan, Spirovo
+2
View File
@@ -0,0 +1,2 @@
# Telegram Bot Configuration
TELEGRAM_BOT_TOKEN=YOUR_BOT_TOKEN_HERE
+1
View File
@@ -0,0 +1 @@
python-telegram-bot==20.7
+38
View File
@@ -0,0 +1,38 @@
#!/bin/bash
# Скрипт запуска Telegram бота
echo "🤖 Запуск Telegram бота..."
# Проверка наличия Python
if ! command -v python3 &> /dev/null; then
echo "❌ Python3 не найден. Установите Python3."
exit 1
fi
# Проверка наличия pip
if ! command -v pip3 &> /dev/null; then
echo "❌ pip3 не найден. Установите pip3."
exit 1
fi
# Установка зависимостей
echo "📦 Установка зависимостей..."
pip3 install -r requirements.txt
# Проверка переменной окружения
if [ -z "$TELEGRAM_BOT_TOKEN" ]; then
echo "⚠️ Не установлен TELEGRAM_BOT_TOKEN"
echo "Установите токен бота:"
echo "export TELEGRAM_BOT_TOKEN='ваш_токен_здесь'"
echo ""
echo "Или создайте файл .env и добавьте туда:"
echo "TELEGRAM_BOT_TOKEN=ваш_токен_здесь"
echo ""
read -p "Введите токен бота: " token
export TELEGRAM_BOT_TOKEN="$token"
fi
# Запуск бота
echo "🚀 Запуск бота..."
python3 telegram_bot.py
File diff suppressed because it is too large Load Diff
-29
View File
@@ -1,29 +0,0 @@
+++
title = 'Боголюбово'
slug = 'Bogolubovo0425'
image = 'images/Bogolubovo_20250419_1.jpg'
date = "2025-04-19T00:00:00"
description = 'Покров на Нерли'
disqus_identifier = '128'
+++
В этот раз тоже не без приключений - сразу после рассвета пошёл дождь.
Но полёты всё же состоялись.
![Bogolubovo0425](/images/Bogolubovo_20250419_2.jpg)
![Bogolubovo0425](/images/Bogolubovo_20250419_3.jpg)
![Bogolubovo0425](/images/Bogolubovo_20250419_4.jpg)
![Bogolubovo0425](/images/Bogolubovo_20250419_5.jpg)
![Bogolubovo0425](/images/Bogolubovo_20250419_6.jpg)
Локация
{{< rawhtml >}}
<script type="text/javascript" charset="utf-8" async src="https://api-maps.yandex.ru/services/constructor/1.0/js/?um=constructor%3A077367027456c82c23a26e1ea7b97af0f6394ebb07ac19ed9ac4de61eb5ecb8b&amp;width=500&amp;height=400&amp;lang=ru_RU&amp;scroll=true"></script>
{{< /rawhtml >}}
{{< rawhtml >}}
<a href="#">Вернуться в начало страницы</a>
{{< /rawhtml >}}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 878 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 760 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 931 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 755 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 KiB

-34
View File
@@ -1,34 +0,0 @@
+++
title = 'Дронослёт'
slug = 'Dronoslet'
image = 'images/Dronoslet_20240705_1.jpg'
date = "2024-06-05T00:00:00"
description = 'Дюкинский заказник'
disqus_identifier = '104'
+++
В отпуск удалось вырваться в это место - уголок Карелии во Владимирской области. Красивое место, о котором я рассказывал чуть раньше. Собиралось ехать много людей, но кто-то не смог, кто-то развернулся из-за непогоды, остались самые стойкие. И это было вознаграждено - непогода практически обошла нас стороной, полёты прошли отлично. Ну и у костра удалось посидеть не раз.
![Dronoslet](/images/Dronoslet_20240705_2.jpg)
![Dronoslet](/images/Dronoslet_20240705_3.jpg)
![Dronoslet](/images/Dronoslet_20240705_4.jpg)
![Dronoslet](/images/Dronoslet_20240705_5.jpg)
![Dronoslet](/images/Dronoslet_20240705_6.jpg)
![Dronoslet](/images/Dronoslet_20240705_7.jpg)
![Dronoslet](/images/Dronoslet_20240705_8.jpg)
{{< youtube id="53475UN_nDo" >}}
Локация
{{< rawhtml >}}
<script type="text/javascript" charset="utf-8" async src="https://api-maps.yandex.ru/services/constructor/1.0/js/?um=constructor%3A1cf4ef218b7579bd46675aea4a1e4de18da04728f79b3916a596c68cc0be915f&amp;width=500&amp;height=400&amp;lang=ru_RU&amp;scroll=true"></script>
{{< /rawhtml >}}
{{< rawhtml >}}
<a href="#">Вернуться в начало страницы</a>
{{< /rawhtml >}}
-24
View File
@@ -1,24 +0,0 @@
+++
title = 'Дюкинский заказник'
slug = 'Dukyn2504'
image = 'images/Dukyn_20250425_1.jpg'
date = "2025-04-25T00:00:00"
description = 'скалы'
disqus_identifier = '129'
+++
Очередной выезд в маленькую Карелию, Владимирская область. Скалы, лес, отличная погода и вот это вот всё. Да, ещё запускал одновременно два дрона с двух рук. Планируется выезд туда же с палатками, но можно и одним днём. Нужна погода.
![Dukyn2504](/images/Dukyn_20250425_2.jpg)
![Dukyn2504](/images/Dukyn_20250425_3.jpg)
{{< youtube id="jXGd3HZl3io" >}}
Локация
{{< rawhtml >}}
<script type="text/javascript" charset="utf-8" async src="https://api-maps.yandex.ru/services/constructor/1.0/js/?um=constructor%3A1cf4ef218b7579bd46675aea4a1e4de18da04728f79b3916a596c68cc0be915f&amp;width=500&amp;height=400&amp;lang=ru_RU&amp;scroll=true"></script>
{{< /rawhtml >}}
{{< rawhtml >}}
<a href="#">Вернуться в начало страницы</a>
{{< /rawhtml >}}
-34
View File
@@ -1,34 +0,0 @@
+++
title = 'Река Держа'
slug = 'Kanyon2505'
image = 'images/Kanyon_20250510_1.jpg'
date = "2025-05-10T00:00:00"
description = 'Тверская область'
disqus_identifier = '132'
+++
Очередной выезд выходного дня.
И снова мы находим уголки с природой Карелии, но неподалёку от Москвы.
Здесь скалы не такие величественные, как в Дюкинском заказнике, но зато есть красивые спуски к реке.
Виды по пути тоже довольно живописные.
![Kanyon2505](/images/Kanyon_20250510_2.jpg)
![Kanyon2505](/images/Kanyon_20250510_3.jpg)
![Kanyon2505](/images/Kanyon_20250510_4.jpg)
![Kanyon2505](/images/Kanyon_20250510_5.jpg)
![Kanyon2505](/images/Kanyon_20250510_6.jpg)
Видео: https://youtu.be/3dQxelsU6mg
{{< youtube id="3dQxelsU6mg" >}}
Локация
{{< rawhtml >}}
<script type="text/javascript" charset="utf-8" async src="https://api-maps.yandex.ru/services/constructor/1.0/js/?um=constructor%3Aac21325b19dad77d56c9f758269627596afac7946a7e440c11ecbd8cbbb1d4fd&amp;width=500&amp;height=400&amp;lang=ru_RU&amp;scroll=true"></script>{{< /rawhtml >}}
{{< rawhtml >}}
<a href="#">Вернуться в начало страницы</a>
{{< /rawhtml >}}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 991 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 529 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 973 KiB

-28
View File
@@ -1,28 +0,0 @@
+++
title = 'Дронослёт в Петушках'
slug = 'Petushki2505'
image = 'images/Petushki_20250517_1.jpg'
date = "2025-05-17T00:00:00"
description = 'у реки'
disqus_identifier = '131'
+++
Очередной выезд выходного дня. И снова мы находим уголки с красивой природой.
![Petushki2505](/images/Petushki_20250517_2.jpg)
![Petushki2505](/images/Petushki_20250517_3.jpg)
![Petushki2505](/images/Petushki_20250517_4.jpg)
![Petushki2505](/images/Petushki_20250517_5.jpg)
Видео https://youtu.be/4EHtC6LAdc4
{{< youtube id="4EHtC6LAdc4" >}}
Локация
{{< rawhtml >}}
<script type="text/javascript" charset="utf-8" async src="https://api-maps.yandex.ru/services/constructor/1.0/js/?um=constructor%3Af7f150eb29d1e73df06195998d412227f90211f9932890bc0acafe1cb0c734df&amp;width=500&amp;height=400&amp;lang=ru_RU&amp;scroll=true"></script>{{< /rawhtml >}}
{{< rawhtml >}}
<a href="#">Вернуться в начало страницы</a>
{{< /rawhtml >}}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 929 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 710 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 727 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 858 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 791 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1005 KiB

-31
View File
@@ -1,31 +0,0 @@
+++
title = 'Ржевский мемориал'
slug = 'Rjev2505'
image = 'images/Rjev_20251005_1.jpg'
date = "2025-05-10T00:00:00"
description = 'лето'
disqus_identifier = '133'
+++
Мемориал оставляет неизгладимое впечатление: такой возвышенный, но эхо войны витает над этим местом. Что касается съёмок - у моих друзей получились прекрасные кадры на закате, но я поехать в тот раз не смог. Соответственно так и не смог заснять подсветку, видимо надо запланировать поездку осенью.
![Rjev2505](/images/Rjev_20251005_2.jpg)
![Rjev2505](/images/Rjev_20251005_3.jpg)
![Rjev2505](/images/Rjev_20251005_4.jpg)
![Rjev2505](/images/Rjev_20251005_5.jpg)
![Rjev2505](/images/Rjev_20251005_6.jpg)
Видео: https://youtu.be/Ro0iHYZnvW8
{{< youtube id="Ro0iHYZnvW8" >}}
Локация
{{< rawhtml >}}
<script type="text/javascript" charset="utf-8" async src="https://api-maps.yandex.ru/services/constructor/1.0/js/?um=constructor%3A3aba63b3a3ffe8f92b439dc1de4508b6bdec1f3db45d77af88366a0420a998d5&amp;width=500&amp;height=400&amp;lang=ru_RU&amp;scroll=true"></script>
{{< /rawhtml >}}
{{< rawhtml >}}
<a href="#">Вернуться в начало страницы</a>
{{< /rawhtml >}}
-39
View File
@@ -1,39 +0,0 @@
+++
title = 'Усадьба Сназина'
slug = 'Snazin'
image = 'images/Snazin_20250423_1.jpg'
date = "2025-04-23T00:00:00"
description = 'на стыке времён'
disqus_identifier = '130'
+++
Поездка выходного дня.
Усадьба основана генерал–майором Иваном Сназиным в 1797 году.
Возраст усадьбы ощущается уже на подъезде к ней: малые архитектурные формы поблекли, аллеи превратились в заросли.
Сама усадьба к сожалению в довольно плачевном состоянии - снаружи конструкции частично разрушены, а внутри находиться явно небезопасно.
Собственно поэтому на помощь пришёл дрон, позволив рассмотреть усадьбу изнутри.
Тем не менее готические контуры усадьбы в сочетании со львами и памятником вождю пролетариата намекают на необычную историю.
Усадьба после смерти перешла по наследству внучке Ивана Сназина. Перестройкой усадьбы в готический замок занимался Владимир фон Гаслер, муж наследницы.
Позже в парке построили пионерский лагерь, во время Великой Отечественной войны здесь был госпиталь.
Говорят, что в усадьбе обитает привидение - якобы в пруду утопилась местная крестьянка.
Лично мы привидение не встретили, но архитектура усадьбы, окружающая природа и атмосфера места точно не оставят вас равнодушными.
![Snazin](/images/Snazin_20250423_2.jpg)
![Snazin](/images/Snazin_20250423_3.jpg)
![Snazin](/images/Snazin_20250423_4.jpg)
![Snazin](/images/Snazin_20250423_5.jpg)
{{< youtube id="PZOuu1K0zy4" >}}
Локация
{{< rawhtml >}}
<script type="text/javascript" charset="utf-8" async src="https://api-maps.yandex.ru/services/constructor/1.0/js/?um=constructor%3A6ddf36594d42b05c711e29979fe099e86b413ab0aea3e18e312057e9c70b8032&amp;width=500&amp;height=400&amp;lang=ru_RU&amp;scroll=true"></script>
{{< /rawhtml >}}
{{< rawhtml >}}
<a href="#">Вернуться в начало страницы</a>
{{< /rawhtml >}}